Twitter の GIF アニメを API で取得する

プログラミング       2014年12月16日

この記事は、ヒナロエ氏(@hnle0)の Advent Calendar 2014 参加記事(7 日目)です。

2015年2月2日より API 経由での情報取得が可能になるようです。
詳細は当記事下部の 追記 にて。

というわけで

今回は、ちょっと前から Twitter にアップロードできるようになった GIF アニメを取得する方法を考えてみます。記事執筆時点(2014/12/16)では Twitter はサードパーティーのクライアント向けにはこれを公開していません。

“近いうちに”(年内とは言っていない)

現在のところ GIF を再生できるのは基本的には公式アプリだけです。(Tweetbot for iOS が対応していますが非公開アカウントでは再生できないので公式 Web をスクレイピングして取得しているものと思われます。)

公式アプリには非公式アプリと比べてリクエストなどに特権があり、その 1 つに、ツイートに対して添付される Twitter Card と呼ばれる情報を取得できるというものがあります。冒頭のヒナロエ氏のツイートは、URL が貼られている情報に追加で画像が表示されていますが、この機能が「Twitter カード」です。めんどくさいので詳細な説明は公式(Twitterカード | Twitter Developers)に譲るとして、現段階では GIF アニメはこの機能を用いて公式アプリに配信されています。

Twitter カードを取得する

公式アプリの特権を利用するにはリクエストの認証情報に公式アプリのキーを利用する必要があります。どこかで手に入れてきましょう。私は Twitter for iPhone と Twitter for Android のキーで確認しました。

このツイート(ID: 536534482828795904)の GIF 画像で試してみます。

$ curl -X GET "https://api.twitter.com/1.1/statuses/show/536534482828795904.json?cards_platform=iPhone-8&include_cards=true"

取得に必要なパラメーターは以下の通りです。

  • cards_platform: iPhone-8 / Android-10
  • include_cards: true

取得したレスポンスの結果は次のようになりました。長いので抜粋です。

{
    "id": 536534482828795904,
    "id_str": "536534482828795904",
    "text": "スクロールへの愛を感じてほしい。 http://t.co/1IMeppy5Jl",
    "card": {
        "name": "animated_gif",
        "url": "http://t.co/1IMeppy5Jl",
        "card_type_url": "https://abs.twimg.com/cards/iPhone/7/3a5617a8-3a77-35b2-840f-9bd48b81f0d3/47A315D68A13007563C81A8637B15DBB.json",
        "binding_values": {
            "player_height": {
                "type": "STRING",
                "string_value": "280"
            },
            "player_image": {
                "type": "IMAGE",
                "image_value": {
                    "url": "https://pbs.twimg.com/tweet_video_thumb/B3InRPeCAAAvmQ9.png",
                    "width": 207,
                    "height": 280
                }
            },
            "player_stream_content_type": {
                "type": "STRING",
                "string_value": "video/mp4 codecs=avc1.42E0"
            },
            "player_stream_url": {
                "type": "STRING",
                "string_value": "https://pbs.twimg.com/tweet_video/B3InRPeCAAAvmQ9.mp4"
            },
            "player_url": {
                "type": "STRING",
                "string_value": "https://pbs.twimg.com/tweet_video/B3InRPeCAAAvmQ9.mp4"
            },
            "player_width": {
                "type": "STRING",
                "string_value": "208"
            }
        },
        "card_platform": {
            "platform": {
                "device": {
                    "name": "iPhone",
                    "version": "7"
                },
                "audience": {
                    "name": "production",
                    "bucket": null
                }
            }
        }
    }
}

次のように各種情報が取得できます。

  • card.binding_values.player_url.string_value: GIF アニメ(Twitter により MP4 に変換されたファイル)
  • card.binding_values.player_image.image_value.url: PNG 形式のサムネイル

【補足】スクレイピングで取得する

非公開アカウントの GIF 画像を取得することはできませんが、Twitter の Web をスクレイピングすることでも URL を取得できます。

$ curl -X GET "https://twitter.com/java_shit/status/536534482828795904"

次の正規表現で各種情報が取得できます。

<img src=\"([a-zA-Z0-9:\\/._-]+)\" class=\"animated-gif-thumbnail\"
<source video-src=\"([a-zA-Z0-9:\\/._-]+)\" type=\"video\/mp4\"
class=\"animated-gif\" data-height=\"(\\d+)\" data-width=\"(\\d+)\"

埋め込みツイートから

埋め込みツイート API からも GIF の情報を取得できるようです。

$ curl -X GET "https://syndication.twitter.com/tweets.json?ids=536534482828795904"

得られたレスポンスを展開すると以下のように、取れないこともないといった感じです。

  <div class="media">
    
            <iframe class="autosized-media"
                    allowfullscreen
                    src="https://platform.twitter.com/video/player.html#screen_name=java_shit&amp;status_id=536534482828795904&amp;height=280&amp;placeholder=https%3A%2F%2Fpbs.twimg.com%2Ftweet_video_thumb%2FB3InRPeCAAAvmQ9.png&amp;src=https%3A%2F%2Fpbs.twimg.com%2Ftweet_video%2FB3InRPeCAAAvmQ9.mp4&amp;width=208"
                    width="208" data-width="208"
                    height="280" data-height="280"
                    title="Embedded media player"></iframe>
        
  </div>

とはいえ早く(近いうちにではなくて)サードパーティ向けに仕様公開してほしいものです……。

【追記】ようやく対応する模様

2015年1月6日の発表記事によれば、同年2月2日から REST API ならびに Streaming API の双方において、extended_entitiesフィールドで MP4 形式の GIF アニメーションが取得できるようになるようです。ようやくか………。