edo1z blog

プログラミングなどに関するブログです

tweepyでtwitter apiのエラーメッセージとエラーコードを取得する

tweepyはpython用のtwitter apiを簡単に操作できるモジュールです。ただtweepyはtwitter api 1.1に対応していない為、有志の方が作成されたtweepy2をつかってます。

tweepyのエラーに関して細かい話ですがメモしておきます。

tweepyを経由してtwitter api上でエラーが発生した場合、tweepyからTweepErrorという例外が発動されます。twitterのエラーメッセージをそのまま返す場合もあれば、tweepy独自のエラーメッセージを返される場合もあります。

twitterでエラーが発生すると、理由を説明したテキストと、エラーコードが返ってきます。そのコードを確認すれば、apiの呼び出し制限をオーバーしたのか、アクセストークンが無効なのか、などが分かりますので、エラーの場合は、twitterのエラーコードを取得したいものです。

しかしながら、tweepyのTweepErrorはtwitterのエラーメッセージを全部テキスト化してしまっているようです。 例えば、下記のように適当な日本語文字列を引数に入れて、create_friendshipを呼び出してみますと、フォローできませんのでエラーになります。

try:
    #フォローする
    user = api.create_friendship('適当な日本語文字列')
except tweepy2.TweepError,e:
    print e


TweepErrorインスタンスには、reasonとresponseの2つの要素がありまして、上記の場合responseはNoneです。reasonにエラー理由が格納されています。よって、上記コードですと、TweepError例外インスタンスがeに入ってますので、下記のように例外理由を書き出してみます。

print e.reason


すると、下記のようなエラーメッセージが入っていました。しかしなんとこれはテキストでした。

[{u'message': u'Sorry, that page does not exist', u'code': 34}]


よって、上記の連想配列に直接アクセスできません。。

よって、下記のようにしました。

p = re.compile('^[{u'message': u'(.+)', u'code': (d+)}]$')
m = p.match(e.reason)
if m:
    message =  m.group(1)
    code = m.group(2)


これで、なんともスマートではありませんが、twitterのエラーメッセージとエラーコードを、上記仕様でそのままtweepyが返す場合は、取得できるようになります。