10/12以降、TwitterでOAuth認証に失敗したり古いTwitter APIのエンドポイントにアクセスできなくなった件


 Twitter が流行りだしてもう数年、ボットを飼っていたりする人も多いとは思うが、今日 10/12 前後 (正確には日本時間で10/11早朝) を境に Twitter API の古いエンドポイントが削除されたため、tweet できなくなったり Twitter 側のプロフィールを取得できなくなった実装がちらほらあるかと思う。こまめに修正したりライブラリに依存している場合にはライブラリをこまめに更新していれば問題はないのだが、数年前の実装の場合はほぼこれに該当すると見ていい。

 ざっと確認した範囲だと、例えば ATND は Twitter でのログインができなくなっている。

 とりあえず今回の件のチートシートは以下。

OAuth 認証に失敗する
OAuth でトークンを取得する際にアクセスする先のホストが twitter.com になっている。これを api.twitter.com に変更する。
Twitter API にアクセスすると「Sorry, that page does not exist」が返ってくる
最初期の Twitter API を使っているのが原因。JSON で処理している場合は、Twitter API 1.1 に移行すればよい。
ただし、Twitter API 1.1 では JSON 以外の取得形式が廃止される上、すべてのメソッドで認証が必要となる。XML や RSS で処理している場合やパブリックタイムラインをアクセストークンなしで取得しているなど、1.1 に移行するには一手間かかる場合は、とりあえず Twitter API 1.0 のエンドポイントにアクセスするようにして来年 3 月までに Twitter API 1.1 にアクセスするようにする。

 かつて Twitter API のエンドポイントは、例えば、

https://twitter.com/statuses/update.json

といった形式だった。この世代に実装されたクライアントが今回の問題に該当する。

 このエンドポイントは、ホスト名の変更と Twitter API のバージョンを含む

https://api.twitter.com/1/statuses/update.json

といった形に変更された。さらに Twitter API 1.1 が導入されるにあたって、Twitter API 1.1 の場合はバージョン部分が 1.1 となり

https://api.twitter.com/1.1/statuses/update.json

となった。Twitter 1.0 と Twitter 1.1 は来年 3 月までは移行期間として併存する予定となっており、今日 10/12 まではこの 3 パターンが並立する形だったが、日本時間 12 日前後に一番最初のバージョンがないエンドポイントが削除されたらしい。これと同時に、 twitter.com ドメインでの OAuth 認証や API アクセスも不可能となった。今回の問題は、バージョンがないエンドポイントまたは twitter.com にアクセスする処理を書いている場合に発生する。

 対応としては、ベストは Twitter API 1.1 形式に移行するのが望ましい。ただし、Twitter API 1.1 は 1.0 と違い、出力形式から XML や RSS が廃止され、JSON のみとなっている。そのため、JSON を読めない処理系を使っている、JSON に対応させるための工数が結構かかる、または JSON モジュールの導入に色々な(書類上の)手続きが必要な場合、緊急対応として 1.0 形式のエンドポイントに移行すれば今までどおり XML や RSS 形式で結果を取得できる。この場合、単純にホスト名を api.twitter.com に変更した上でパスに /1/ を加えればよい。

 Twitter への投稿などはしないがユーザ認証に Twitter の OAuth のみ使っている場合で認証に失敗する場合もあるが、これについてはOAuth を投げるホスト名が古いのが原因となる。なので、OAuth リクエストを投げる先を twitter.com から api.twitter.com に変更すればよい。

 ただ、これはあくまで応急処置なので、早急に Twitter API 1.1 形式に移行しておくのが望ましいと思う。XML 前提で書かれている処理を JSON ベースで処理するように書き換えるには手間もかかるが、Twitter などの特定プラットフォームに依存するプロダクトにとっては必要コストとして割り切らざるを得ない。