[C#]CoreTweetでtwitterBot作ってみた

#０．準備・リファレンス
■C#とCoreTweetを使って簡単にTwitterへツイートするbotを作る[酢ろぐ！]
[https://blog.ch3cooh.jp/entry/20140808/1407464147](https://blog.ch3cooh.jp/entry/20140808/1407464147)

■twitterのdeveloper
[https://developer.twitter.com/](https://developer.twitter.com/)

■coreTweet リファレンス
[https://github.com/CoreTweet/CoreTweet/wiki/REST-API-を使う](https://github.com/CoreTweet/CoreTweet/wiki/REST-API-を使う)


#１．bot概要
コードはそんなに工夫したりせず実直に書いてます…（言い訳）

■bot概要：仮想通貨リップルのツイートに対して
①ツイート取得
②いいね
③リツイート
をtwitter社のAPI使用上限に引っかからないよう永遠と行うbotです。
ツイートにフィルタリング条件(アフィや広告を除外)をかけ、
クリアしたもののみツイートしてます。(ハッシュタグ数やNGワード等)

細かい詳細は…読んでください
何かの参考になればよきです

#２．まずは、メイン呼出処理部分

```C#:Main

using System;

namespace twitterBotTest
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                XrpTweetcs xrpT = new XrpTweetcs();
                xrpT.xrpTweetAsync();
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}

```

#２．XrpTweetcsクラス

###２-０．XrpTweetcsクラスのメイン

```C#:xrpTweetAsync()

       public void xrpTweetAsync()
        {
            /**************************/
            // 共通変数
            /**************************/
            long tweetCntNo = 1;
            bool keyWordFlag = true;
            String keyWord;
            tweetInfoStruc twiInfo = new tweetInfoStruc();

            try
            {
                /**************************/
                // トークンの作成
                /**************************/
                var tokens = createTwitterToken();

                //tokens.Statuses.Update(new { status = text }); // ツイート

                /**************************/
                // 検索・リツイートの繰り返し
                /**************************/
                while (true)
                {
                    /**************************/
                    // 検索
                    /**************************/

                    // 検索ワード決定
                    if (keyWordFlag)
                    {
                        keyWord = "リップル";
                        keyWordFlag = false;
                    }
                    else
                    {
                        keyWord = "XRP";
                        keyWordFlag = true;
                    }

                    // 検索実行
                    var result = tokens.Search.Tweets(count => 100, q => keyWord);

                    /**************************/
                    // リツイート実行
                    /**************************/
                    foreach (var tweet in result)
                    {
                        // つぶやき格納
                        string tweetComent = tweet.Text;

                        // コンソールに表示
                        Console.WriteLine("===Tweet【" + tweetCntNo + "】【ID:"+ tweet.Id + "】===============================================");
                        Console.WriteLine(tweetComent);

                        // カウンタ
                        tweetCntNo += 1;

                        // 対象チェック
                        if (checkTweet(tweet, keyWordFlag))
                        {
                            try
                            {
                                // リツイート
                                tokens.Statuses.Retweet(id => tweet.Id);

                                // いいね
                                tokens.Favorites.Create(id => tweet.Id);

                                Console.WriteLine("---result-------------------------------------------------------------");
                                Console.WriteLine("リツイート");
                                Console.WriteLine("=======================================================================");

                            }
                            catch(Exception e)
                            {
                                Console.WriteLine("---result-------------------------------------------------------------");
                                Console.WriteLine(e.Message);
                                Console.WriteLine("=======================================================================");
                            }

                            // コンソールに表示
                            // Console.WriteLine("{0}: {1}",
                            // tweet.User.ScreenName, tweet.Text);
                            // Console.WriteLine("---------");

                            Thread.Sleep(100000);
                        }
                        else
                        {
                            Console.WriteLine("---result-------------------------------------------------------------");
                            Console.WriteLine("スルーーーーーーーーーーー");
                            Console.WriteLine("=======================================================================");
                        }
                    }
                    Thread.Sleep(60000);
                }

            }catch(Exception e)
            {
                Console.WriteLine("*****想定外エラー******************************************************");
                Console.WriteLine(e.Message);
                Console.WriteLine("*****想定外エラー******************************************************");

                // 再帰的呼出
                xrpTweetAsync();
            }

            return;
        }
```

###２-１．トークンの取得
※本当はiniとか外だししたい・・・

```C#:createTwitterToken

        private static CoreTweet.Tokens createTwitterToken()
        {
            /**************************/
            // APIキーの設定
            /**************************/
            String APIKEY = "{API key}";
            String APIKEY_S = "{API secret}";
            String TOKEN = "{Access token}";
            String TOKEN_S = "{Access token secret}";

            /**************************/
            // トークン作成
            /**************************/
            try
            {
                var tokens = CoreTweet.Tokens.Create(APIKEY
                , APIKEY_S
                , TOKEN
                , TOKEN_S);

                return tokens;
            }
            catch (Exception e)
            {
                throw new Exception("トークンの作成に失敗しました。");
            }
        }
```

###２-２．ツイッターフィルタリング
※本当はiniとか外だししたい・・・(2回目)

```C#:checkTweet
        private bool checkTweet(Status tweet,bool keyWordFlag)
        {
            //---------------------------//
            // いいねの数
            //---------------------------//
            //if (tweet.FavoriteCount < 1)
            //{
            //    return false;
            //}

            //---------------------------//
            // 日本語
            //---------------------------//
            if (!tweet.Language.Equals("ja"))
            {
                return false;
            }

            //---------------------------//
            // タグの数
            //---------------------------//
            // タグのカウント
            HashtagEntity[] hashTags = tweet.Entities.HashTags;
            if(hashTags.Length > 2)
            {
                return false;
            }

            //---------------------------//
            // 除外タグ検索
            //---------------------------//
            foreach(var tag in hashTags)
            {
                if (tag.Text.Equals("仮想通貨") ||
                    tag.Text.Equals("ICO"))
                {
                    return false;
                }
            }

            //---------------------------//
            // 除外ワード検索
            //---------------------------//
            if (tweet.Text.Contains("プレゼント") ||
                tweet.Text.Contains("メルマガ") ||
                tweet.Text.Contains("お得") ||
                tweet.Text.Contains("最新速報") ||
                tweet.Text.Contains("仮想通貨】") ||
                tweet.Text.Contains("【仮想通貨") ||
                tweet.Text.Contains("New post:") ||
                tweet.Text.Contains("【仮想通貨") ||
                tweet.Text.Contains("謝礼") ||
                tweet.Text.Contains("放題") ||
                tweet.Text.Contains("メールアドレスを登録") ||
                tweet.Text.Contains("暗号通貨ニュース") ||
                tweet.Text.Contains("イーサリアム リップル") ||
                tweet.Text.Contains("■ノアコイン") ||
                tweet.Text.Contains("情報局") ||
                tweet.Text.Contains("GMO") ||
                tweet.Text.Contains("動画→") ||
                tweet.Text.Contains("通貨情報") ||
                tweet.Text.Contains("【XRP】") ||
                tweet.Text.Contains("【リップル】") ||
                tweet.Text.Contains("【2018年】") ||
                tweet.Text.Contains("仮想通貨サムライ") ||
                tweet.Text.Contains("底打ち記念動画") ||
                tweet.Text.Contains("最新チャート") ||
                tweet.Text.Contains("とは？") ||
                tweet.Text.Contains("新しい記事を投稿しました") ||
                tweet.Text.Contains("仮想通貨News") ||
                tweet.Text.Contains("【朗報】") ||
                tweet.Text.Contains("【悲報】") ||
                tweet.Text.Contains("応募条件") ||
                tweet.Text.Contains("仮想通貨ニュース") ||
                tweet.Text.Contains("仮想通貨速報") ||
                tweet.Text.Contains("【最速】") ||
                tweet.Text.Contains("【『リップル』") ||
                tweet.Text.Contains("【『XRP』"))
            {
                return false;
            }

            //---------------------------//
            // 除外ワード検索
            //---------------------------//
            if (tweet.Text.Contains("プレゼント"))
            {
                return false;
            }

            //---------------------------//
            // XRP検索時、本文にXRPが入っていない場合は除外
            //---------------------------//
            if (keyWordFlag && !tweet.Text.Contains("XRP"))
            {
                return false;
            }

            //---------------------------//
            // XRPが含まれているだけのリツイートは除外
            //---------------------------//
            string tweetCmnt = "";
            tweetCmnt = Regex.Replace(tweetCmnt, "RT.*:", String.Empty);

            if (keyWordFlag && !tweetCmnt.Contains("XRP"))
            {
                return false;
            }

            // 合格
            return true;
        }
```

おーわり