約束の地

キャロの想い出

Twitter の gem で 140 文字制限の拡張により正しくツイート情報が取得できない場合

正しいツイート情報が得られない

Twitter の仕様変更により、gem で正しいツイート情報が得られないことがあります。

そのようなツイートでは、tweet.textで得られる内容の末尾がと省略されていたり、画像が添付されているのにtweet.media?falseが返ってきたりします*1。その場合の対処方法です。

結論

第二引数にtweet_mode: "extended"を指定してツイートオブジェクトを取得し、attrs[:full_text]メソッド(引数)で本文を取得する。media?なども、tweet_mode: "extended"で取得したツイートオブジェクトに対しては正しい情報が返ってくる。

実例

正しい情報が返ってくる例

tweet_obj = @client.status(878909511007821824, tweet_mode: "extended")
puts tweet_obj.attrs[:full_text]

これで以下のように全文が返ってきます。tweet_obj.media?tweet_obj.hashtags?に対してもtrueが返ってきます。

それでは今年もありがとうございました。幻水ファンの養分の一部になれましたら幸いです。
幻水総選挙2017に関わってくださった全ての方々に感謝を込めて。

\われらに しょうりを!/

クロージングイラストご協力: @doradora4120 様 #幻水総選挙2017 https://t.co/jidpVFD8BD

正しくない情報が返ってくる例

もしtweet_mode: "extended"を指定せずにtweet_obj.textメソッドで返り値を求めると(なおtweet_obj.full_textメソッドでも同様)、次のように末尾が切れたテキストが返ってきます。画像も添付されているのにもかかわらず、media?メソッドでfalseが返ってきます。

得られたテキストの末尾に付与されているt.coのリンク先は画像へのリンクではなく、/i/web/を含んだ URI へのリンク(ツイートへのリンク)です。

それでは今年もありがとうございました。幻水ファンの養分の一部になれましたら幸いです。
幻水総選挙2017に関わってくださった全ての方々に感謝を込めて。

\われらに しょうりを!/

クロージングイラストご協力:… https://t.co/g7QOblkRYo

実運用上はどうするか

tweet_mode: "extended"を付けることによるデメリットはほぼ無いと思うので、常に付与して良いと思います*2。ただ、tweet_mode: "extended"を与えた場合は、textメソッドとfull_textメソッドだと空っぽの値が返ってくるので注意が必要です。

補足

attrs[:full_text]でも全てのツイートの内容が取得できない時があります。ただその場合は、Twitter の公式で見ても末尾がとなっていたりしてもう手に負えません。

このような場合は、まずそのような尻切れツイートであることを判別した上で、全文を構成すると思われるテキストとリンクを抽出して結合する、というめちゃくちゃ面倒くさい作業が必要だと思われます*3

あまり完璧を求めすぎるとストレスマッハです。

参考(というか答え)

*1:「ハッシュタグ」も存在しないとみなされてしまう

*2:でもあえてデフォルト設定でなくオプション設定になっているということは何か罠がありそう……

*3:実際にやっていないので分かりませんがおそらくそうでしょう

Powered by はてなブログ