Twitter API v1.0 から v1.1への中途半端な移行記

Twitter API v1.0が廃止されていました。
公開中のサイトを一刻も早くv1.1へ対応させなくてはなりません。
まだ途中ですが、備忘録を残しておきます。

目次
  1. 環境
  2. APIを使っている箇所を探す
  3. 修正時の注意点
  4. 感想

環境

APIを使っている箇所を探す

まずはWebサイトのどこでAPIを使っているのかを確認します。
Webサイトを収めたディレクトリ以下で、"twitter.com"という文字列が記述されているファイルを検索します。

$ find ~/CakePHP/app -type f -exec fgrep -l 'twitter.com' {} \;

# 正規表現が使える"grep"よりも"fgrep"のほうが速いそうです。

修正時の注意点

GET search/tweets
パラメータをつけてツイートを検索して、その結果を受け取るAPIです。
CakePHPとOAuthConsumerComponentを使った環境で、ハッシュタグ"#kirumin"を含んだツイートを20件取得したい場合は下記のようになります。

// API v1.1
$client = new OAuthClient(
'(Consumer key)',
'(Consumer secret)'
);
$json = $client->get(
'(Token key)',
'(Token secret)',
'https://api.twitter.com/1.1/search/tweets.json?count=20&q=%23kirumin'
);
$json = json_decode($json, true);
変更点
  • v1.1では検索APIでもOAuth認証が必須のようです。
  • 以前は何件取得するかのパラメータ名は"rpp"でしたが、v1.1では"count"に変更されました。

  • 返ってくるJSONの構成がだいぶ変わっています。

    • 検索にヒットしたツイートを収めた配列

      前: $json['results']

      後: $json['statuses']

    • ツイート以外の検索結果情報は"search_metadata"以下に収められました。

      【例】"max_id"の場合

      前: $json['max_id_str']

      後: $json['search_metadata']['max_id_str']

    • ツイート投稿者の情報は"user"以下に収められました。

      なお、投稿者名の"from_user"は"screen_name"に変わりました。

      【例】"from_user"の場合

      前: $json['results'][0]['from_user']

      後: $json['statuses'][0]['user']['screen_name']

    • ある検索の次のページまたは新着ページへの移動の基準が、ページ番号ではなくツイートのIDに変わりました。

      【例】新着チェック

      前: search.json?rpp=20&q=%23kirumin&page=1

      後: tweets.json?count=20q=%23kirumin&since_id=123456

      【例】次のページ

      前: $json['next_page'] ?page=2&maxid=123456&q=%23kirumin

      後: $json['search_metadata']['next_results'] ?maxid=123456&q=%23kirumin

    • 検索APIでもリツイートの元のツイートの情報を取得できるようになりました。

      $json['statuses'][0]

      ├──retweeted_status
      │  ├──created_at
      │  ├──id_str
      │  ├──retweet_count
      │  ├──text
      │  ├──user
      │  │  ├──name
      │  │  ├──screen_name
      │  │  ├──profile_image_url

その他のAPI
その他のAPIの手続きも若干変わっている箇所がありますが、検索APIに比べれば微々たるものです。

感想

自分のサイトにとっては、今回のAPIの変更は大きな衝撃でした。
検索APIリツイート元の情報を取得できるようになったのは歓迎すべきことなのですが、すでに自前でリツイートをまとめる処理を作っていたために、返ってくるJSONの構造が変わったことで大幅な修正を余儀なくされました。
簡単にできることではなさそうだったので検索APIの変更には結局対応せず、ツイート関連の機能は一旦削除してサイトを再開しました。
これを機に、このままAPIの利用を最小限にしてTwitter本家とは異なる機能だけに集中しようかと思います。