C#からTwitterを扱えるライブラリのうち、async/awaitを使うなど面白そうなLINQtoTwitterを試してみたときのメモです。
パッケージ
NuGetで「linqtotwitter」をインストールします。
いくつか依存しているのがあったため、それらも追加されます。
認証
取得したAPIキーを使い、以下のように SingleUserAuthorizer インスタンスを取得します。
var auth = new LinqToTwitter.SingleUserAuthorizer { CredentialStore = new LinqToTwitter.SingleUserInMemoryCredentialStore { ConsumerKey = "hoge", ConsumerSecret = "fuga", AccessToken = "piyo", AccessTokenSecret = "hogera" } };
LINQ to Twitter - Documentation
ツイート
以下では、WPF上のTextBox1のテキストをツイートしています。
private async void Tweet(LinqToTwitter.SingleUserAuthorizer auth) { var context = new LinqToTwitter.TwitterContext(auth); var results = await context.TweetAsync(TextBox1.Text); }
LINQ to Twitter - Documentation
タイムラインの取得
以下では、最近の3,200件のうち "[リンゴ]" で始まるツイートを取得しています。
なお、「ToListAsync()」メソッドを使うには、usingディレクティブで「LinqToTwitter」と指定しておく必要があります。
また、最初のWhereメソッドはLinqToTwitterでツイートを抽出するために、次のWhereメソッドはLinqToTwitterで抽出したものから正規表現で絞り込むために、それぞれ使っています*1。
private async void Timeline(LinqToTwitter.SingleUserAuthorizer auth) { var reg = new System.Text.RegularExpressions.Regex(@"^\[リンゴ\]"); ulong maxID; var context = new LinqToTwitter.TwitterContext(auth); var results = new List<LinqToTwitter.Status>(); var firstResponse = await context.Status .Where(s => s.Type == LinqToTwitter.StatusType.User && s.ScreenName == "thinkAmi" && s.Count == 200) .Where(s => reg.IsMatch(s.Text)) .ToListAsync(); maxID = firstResponse.Min(r => r.StatusID) - 1; results.AddRange(firstResponse); for (int i = 0; i < 15; i++) { var response = await context.Status .Where(s => s.Type == LinqToTwitter.StatusType.User && s.ScreenName == "thinkAmi" && s.Count == 200 && s.MaxID == maxID) .Where(s => reg.IsMatch(s.Text)) .ToListAsync(); if (response.Any()) { maxID = response.Min(r => r.StatusID) - 1; results.AddRange(response); } else { break; } } MessageBox.Show(results.Count.ToString()); }
c# - Return all tweets from my timeline - Stack Overflow
全体のソースコード
Gistに上げておきました。
LINQToTwitterライブラリで、ツイートしたり、ツイートを取得するサンプル (WPFでTextBoxとButtonを使ってます)
なお、async/awaitがあるため、今回はコンソールアプリではなくWPFアプリとして作りました*2。
async/awaitと同時実行制御 | ++C++; // 未確認飛行 C ブログ
参考
async/awaitなど
*1:複数の条件をandで抽出する場合、Whereメソッドを複数にするのと、一つのWhereメソッドで&&を複数にするの、どちらが一般的なのかは分からず。stackoverflowでも併記されていたりするし。 c# - Multiple Where clauses in Lambda expressions - Stack Overflow
*2:WindowsFormでも動きます