アジョブジ星通信

日常系バンザイ。

ツイートの新構造対応のメモ

これです。

CoreTweet 0.6.3API の変更には対応したのでその使い方について説明を書いておこうと思います。

1. とりあえず tweet_mode=extended をつけておく

新構造のデータを受信するには tweet_mode=extended を指定する必要があります。 CoreTweet でこれをやるには、各 API 呼び出しで、 tweet_mode 引数に TweetMode.extended を指定します。

サンプルコード

t.Statuses.HomeTimeline(tweet_mode: TweetMode.extended); // TweetMode 列挙体を使用
t.Statuses.HomeTimeline(tweet_mode => "extended"); // string で

で、このパラメータを指定すると、 text ではなく full_text フィールドにツイートの中身が入ってくるようになります。 CoreTweet では FullText プロパティになっています。

2. 新構造のツイートを分解する

Upcoming changes to Tweets | Twitter Developers の What does this look like? を見るとわかると思いますが、 full_text には表示しない前方 @ 部分と後方 URL 部分が存在します。この部分がどこなのかを取得するために display_text_range フィールド(CoreTweet では DisplayTextRange プロパティ)を使用します。このフィールドには表示するべき部分の始まりと終わりのインデックスが含まれています。

CoreTweetSupplement 1.6 では、 GetExtendedTweetElements 拡張メソッドでうまいことできるようにしました。

例としてこのツイートを分解してみましょう。


Status tweet = t.Statuses.Show(id: 736607641972023297, tweet_mode: TweetMode.extended);
ExtendedTweetInfo extended = tweet.GetExtendedTweetElements();

foreach (UserMentionEntity user in extended.HiddenPrefix)
    Console.WriteLine("Prefix: @" + user.ScreenName);

foreach (TextPart part in extended.TweetText)
    Console.WriteLine("{0}: {1}", part.Type, part.Text);

foreach (UrlEntity url in extended.HiddenSuffix)
    Console.WriteLine("Suffix: " + url.ExpandedUrl);

結果

Prefix: @azyobuzin_2
UserMention: @azyobuzin_2
Plain:  yo
Suffix: https://twitter.com/azyobuzin/status/736602881361485824

「@azyobuzin_2」が2回入っているのはテスト投稿した時のミスなので、正しい挙動です。 TweetText プロパティは EnumerateTextParts と同じ仕様で、 Tweet Entity を分解した結果が含まれています。

3. 新構造でツイートする

今までどおりツイートしても、 display_text_range を見るとリプライの @ は飛ばされているので、あれですが、新しいやり方を覚えておきましょう。 auto_populate_reply_metadata=true&in_reply_to_status_id=ツイートID でリプライになります。このときツイートの中身に @ を入れる必要はありません。

t.Statuses.Update(
    status: "ガルパンはそこそこいいぞ",
    in_reply_to_status_id: 737259526605275136,
    auto_populate_reply_metadata: true,
    tweet_mode: TweetMode.extended // これは受信用設定
);

次に、引用ツイート。これは引用ツイートの URL を attachment_url パラメータに入れます。同じく本文に入れる必要はありません。

ストリーミングはどうするの?

extended_tweet フィールドを追加してそこに追加情報入れるよと書いてありますが、まだ実施されていないようです。 CoreTweet ではこの構造に対応(ExtendedTweet プロパティ)しており、 Supplement の GetExtendedTweetElements でも対応しているので、実際に流れてきたらそのときテストします。いや、しないかもしれないので動かなかったら報告ください。