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

【Twitter4J】Twitterのエラーハンドリング方法

Twitter4JからTwitterAPIを叩くメソッドにはほぼ100%の確率でthrows TwitterExceptionが設定されています。

Twitterと通信しにいく過程、もしくは、通信した結果でエラーが発生すると原因etcが全部このクラスに詰め込まれてthrowされます。

じゃあ結局何が問題だったのかがわからないとデバッグが大変ですし、エラーの内容によって処理を分岐させたり、エラーメッセージを変えたりすることもあるでしょう。

Twitter4Jの使い方はぐぐればそれなりに見つかるんですが、TwitterExceptionから何が取れるのかを説明してる人がほとんど全くいないのと、Twitterのエラーコードが意外とややこしいので簡単に説明していきます。

Twitterから返ってくるエラーコード

Twitterから返ってくるエラーコードの一覧はDevelopersサイトで公開されています。検索するとあっさり見つかりますし、ちゃんと仔細に書かれています。更に、HTTPのレスポンスコードに関しても「どういった処理に失敗したときに返すよ」と説明してくれています。どこぞのベンダーにも見習って欲しいぐらいちゃんと書いてあります。英語だけど。

今現在だと「Updated on Tue, 2014-04-15 17:12」と書かれているので、結構頻繁にアップデートされているのかもしれません。

とりあえず今載っているものをとても雑に翻訳しておきます。

エラーコード エラーメッセージ 解説
32 ユーザーを認証できませんでした。 操作が完了できませんでした。
34 ページが見つかりませんでした。 対象のリソースが見つからなかった時に404と一緒に返します。
64 あなたのアカウントは凍結されています。 凍結されているアカウントからリクエストがきたら403と一緒に返します。
68 API v1はもう使えないのでAPI v1.1に統合してください。 API v1時代のURLにアクセスしようとしました。
88 レート制限を超えました。 リクエスト制限(訳注:いわゆるAPI制限)に到達しました。
89 Access Tokenが無効、もしくは期限切れです。 Access Tokenが間違っています。API v1.1で使われます。
92 SSLが必要です SSL通信のみが許可されているAPIです。SSLを使ってください。
130 容量オーバー(訳注:原文はOver Capacity) Twitterがてんぽってると503と一緒に返します。
131 内部エラー 不明な内部エラーが発生したら500と一緒に返します。
135 ユーザーを認証できませんでした。(訳注:エラーコード32と全く一緒のエラーメッセージなので注意) oauth_timestampがおかしい時に401と一緒に返します。(訳注:OAuth認証は仕組み上クライアント側の現在時刻を渡さなきゃいけないので、時計がずれていると認証できないことがある。)
161 今はこれ以上フォローできません。 何らかの制限に引っかかってフォローできなかった時に403と一緒に返します。
179 このステータスを見る権限がありません。 Tweetを見る権限がない時、主に鍵つきアカウントのTweetを見ようとした時に403と一緒に返します。
185 一日のTweet回数制限をオーバーしました。 Tweet回数制限に引っかかった時に403と一緒に返します。エラーメッセージとは関係なく、決められた時間内にTweetしすぎると同じエラーが発生します。
187 ステータスが重複しています。 同じ文面のTweetを投稿しようとしました。
215 認証データに誤りがあります。 一般的にAPI v1.1を使った時に、認証を求めるメソッドで誤った認証データを渡すと400と一緒に返します。
226 このリクエストは自動送信の疑いがあります。悪意ある行動から他のユーザを守るため、このアクションは実行されませんでした。 私たちはスパムや悪意ある行動を防ぐために、日々スパムフィルタを調整しています。ある条件を満たしたTweetやDMの場合、このレスポンスが返ってくることがあります。もし「これはスパムっぽいぞ」と思ったらご連絡ください。(訳注:DMにURLが含まれていると多分これが返ってくると思う。)
231 ログインを確認する必要があります。 xAuth認証しようとした時にユーザがLogin Verificationを有効にし、一時的にパスワードを生成していない時に返されます。
251 このエンドポイントは現在使用されておりません。 既に使われていないURLにアクセスしようとしました。
261 アプリケーションに書き込み権限がありません。 アプリケーションにPOST、PUT、DELETE権限がない場合に403と一緒に返されます。アプリケーションの凍結や書き込み制限についてはこちらをご覧ください。

TwitterExceptionからエラーの情報を取得する

TwitterExceptionは、HTTPのレスポンスコードと先ほど説明したTwitterのエラーコード/メッセージを所持しています。

この辺のメソッドから取得できます。

HTTPのメッセージはgetMessageで取得できます。

また、「Twitter自体が死んでる」とか「そもそもネットワークに繋がっていない」などのケースも考慮されており、以下のメソッドで調べることが出来ます。

他にもgetRateLimitStatus()からRateLimitStatusを取得することで、API制限の残数を調べることも出来ます。

まとめ

後はこれらのメソッドを使って適当に判断してください。(丸投げ)