こんにちは、ひつじ先輩です。
今回は、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
以上です。
あまりはっきりしたことが言えなくてすみません。