プログラミング素人のArduino

技術屋の末端。プログラミングは専門外。 電気回路も専門外です。 コードに間違いなど見つけられたら、気軽にコメントください。 VC#、ラズパイ始めました。

CoretweetによるTwitter検索の実装

すでにTwitterに投稿するアプリは作成済みですが、
s51517765.hatenadiary.jp
s51517765.hatenadiary.jp

検索機能を実装しました。

ここからはCoretweetによるTwitter接続ができている前提です。

Twitter APIについては、
GET search/tweets — Twitter Developers
この辺に書かれているらしいですが、実際のところよく解りません。
私の英語力の問題なのか?そもそもの基本的な技術力のためか?

前回同様に、こちらを参考にさせていただきました。
blog.ch3cooh.jp

Twitter上でのグローバル検索。
tokensが有効な状態で、
var result = tokens.Search.Tweets(count => 100, q => keyword);
で検索結果を取得。
検索結果を取得すると変数"result"に値が入りますが、これは配列のようになっていて、Tweet内容のほかに、ユーザー名、言語情報(日本語か英語かなど)、時刻、ロケーション(GPS情報)などが含まれています。
このなかから必要な情報を使用します。

VSのDebugモードで一時停止すると、変数"result"の中身を確認できます。
f:id:s51517765:20170819192657p:plain
このなかの「結果ビュー」を開きます。
配列のように、Tweetが並んでいてこれが↓のコードのvalueと推測できます。
さらにこの中からUserという項目があります。
f:id:s51517765:20170819192711p:plain
これがUser情報と推測できます。
さらにこのUserを開くと"Name"と"ScreenName"がほしい変数であるとわかることができます。

foreachでvalue(個別tweet)に総当たりし、
tring scrName = value.User.ScreenName
のように取得します。
(フォルダ構造もしくはClassのようにピリオド区切りですね)
これで、ユーザーID、ユーザー名、Tweetが取得できました。
↓「電子工作」の検索結果。
f:id:s51517765:20170819192719j:plain

APIでの検索は、複数文節のKeywordを指定すると単語ごとに分割されるようです。
例えば「今日の電子工作」は「今日」and「電子工作」のような扱いになります。orかもしれないし、厳密には不明。
ただし、この論理積も厳密ではなく複数を指定しても一つしか含まれていなくても検索結果として帰ってくることがあります。
厳密に行いたいときは、C#上でTextをクローリングしマッチするかどうか判断する必要があります。

      private void TweetSearch()
        {
            //グローバル検索
            string keyword = "電子工作";
            var tokens = Tokens.Create(API_Key, API_Secret, A_Token, A_TokenSecret);
            var result = tokens.Search.Tweets(count => 100, q => keyword); 
                //countは読み込み数。指定しなければDefoultの数値が入る。
            foreach (var value in result)
            {
                string scrName = value.User.ScreenName; //@User_ID
                string name = value.User.Name; //ユーザー名
                string text = value.Text; //Tweet
                textBoxStatus.AppendText("@" + scrName.ToString() + " / " + name + System.Environment.NewLine + text + System.Environment.NewLine);
            }
        }

タイムラインの取得

 private void getTimeLine()
        {            
            var tokens = Tokens.Create(API_Key, API_Secret, A_Token, A_TokenSecret);
            var home = tokens.Statuses.HomeTimeline();
            foreach (var tweet in home)
            {
              textBoxStatus.AppendText(tweet.Text.ToString() + System.Environment.NewLine);
            }
         }

ユーザー検索

        private void UserSearch()
        {
            var tokens = Tokens.Create(API_Key, API_Secret, A_Token, A_TokenSecret);
             IEnumerable<User> matchedUsers = tokens.Users.Search(q => keyword);
            foreach (var value in matchedUsers)
            {
                string description = value.Description; //自己紹介
                string scrName = value.ScreenName; //@User_ID
                textBoxStatus.AppendText("@" + scrName.ToString() + System.Environment.NewLine + description + System.Environment.NewLine);
            }
        }

自分のTweetの取得

        private void MyTimeLine()
        {            
            var tokens = Tokens.Create(API_Key, API_Secret, A_Token, A_TokenSecret);
                var home = tokens.Statuses.UserTimeline(count => 10);
                foreach (Status status in home) 
                {
                    textBoxStatus.AppendText(status.User.ScreenName +" / " + status.Text+ System.Environment.NewLine);
                }                     
        }