こんにちは、ひつじ先輩です。
今回は、C#でTwitterBotを動かすコードを紹介します。
CoreTweetを利用すると、シンプルなコードでいろいろできます。
ほとんどコピペでOKです。
TLS1.2へ対応するよう、コードに追記しました。
詳細へは、C#でTLS1.2対応よりジャンプできます。
C#でTwitterの準備
まず、Visual StudioにCoretweetをインストールします。
方法はこちらを参考にしてください。
APIキーの取りかたは、こちら。
1つ目のサイトより、情報が新しいです。
APIキーはあとで、TwitterのAPIを使うために必要です。
プロジェクト名を決めるときは「coreTweet」といった言葉を避けます。
エラーの原因になります。
C#でTwitterBot
- ツイートする
- リツイート・いいねする
- フォロー・リストを読込
- アンフォローする
- フォロワーリストを読込・ブロック
- タイムライン・リプライを読込
- プロフィール・画像・背景変更
7つのサンプルコードを公開しています。
①ツイートする
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using CoreTweet; //追加してください。(Nugetからパッケージを取得) using System.Net; //追加してください。 namespace TwitterAPI { class Program { static void Main(string[] args) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; string ConsumerKey = "ConsumerKey"; string ConsumerSecret = "ConsumerSecret"; string AccessToken = "AccessToken"; string AccessSecret = "AccessSecret"; try { //認証 Tokens tokens = Tokens.Create(ConsumerKey, ConsumerSecret, AccessToken, AccessSecret); //ツイートする Status status = tokens.Statuses.Update(new { status = "ツイートのテスト。ここに書いた内容がツイートされます。" }); } catch (TwitterException e) { //CoreTweetに関するエラー。 Console.WriteLine(e.Message); //メッセージを表示する Console.ReadKey(); } catch (System.Net.WebException e) { //インターネット接続に関するエラー。 Console.WriteLine(e.Message); //メッセージを表示する Console.ReadKey(); } } } }
プロジェクトにコードをコピーしたら、7行目の、
namespace TwitterAPI
を
namespace 自分で決めた名前
に変えてください。
次に、4つのAPIキーを14行目からの、
string ConsumerSecret
string AccessToken
string AccessSecret
の右がわに書きこみます。
ここまでの説明は、あとで紹介する別のコードでも同じです。
最後に25行目の
ツイートのテスト。ここに書いた内容がツイートされます。
のところをツイートしたい内容に書きかえれば完成です。
ツイートはリツイートと合わせて、1日に2400回できます。
②リツイート・いいねする
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using CoreTweet; //追加してください。(Nugetからパッケージを取得) using System.Net; //追加してください。 namespace TwitterAPI { class Program { static void Main(string[] args) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; string ConsumerKey = "ConsumerKey"; string ConsumerSecret = "ConsumerSecret"; string AccessToken = "AccessToken"; string AccessSecret = "AccessSecret"; string URL = "https://twitter.com/baacash_/status/790236192868487168"; //リツイートしたいツイートのURL long ID = long.Parse(URL.Substring(URL.Length - 18)); //URLからIDを取り出す try { //認証 Tokens tokens = Tokens.Create(ConsumerKey, ConsumerSecret, AccessToken, AccessSecret); //ツイートを読みこむ Status status = tokens.Statuses.Show(id => ID); //リツイートする if ((bool)status.IsRetweeted == false) { //ツイートIDを使ってリツイートする tokens.Statuses.Retweet(id => ID); Console.WriteLine(URL+"をリツイートしました。"); } //いいねする if ((bool)status.IsFavorited == false) { //ツイートIDを使っていいねする status = tokens.Favorites.Create(id => ID); Console.WriteLine(URL + "をいいねしました。"); } Console.ReadKey(); } catch (TwitterException e) { //CoreTweetに関するエラー。 Console.WriteLine(e.Message); //メッセージを表示する Console.ReadKey(); } catch (System.Net.WebException e) { //インターネット接続に関するエラー。 Console.WriteLine(e.Message); //メッセージを表示する Console.ReadKey(); } } } }
19行目、string URLのところに、対象のツイートのURLを書きます。
URLから、ツイートIDを抜き出して使っています。
IDは、URL末尾の18ケタの数字です。
リツイートはツイートと合わせて、1日に2400回できます。
いいねについては、情報がありません。
おそらく、この2400回に含まれるようです。
③フォロー・リストを読込
ユーザをフォローしたり、フォローリストを読み込むコード。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using CoreTweet; //追加してください。(Nugetからパッケージを取得) using System.Net; //追加してください。 namespace TwitterAPI { class Program { static void Main(string[] args) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; string ConsumerKey = "ConsumerKey"; string ConsumerSecret = "ConsumerSecret"; string AccessToken = "AccessToken"; string AccessSecret = "AccessSecret"; string followTarget = "baacash_"; //フォローする相手のID try { //認証 Tokens tokens = Tokens.Create(ConsumerKey, ConsumerSecret, AccessToken, AccessSecret); //フォローする tokens.Friendships.Create(screen_name => followTarget); //followTargetに入っているIDのユーザをフォロー Console.WriteLine(followTarget + "をフォローしました。"); //フォローリストの読み込み Cursored<CoreTweet.User> fl = tokens.Friends.List(user_screename => tokens.ScreenName); //上から20人を読みこむ //fl = tokens.Friends.List(user_screename => tokens.ScreenName, cursor => fl.NextCursor); //次の20人を読みこむ //fl = tokens.Friends.List(user_screename => tokens.ScreenName, cursor => fl.NextCursor); //さらに20人を読みこむ Console.WriteLine("フォローリストの一番上のユーザ:" + fl[0].ScreenName); //フォローしたユーザを表示する Console.ReadKey(); } catch (TwitterException e) { //CoreTweetに関するエラー。 Console.WriteLine(e.Message); //メッセージを表示する Console.ReadKey(); } catch (System.Net.WebException e) { //インターネット接続に関するエラー。 Console.WriteLine(e.Message); //メッセージを表示する Console.ReadKey(); } } } }
19行目にフォロー相手のIDを書きます。
27行目でそのIDをフォローしています。
1日に1000回まで使うことができます。
しかし、短い時間にたくさんフォローすると凍結のおそれがあります。
新しいアカウントであれば、1日20名くらいまでなら安全なようです。
31行目でフォローリストを読みこんでいます。
1回で、20番目までのユーザをリストにいれます。
このコードでは先ほどフォローした、1番目のIDを表示しています。
40人、60人と読みこむときは、コード内の、
33行目(さらに20人を読みこむ)
のコメントアウトを外してください。
さらに読みこむこともできますが、15分に15回という制限があります。
④アンフォローする
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using CoreTweet; //追加してください。(Nugetからパッケージを取得) using System.Net; //追加してください。 namespace TwitterAPI { class Program { static void Main(string[] args) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; string ConsumerKey = "ConsumerKey"; string ConsumerSecret = "ConsumerSecret"; string AccessToken = "AccessToken"; string AccessSecret = "AccessSecret"; string unfollowTarget = "spam"; //アンフォローする相手のIDにふくまれる文字列 try { //認証 Tokens tokens = Tokens.Create(ConsumerKey, ConsumerSecret, AccessToken, AccessSecret); //フォローリストの読み込み Cursored<CoreTweet.User> fl = tokens.Friends.List(user_screename => tokens.ScreenName); //上から20人を読み込む //アンフォローする foreach (var user in fl) { if (user.ScreenName.IndexOf(unfollowTarget) != -1) { tokens.Friendships.Destroy(user.ScreenName); Console.WriteLine(user.ScreenName + "をアンフォローしました。"); } } } catch (TwitterException e) { //CoreTweetに関するエラー。 Console.WriteLine(e.Message); //メッセージを表示する Console.ReadKey(); } catch (System.Net.WebException e) { //インターネット接続に関するエラー。 Console.WriteLine(e.Message); //メッセージを表示する Console.ReadKey(); } } } }
さっきと同じように、フォローリストを読みこみます。(27行目)
リストのIDを順にチェックして、ユーザを選んでいます。(30行~)
IDに「spam」が入っているユーザをアンフォローしています。
次のコードはIDではなく、リスト上の何番目かでアンフォロー対象を選んでいます(28行目)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using CoreTweet; //追加してください。(Nugetからパッケージを取得) using System.Net; //追加してください。 namespace TwitterAPI { class Program { static void Main(string[] args) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; string ConsumerKey = "ConsumerKey"; string ConsumerSecret = "ConsumerSecret"; string AccessToken = "AccessToken"; string AccessSecret = "AccessSecret"; try { //認証 Tokens tokens = Tokens.Create(ConsumerKey, ConsumerSecret, AccessToken, AccessSecret); //フォローリストの読み込み Cursored<CoreTweet.User> fl = tokens.Friends.List(user_screename => tokens.ScreenName); //上から20人を読み込む //アンフォローする tokens.Friendships.Destroy(fl[9].ScreenName); //リストで上から10番目のユーザをアンフォロー Console.WriteLine("フォローリスト10番目のユーザ:" + fl[9].ScreenName + "をアンフォローしました。"); } catch (TwitterException e) { //CoreTweetに関するエラー。 Console.WriteLine(e.Message); //メッセージを表示する Console.ReadKey(); } catch (System.Net.WebException e) { //インターネット接続に関するエラー。 Console.WriteLine(e.Message); //メッセージを表示する Console.ReadKey(); } } } }
⑤フォロワリストを読込・ブロック
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using CoreTweet; //追加してください。(Nugetからパッケージを取得) using System.Net; //追加してください。 namespace TwitterAPI { class Program { static void Main(string[] args) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; string ConsumerKey = "ConsumerKey"; string ConsumerSecret = "ConsumerSecret"; string AccessToken = "AccessToken"; string AccessSecret = "AccessSecret"; string blockTarget = "spam"; //ブロックする相手のIDにふくまれる文字列 try { //認証 Tokens tokens = Tokens.Create(ConsumerKey, ConsumerSecret, AccessToken, AccessSecret); //フォロワーリストの読み込み Cursored<CoreTweet.User> fl = tokens.Followers.List(user_screename => tokens.ScreenName); //上から20人を読み込む //IDに"spam"をふくむユーザをブロックする foreach (var user in fl) { if (user.ScreenName.IndexOf(blockTarget) != -1) { tokens.Blocks.Create(user.ScreenName); Console.WriteLine(user.ScreenName + "をブロックしました。"); } } Console.ReadKey(); } catch (TwitterException e) { //CoreTweetに関するエラー。 Console.WriteLine(e.Message); //メッセージを表示する Console.ReadKey(); } catch (System.Net.WebException e) { //インターネット接続に関するエラー。 Console.WriteLine(e.Message); //メッセージを表示する Console.ReadKey(); } } } }
今度はフォロワーリストを読みこみます。(26行目)
IDに「spam」が入っているユーザをブロックしています。(29行目~)
次のコードは、さっきと同じでリスト上の番数でブロックしています。(28行目)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using CoreTweet; //追加してください。(Nugetからパッケージを取得) using System.Net; //追加してください。 namespace TwitterAPI { class Program { static void Main(string[] args) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; string ConsumerKey = "ConsumerKey"; string ConsumerSecret = "ConsumerSecret"; string AccessToken = "AccessToken"; string AccessSecret = "AccessSecret"; try { //認証 Tokens tokens = Tokens.Create(ConsumerKey, ConsumerSecret, AccessToken, AccessSecret); //フォロワーリストの読み込み Cursored<CoreTweet.User> fl = tokens.Followers.List(user_screename => tokens.ScreenName); //上から20人を読み込む //ブロックする tokens.Blocks.Create(fl[9].ScreenName); Console.WriteLine("フォロワーリスト10番目のユーザ:" + fl[9].ScreenName + "をブロックしました。"); Console.ReadKey(); } catch (TwitterException e) { //CoreTweetに関するエラー。 Console.WriteLine(e.Message); //メッセージを表示する Console.ReadKey(); } catch (System.Net.WebException e) { //インターネット接続に関するエラー。 Console.WriteLine(e.Message); //メッセージを表示する Console.ReadKey(); } } } }
フォロワーリストもフォローと同じやり方で、20人ずつ読みこめます。
15分に15回という制限も同じです。
⑥タイムライン・リプライを読込
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using CoreTweet; //追加してください。(Nugetからパッケージを取得) using System.Net; //追加してください。 namespace TwitterAPI { class Program { static void Main(string[] args) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; string ConsumerKey = "ConsumerKey"; string ConsumerSecret = "ConsumerSecret"; string AccessToken = "AccessToken"; string AccessSecret = "AccessSecret"; try { //認証 Tokens tokens = Tokens.Create(ConsumerKey, ConsumerSecret, AccessToken, AccessSecret); //①タイムライン(自分のアカウントのツイート)を取得 Console.WriteLine("タイムライン(自分のアカウントのツイート)を取得"); var tl = tokens.Statuses.UserTimeline(); foreach (var item in tl) Console.WriteLine(item.Text + "\n"); //間を空ける Console.WriteLine(); Console.WriteLine(); Console.WriteLine(); //②タイムライン(フォローしているユーザのツイート)を取得 Console.WriteLine("タイムライン(フォローしているユーザのツイート)を取得"); var tl2 = tokens.Statuses.HomeTimeline(include_rts => false); foreach (var item in tl2) Console.WriteLine(item.Text + "\n"); //間を空ける Console.WriteLine(); Console.WriteLine(); Console.WriteLine(); //③自分に来たリプライを取得 Console.WriteLine("自分に来たリプライを取得"); var reps = tokens.Statuses.MentionsTimeline(include_rts => true,count => 30); foreach (var item in reps) { Console.WriteLine(item.User.ScreenName); Console.WriteLine(item.Text + "\n"); } Console.ReadKey(); } catch (TwitterException e) { //CoreTweetに関するエラー。 Console.WriteLine(e.Message); //メッセージを表示する Console.ReadKey(); } catch (System.Net.WebException e) { //インターネット接続に関するエラー。 Console.WriteLine(e.Message); //メッセージを表示する Console.ReadKey(); } } } }
24行目~
自分のアカウントのツイートを読みこみます。
新しいものから20件読みこまれます。
34行目~
自分がフォローしているユーザのつぶやきを読みこみます。
「include_rts」をfalseにすると、RTは読みこまれなくなります。
44行目~
自分向けのリプライを読みこみます。
「count」を30にすると、30件読みこみます。
最大200個まで一度に読みこめます。
すべて、制限は15分に15回です。
⑦プロフィール・画像・背景変更
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; //追加してください。 using CoreTweet; //追加してください。(Nugetからパッケージを取得) using System.Net; //追加してください。 namespace TwitterAPI { class Program { static void Main(string[] args) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; string ConsumerKey = "ConsumerKey"; string ConsumerSecret = "ConsumerSecret"; string AccessToken = "AccessToken"; string AccessSecret = "AccessSecret"; string name = "名前のテスト"; //新しい"名前"を入れる string url = "https://baacash.com/system-typeloadexception"; //新しい"URL"を入れる string loc = "場所のテスト"; //新しい"場所"を入れる string bio = "はじめまして。よろしくお願いします。"; //新しいプロフィールを入れる string imagePath = "image.jpg"; //新しいプロフィール画像のファイル名を入れる string bannerPath = "banner.jpg"; //新しい背景画像のファイル名を入れる try { //認証 Tokens tokens = Tokens.Create(ConsumerKey, ConsumerSecret, AccessToken, AccessSecret); //プロフィールの更新 tokens.Account.UpdateProfile(name, url, loc, bio); //プロフィール画像の更新 tokens.Account.UpdateProfileImage(image => new FileInfo(imagePath)); //背景画像(バナー)の更新 tokens.Account.UpdateProfileBanner(banner => new FileInfo(bannerPath)); Console.ReadKey(); } catch (TwitterException e) { //CoreTweetに関するエラー。 Console.WriteLine(e.Message); //メッセージを表示する Console.ReadKey(); } catch (System.Net.WebException e) { //インターネット接続に関するエラー。 Console.WriteLine(e.Message); //メッセージを表示する Console.ReadKey(); } } } }
設定できるのは、20行目からの、
string url
string loc
string bio
string imagePath
string bannerPath
6項目あります。
コードをこのまま使うときは、変えたくないところも何か入力してください。
変えたくないところには、今の設定と同じものを入力します。
このままだと、すべての要素を設定どおりに変えるため、名前が
名前のテスト
になったりします。
また、画像ファイル名を変えないと、ファイルがないためエラーになります。
画像ファイルはexeファイルと同じフォルダに置いてください。
C#でTLS1.2対応
2019年9月追記。
Twitter APIが、TLS1.2(新しい通信プロトコル)による接続のみ可となったため、
System.Net.WebException: 接続が切断されました: 送信時に、予期しないエラーが発生しました
のようなエラーメッセージが出るようになっていました。
CoreTweetによるアクセスだけでなく、APIを使わないスクレイピングもはじかれます。
そこで、すべてのサンプルコードに、
using System.Net;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
を追記しました。
この2行を書けば、TLS1.2がデフォルトの通信プロトコルとなりエラーは解消されるはずです。
CoreTweetを使っていない場合も、同じ2行の追記で直ります。
もし解消されない場合、TLS1.2で接続に必要な
- .NET Framework 4.5 以上
- Windows 7 および Windows Server 2008 R2 以降
(引用元:.NET Framework で TLS1.1 および 1.2 を有効化する方法)
の環境となっていないかもしれないため、ご確認ください。
上記の引用元には、.NET Framework 3.5でも、頑張ればTLS1.2できるとあります。
バージョンアップできない場合は、見てみるのをおすすめします。
また、CoreTweet利用側のコードではなく、CoreTweet自体に追記する方法もあるようです。
ちょっとむずかしそうですが、選択肢として紹介しておきます。
初めまして。
本ブログ、大変参考になり私でもCoreTweetをつかったBotの作成ができそうです。
この、CoreTweetでありますが、ダイレクトメッセージを
送ることはできそうなのでしょうか?
そのサンプルがございませんでしたので質問した次第です。
とくに、グループへのダイレクトメッセージができると大変うれしいのですが。。
もしよろしければ、ご教授いただければ幸いです。
初めまして!
コメントありがとうございます。
ダイレクトメッセージですが、こちらの方法で出来そうです。
https://qiita.com/chiaki1220jp/items/edfaa47a348b91292d5a
(すでにチェック済みだったらすみません)
グループへのダイレクトメッセージについては不明でして、
少なくとも2017年時点では、できないということのようです。
https://twilog.org/takke/date-170410
以上です。
あまりはっきりしたことが言えなくてすみません。