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

2020/03/15追記
  • 本文中の「tweet_mode: "extended"を与えた場合は、textメソッドとfull_textメソッドだと空っぽの値が返ってくる」というのが現状に即していないため、修正しました
  • 参考Issuesは こちら

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

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

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

結論

第二引数にtweet_mode: "extended"を指定してツイートオブジェクトを取得し、textメソッドまたはfull_textメソッドで本文を取得する。

第二引数にtweet_mode: "extended"を指定してツイートオブジェクトを取得し、attrs[:full_text]メソッド(引数)で本文を取得する*2

実例

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

tweet_obj = @client.status(878909511007821824, { tweet_mode: "extended" })
puts tweet_obj.full_text

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

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

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

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

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

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

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

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

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

なおこの際、得られたテキストの末尾に付与されているt.coのリンク先は画像へのリンクではなく、/i/web/を含んだ URI へのリンク(ツイートへのリンク)であることも注意点です。全文取得した場合と比べて URL が異なることからそれがわかると思います。

実運用上はどうするか

tweet_mode: "extended"を付けることによるデメリットは無いでしょうから、常に付与して良いと思います*3

補足

※2020/03/15現在、以下の状況が起きるかどうかわかりませんので、いったん打消し線を入れさせていただきます

上記の方法を用いてもツイートの全文が取得できない時があります。その場合は、Twitter の公式で見ても末尾がとなっていたりしてもう手に負えません。

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

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

参考(というか答え)

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

*2:これによって media? なども正しい真偽値が返ってくる

*3:オプション設定になっているのは互換性維持のためでしょう

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

Powered by はてなブログ