「モンスター社員の教科書」を作りました!

C#でTwitterアカウントを動かすサンプルコード【TLS1.2対応】

C#
当サイトはアフィリエイト広告を利用しています

こんにちは、ひつじ先輩です。

今回は、C#でTwitterBotを動かすコードを紹介します。

 

CoreTweetを利用すると、シンプルなコードでいろいろできます。

ほとんどコピペでOKです。

 

TLS1.2へ対応するよう、コードに追記しました。

詳細へは、C#でTLS1.2対応よりジャンプできます。

C#でTwitterの準備

まず、Visual StudioにCoretweetをインストールします。

方法はこちらを参考にしてください。

 

APIキーの取りかたは、こちら。

phiary
just a creator

1つ目のサイトより、情報が新しいです。

 

APIキーはあとで、TwitterのAPIを使うために必要です。

 

プロジェクト名を決めるときは「coreTweet」といった言葉を避けます。

エラーの原因になります。

System.TypeLoadExceptionの原因と簡単な対処
この記事では、System.TypeLoadExceptionという例外の原因と対処法を書きます。プロジェクトを作り直し、名前を変えてみたらうまく動きました。プロジェクト名がパッケージ名と同じだと、読み込みがうまくいかないようです。

 

C#でTwitterBot

  1. ツイートする
  2. リツイート・いいねする
  3. フォロー・リストを読込
  4. アンフォローする
  5. フォロワーリストを読込・ブロック
  6. タイムライン・リプライを読込
  7. プロフィール・画像・背景変更

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 ConsumerKey
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人と読みこむときは、コード内の、

32行目(次の20人を読みこむ)
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 name
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 3.5でも、頑張ればTLS1.2できるとあります。

バージョンアップできない場合は、見てみるのをおすすめします。

 

また、CoreTweet利用側のコードではなく、CoreTweet自体に追記する方法もあるようです。

ちょっとむずかしそうですが、選択肢として紹介しておきます。

 

  1. らっこ3 より:

    初めまして。

    本ブログ、大変参考になり私でもCoreTweetをつかったBotの作成ができそうです。

    この、CoreTweetでありますが、ダイレクトメッセージを
    送ることはできそうなのでしょうか?
    そのサンプルがございませんでしたので質問した次第です。

    とくに、グループへのダイレクトメッセージができると大変うれしいのですが。。

    もしよろしければ、ご教授いただければ幸いです。

タイトルとURLをコピーしました