CoreTweet を使ったアプリケーション開発をザックり解説 (2/2)

CoreTweet を使ったアプリケーション開発をザックり解説 (1/2) では、 最低限接続してタイムラインを取得できる所までを扱いました。 第2回では、ツイートしたりタイムラインを取得する基本的な方法について少しだけ細かく解説します。 この回を終えれば基本的な操作はすべて完了するので、 残りの操作に関しては公式などの資料を参考にすれば利用できるでしょう。

CoreTweet を使ってツイートする

ここでは 第 1 回の内容に従って TwitterAPI の認証を済ませていることを前提にしています。 つまり Tokens には、有効なインスタンスが代入されている状態です。 ここで、あるボタンを押したとき TextBox に与えられたテキストをツイートする機能を実装します。

タイムラインに新しいツイートを投稿するには、Tokens.Statuses.UpdateAsync を利用します。 ~Async は非同期に実行するためのメソッドです。

Tokens Tokens
{
    get;
    set;
}

private async void Button_Tweet_Click(object sender, RoutedEventArgs e)
{
    if (this.Tokens == null)
    {
        this.TextBox_Tweet.Text = "You are not authorized yet.";
        return;
    }

    Status _status = await this.Tokens.Statuses.UpdateAsync
        (status => this.TextBox_Tweet.Text);
}

同期して実行する場合には、Tokens.Statuses.Update メソッドが用意されています。 また、同期の場合にはメソッドの呼び出し前の await とメソッドの修飾子の async は不要です。

詳細については公式やその他の資料を参考にして頂くとして、ここでは簡単にツイートする方法だけを示します。 ツイートする方法についてもいくつか方法がありますが、ここで紹介する方法が最もシンプルでしょう。

ラムダ式の形式で status パラメータにツイートするテキストを与えます。 ラムダ式が分からなくても、同じようにしてツイートしたいテキストを指定すれば期待した通りの動作になります。

CoreTweet を使ってタイムラインを取得する

タイムラインを取得する場合にも Tokens.Statuses を利用します。 基本的に、読み込んだり書き込んだりするときは常に使うものと考えて良いです。 ここではユーザタイムライン(=認証したユーザのタイムライン)を取得します。 ユーザタイムラインを取得するには Tokens.Statuses.UserTimeline() メソッドを利用します。

private void LoadTimeLine()
{
    foreach (Status status in this.Tokens.Statuses.UserTimeline(count => 100))
    {
        TextBlock textBlock = new TextBlock();
        textBlock.Text = "[" + status.User.ScreenName + "]" + status.Text;
        textBlock.TextWrapping = TextWrapping.WrapWithOverflow;
        this.StackPanel_TimeLine.Children.Add(textBlock);                
    }
}

ラムダ式形式でパラメータを指定することができますが、ここではパラメータについての詳細は解説しません。 パラメータの例として、count があります。count は最新のタイムラインからいくつのツイートを取得するかを決定します。 指定しないときの値は 20 で、最大 200 です。

取得したツイートは、列挙操作可能(IEnumerable)な複数の Status で与えられます。 ここでは foreach によって各ツイートを StackPanel に追加しています。

Tokens.Statuses.UserTimeLine は指定したユーザのタイムラインを取得します。 これを Tokens.Statuses.HomeTimeLine に変更すれば、認証したユーザのタイムラインを取得します。 ただし TwitterAPI の制限が UsetTimeLine と HomeTimeLine とで異なる点に注意してください。

TwitterAPI の制限

TwitterAPI を利用するとき、繰り返しアクセスすると接続を切断されることがあります。 公式ページにアクセスできる頻度 = TwitterAPI を利用することができる頻度の一覧が掲載されています。

REST API v1.1 Limits per window by resource

15 分あたりのアクセス許容回数が示されているので、これを超えて実行しないようにする必要があります。 いくらか超えてしまうことはあるでしょうが、例え故意でなくても過度にアクセスしないように注意しましょう。

ツイートに画像を追加する

基本的な操作については説明を終了しました。 ここでは応用としてツイートに画像を追加する方法を紹介します。 概要だけ簡単に解説すると、 ツイートする際に status パラメータを設定するのと同じように、新たなパラメータmedia_ids を設定します。

media_ids パラメータには、MediaUplodadResult のインスタンスを設定することができ、 これに画像ファイルの情報を埋め込むことでツイートに画像を追加することができます。

手順的には、(1)アップロードする画像の情報を用意する、(2)ツイートするときにその情報を追加する、 というようになっています。

private async void Button_Tweet_Click2(object sender, RoutedEventArgs e)
{
    if (this.Tokens == null)
    {
        this.TextBox_Tweet.Text = "You are not authorized yet.";
        return;
    }

    MediaUploadResult image = new MediaUploadResult();

    if (File.Exists(this.TextBox_ImageFilePath.Text))
    {
        image = this.Tokens.Media.Upload
            (media => new FileInfo(this.TextBox_ImageFilePath.Text));
    }

    Status _status = await this.Tokens.Statuses.UpdateAsync
        (status => this.TextBox_Tweet.Text, media_ids => image);
}

分かり易さのために MediaUploadResult の変数に image なる名前を付けました。 OpenFileDialog などを利用して、アップロードする画像ファイルのファイルパスを取得します。 取得したファイルパスから、MediaUploadReuslt のインスタンスを作ります。 Tokens.Media.Upload(media => new FileInfo(this.TextBox_ImageFilePath.Text));の形式でインスタンスを生成します。 これについては特に解説することもなく、こうするものだと覚える他にないです。 最後にツイートする際に、media_ids パラメータに MediaUploadResult のインスタンスを追加します。