酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

C#とCoreTweetを使って特定のキーワードを含むツイートを検索する

本記事ではC#とCoreTweetを使って、特定のキーワードを含むツイートを検索する方法を紹介します。

CoreTweetのNuGetを使った導入方法とTwitterの開発者サイトでのアプリケーション登録(アクセスキーの取得)に関しては以前紹介した「C#とCoreTweetを使って簡単にTwitterへツイートするbotを作る - 酢ろぐ!」をご覧ください。

ツイートを検索する

ツイートを検索するにはREST APIのsearch/tweetsを利用します。search/tweetsの詳細な仕様に関しては本記事の参考セクションでリンクを貼っていますのでご参照ください。

var keyword = "愛宕";

var tokens = CoreTweet.Tokens.Create("{API key}",
    "{API secret}",
    "{Access token}",
    "{Access token secret}");

var result = await tokens.Search.TweetsAsync(count => 100, q => keyword);

foreach (var tweet in result)
{
    Console.WriteLine("{0}: {1}", 
        tweet.User.ScreenName, tweet.Text);
    Console.WriteLine("---------");
}

下図は上記のサンプルコードを実行した結果です。

f:id:ch3cooh393:20150118181116p:plain

画像付きのツイートを検索する

画像付きのツイートを検索するためには、REST APIのsearch/tweetsでツイートを検索したあとにMediaを持っているかどうかで判断します*1

var keyword = "愛宕";

var tokens = CoreTweet.Tokens.Create("{API key}",
    "{API secret}",
    "{Access token}",
    "{Access token secret}");

var result = await tokens.Search.TweetsAsync(count => 100, q => keyword);
var mediaTweets = result.Where(tw => tw.Entities.Media != null);

foreach (var tweet in mediaTweets)
{
    Console.WriteLine("{0}: {1}", 
        tweet.User.ScreenName, 
        tweet.Entities.Media.First().ExpandedUrl);
    Console.WriteLine("---------");
}

下図は上記のサンプルコードを実行した結果です。

f:id:ch3cooh393:20150118183306p:plain

:(コロン)が含まれるツイートの検索で例外が発生してしまう

2015/1/29追記です。

ツイート検索には「Twitter 検索API メモ - 超自己満足プログラミング」で書かれているように特殊なオペレータが存在します。例えば「from:ch3cooh」です。ch3coohのツイートから検索してくれます。以下のサンプルコードのように書くことができます。

var result = tokens.Search.Tweets(q => "from:ch3cooh 愛宕");

執筆時点で2015/1/29時点でNuGetからダウンロードできるCoreTweet v0.4.1.NET Framework 4.5を使用しているアプリで「from:ch3cooh 愛宕」というキーワードで検索すると例外が投げられます。

型 'System.AggregateException' のハンドルされていない例外が mscorlib.dll で発生しました
追加情報:1 つ以上のエラーが発生しました。

{"リモート サーバーがエラーを返しました: (401) 許可されていません"}

原因としては「ランタイムの変更と再ターゲットの変更 - .NET Framework | Microsoft Learn」によるSystem.Uriでのエンコード処理が変更された関係のようです。CoreTweet側で修正されるのが待てない場合、「:」などのエンコードされなくなった文字列を以下のようにアプリサイドでエンコードすると良いのではないでしょうか。

var result = tokens.Search.Tweets(q => "from%3ach3cooh 愛宕");

参考

ツイートを検索するのはREST APIのsearch/tweetsを利用しました。詳しい仕様やパラメータについては以下のページを参考にしてください。

*1:ごめん…、本当にこの方法で正解なのか自信ない