読者です 読者をやめる 読者になる 読者になる

C# + LINQtoTwitter を使ってツイートしたりタイムラインを取得してみる

C#

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 ブログ


*1:複数の条件をandで抽出する場合、Whereメソッドを複数にするのと、一つのWhereメソッドで&&を複数にするの、どちらが一般的なのかは分からず。stackoverflowでも併記されていたりするし。 c# - Multiple Where clauses in Lambda expressions - Stack Overflow

*2:WindowsFormでも動きます