5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-07-15

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

■twitterのdeveloper
https://developer.twitter.com/

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

#1.bot概要
コードはそんなに工夫したりせず実直に書いてます…(言い訳)

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

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

#2.まずは、メイン呼出処理部分

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);
            }
        }
    }
}

#2.XrpTweetcsクラス

###2-0.XrpTweetcsクラスのメイン

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;
        }

###2-1.トークンの取得
※本当はiniとか外だししたい・・・

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("トークンの作成に失敗しました。");
            }
        }

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

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;
        }

おーわり

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?