読者です 読者をやめる 読者になる 読者になる

$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

Twitter API v1.1とNet::Twitter::Lite

perl tech

Twitter API v1.1完全移行まであと1ヶ月を切りましたね!対応に非常に慌てているshiba_yu36です。

どんな変更があるかはTwitter APIと開発者規約変更のインパクトまとめ:結局、Twitter API 1.1で何が変わる? 5つのポイント - @ITあたりにまとまっているとして、今日はTwitter API v1.1とperlTwitter APIを使っているとおそらく使っているNet::Twitter::Liteについて書いていきたいと思います。

Net::Twitter::Liteに関連するTwitter API変更点

今回の変更では本当に本当にいろいろ変わるのですが、Net::Twitter::Liteに関わる変更としては以下の様なものが挙げられます。ほかにもあるかもしれません。

Net::Twitter::Liteの対応状況

さておきNet::Twitter::Liteの対応状況ですが、以前 https://dev.twitter.com/blog/api-housekeepinghttps://dev.twitter.com/docs/deprecations/spring-2012 のような恐ろしいお知らせがありましたが、ここまでには対応しています。しかし、deprecatedなメソッドは残りっぱなしなので、エラーが出ていないからといってこれからも動くかどうかはわかりません。

さらに今回の大規模変更で微妙にAPIのURLが変わっていたりします。そこにはまだNet::Twitter::Liteは対応していません。大変ですね。

いろいろな対応方法

さてここからは本家で対応されていないNet::Twitter::Liteを一時的に対応させる方法について書いていきます。

http(s)://api.twitter.com/1/* -> http(s)://api.twitter.com/1.1/*

この対応は簡単です。Net::Twitter::Liteはnewの引数でapiurl, searchapiurl, search_trends_api_url, lists_api_urlを指定できるのでこれを渡せばよいでしょう。

my $twitter = Net::Twitter::Lite->new(
    apiurl                => 'http://api.twitter.com/1.1',
    searchapiurl          => 'http://api.twitter.com/1.1/search',
    search_trends_api_url => 'http://api.twitter.com/1.1',
    lists_api_url         => 'http://api.twitter.com/1.1',
);

といった具合でしょうか。path(/statuses/home_timelineみたいなもの)などが変わっていないものに関してはこれだけで動きます。

廃止されるAPIがある

廃止されるAPIを使ってしまっていた場合はそれを使うのをやめる必要があります。

代表的な例で言えばfriends_timeline(https://dev.twitter.com/docs/api/get-statusesfriends_timeline)があげられるでしょう。このメソッドはNet::Twitter::Liteには残り続けていますが、ある日突然エラーが返ってくるようになります。APIのドキュメントを漁って、このようなメソッドを使っていないか確認しましょう。

このあたりからNet::Twitter::Liteのソースをダウンロードしてlib/Net/Twitter/Lite.pmを眺めると、メソッドとURLの対応がわかるので、それを見ながら確認すると良いでしょう。

例えばfriends_timelineなら

        [ 'friends_timeline', {
            aliases         => [ qw/following_timeline/ ],
            path            => 'statuses/friends_timeline',
            method          => 'GET',
            params          => [ qw/since_id max_id count page skip_user trim_user include_entities include_rts/ ],
            required        => [ qw// ],
            add_source      => 0,
            deprecated      => 1,
            authenticate    => 1,
            booleans        => [ qw/skip_user trim_user include_entities include_rts/ ],
            base_url_method => 'apiurl',
        } ],

となっており、http://api.twitter.com/statuses/friends_timelineを使うことがわかります。そしてこのAPIの状況をhttps://dev.twitter.com/docs/api/get-statusesfriends_timeline で確認すると、home_timelineを使うようにと書いてあります。

そしてさらにlib/Net/Twitter/Lite.pmを見ると

        [ 'home_timeline', {
            aliases         => [ qw// ],
            path            => 'statuses/home_timeline',
            method          => 'GET',
            params          => [ qw/since_id max_id count page skip_user exclude_replies contributor_details include_rts include_entities trim_user include_my_retweet/ ],
            required        => [ qw// ],
            add_source      => 0,
            deprecated      => 0,
            authenticate    => 1,
            booleans        => [ qw/skip_user exclude_replies contributor_details include_rts include_entities trim_user include_my_retweet/ ],
            base_url_method => 'apiurl',
        } ],

となっているので、このhome_timelineメソッドを使えば良いことがわかります。

このようにしてdeprecatedなメソッドを置き換えて行くとよいでしょう。

pathが変わるAPIがある

さて一番やっかいなのがこのパターンです。例としてfavorites(お気に入りの一覧取得)が挙げられます。

もともとのfavoritesのドキュメントはhttps://dev.twitter.com/docs/api/1/get/favoritesです。そしてv1.1のfavoritesのドキュメントはhttps://dev.twitter.com/docs/api/1.1/get/favorites/list です。よく見ると1 -> 1.1だけでなく、/favorites.jsonから/favorites/list.jsonとpathまで変わっています。

この状態の時にとりあえず一番簡単に一時対応するにはlib/Net/Twitter/Lite.pmのコピペで凌ぐという手があります。

例えばlib/Net/Twitter/Lite.pmにおけるfavoritesの定義は

        [ 'favorites', {
            aliases         => [ qw// ],
            path            => 'favorites/:id',
            method          => 'GET',
            params          => [ qw/id page include_entities/ ],
            required        => [ qw// ],
            add_source      => 0,
            deprecated      => 0,
            authenticate    => 1,
            booleans        => [ qw/include_entities/ ],
            base_url_method => 'apiurl',
        } ],

となっているので、以下のようにpathを変えてあげればとりあえず動きます。

        [ 'favorites', {
            aliases         => [ qw// ],
            path            => 'favorites/list/:id',
            method          => 'GET',
            params          => [ qw/id page include_entities/ ],
            required        => [ qw// ],
            add_source      => 0,
            deprecated      => 0,
            authenticate    => 1,
            booleans        => [ qw/include_entities/ ],
            base_url_method => 'apiurl',
        } ],


もちろんNet::Twitter::Lite自体をちゃんと直すほうが健全なのでそうしたいところです。しかしNet::Twitter::LiteはNet::Twitterを使って動的生成されていたりといろいろややこしいところもあり、まだ手を付けられていない状況です。とりあえず凌ぐだけなら以上の方法でもなんとかなるでしょう。

まとめ

今回はNet::Twitter::LiteのTwitter API v1.1対応について述べました。いろいろ強引なところがあるので、もう少し何とかしたいところですが、かなり時間も厳しいので妥協しています。
いろいろ大変なところもあるので早く対応をおすすめします。