まったりいんふぉまてぃくすめもらんだむ

主にプログラミング関係のメモに使うかもしれないしそうでないかもしれない

Pythonで自分以外のtwitterアカウントのアクセストークンを得る

以前にエントリ書いたことがあったtwitterの自分用簡易CUIクライアントを
複数アカウントに対応させようと思い立った(といっても僕のサブ垢は以前アカウントの
idを変更した後に変更前のidを確保しておいただけのもので,一応リスト管理に使っている).

クライアントの実装自体は2垢分OAuth認証を行って辞書でAPIを管理するだけなので
ここには書かないけど,タイトル通りサブ垢のアクセストークンを得るのが少し面倒だったので
メモっておく.
クライアント登録したアカウントのならdev.twitter.comで普通にもらえるんだけどね.

なお、「あるユーザAの出来る行為」に対応するトークンを発行するためには、(1)ユーザAがTwitterにログインした状態でトークン発行ページにアクセスするか、(2)ユーザAのユーザ名およびパスワードを送信してトークンを直接取得する(xAuth)必要がある。

http://blog.livedoor.jp/maraigue/archives/1109122.html

とのことで,後者が楽なんだろうけどxAuthはメールで申請したアカウントしか使えない(引用元より)らしいので前者の方法を採る.

とりあえずサブ垢のトークン得るだけが目的なので対話環境でシコシコやったけど,
ブラウザ絡むし全自動化するとなると少し面倒そう.でもまた今後同じことをやる可能性を考えると
ブラウザ使う前後に分けてスクリプトにしたほうが良かった気も……まぁいいや.

以下手順.

OAuth2ライブラリを使う.たぶんOAuthでもいい.
クライアントのコンシューマキー&シークレットを使ってRequest Token URLにアクセス.
Request Token URLや後述のAuthorize URL,Access Token URLはdev.twitter.comのクライアントの設定のところに書いてある.

import oauth2, urlparse

consumer = oauth2.Consumer(key="hoge", secret="fuga")
client = oauth2.Client(consumer)
resp, content = client.request("https://api.twitter.com/oauth/request_token", "GET")
d = dict(urlparse.parse_qsl(content))

これでcontentにoauth_tokenとoauth_token_secretが'oauth_token=hogehogehoge&oauth_token_secret=fugafugafuga&oauth_callback_confirmed=true'って感じの文字列で格納される.
これらはあとで使うので切りだして辞書に放り込んでおく.

で,とりあえずoauth_tokenの方をURLに含めてAuthorize URLにブラウザでアクセス.
このとき,あらかじめ認証したいアカウントでtwitterにログインしておくこと.
URLはこんな感じになる.

https://api.twitter.com/oauth/authorize?oauth_token=hogehogehoge

するとお馴染み(?)のアプリ認証画面が現れるので,許可.PINコードが表示される.
PINコードが得られたら,もう一度クライアントを生成して今度はAccess Token URLに
POSTでリクエストを送る.さっきのoauth_tokenやPINコードを使う.

pin = "0000000000"
token = oauth2.Token(d["oauth_token"], d["oauth_token_secret"])
client = oauth2.Client(consumer, token)
resp, content = client.request("https://api.twitter.com/oauth/access_token", 
                               "POST", body="oauth_verifier={0}".format(pin))

これでcontentにやはり先ほど同じくoauth_tokenとoauth_token_secretが文字列で格納されるので,
こいつらをクライアントに渡して完了.めんどい.

参考:OAuth を使用して Twitter へ投稿する。 | Lonely Mobiler