ツイートの新構造対応のメモ
これです。
CoreTweet 0.6.3 で API の変更には対応したのでその使い方について説明を書いておこうと思います。
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
拡張メソッドでうまいことできるようにしました。
例としてこのツイートを分解してみましょう。
@azyobuzin_2 @azyobuzin_2 yo https://t.co/IL6jyyrZng
— 悟り和イスキー膳 (@azyobuzin) May 28, 2016
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 // これは受信用設定 );
@azyobuzin ガルパンはそこそこいいぞ
— 悟り和イスキー膳 (@azyobuzin) 2016年5月30日
次に、引用ツイート。これは引用ツイートの URL を attachment_url パラメータに入れます。同じく本文に入れる必要はありません。
ストリーミングはどうするの?
extended_tweet フィールドを追加してそこに追加情報入れるよと書いてありますが、まだ実施されていないようです。 CoreTweet ではこの構造に対応(ExtendedTweet プロパティ)しており、 Supplement の GetExtendedTweetElements でも対応しているので、実際に流れてきたらそのときテストします。いや、しないかもしれないので動かなかったら報告ください。