2010年5月16日日曜日

OAuthを使ってAndroidからPythonでTwitterに投稿する

このブログ記事をはてなブックマークに追加

以前、ASE (Android Scripting Environment)を使って「AndroidからPythonでTwitterに投稿する」という記事を書いたが、来月末にTwitterのBASIC認証が廃止されるので使えなくなる。そこで、OAuthを利用するコードに書き直してみた。最近はAndroidのtwiccaがとても使いやすいのでPythonスクリプトによるTwitterへの投稿もあまりないかもしれないが、Android端末単体でOAuthを利用したTwitterの認証ができることを示す意味でも公開することにした。

まず、「コマンドラインで動作するOAuth対応TwitterクライアントをPythonで作ってみた」という記事で用意したoauth.pyとoauthtwitter.pyをAndroid機の/sdcard/ase/scripts/ディレクトリにコピーする。これはadb pushでコピーしてもいいし、SDカードに直接コピーしてもいい。oauthtwitter.pyは一部修正してあるので上述記事の該当箇所を参照して書き直して欲しい。

次に、それらのライブラリを利用して以下のようなコードを書いた。赤字で示した認証コードの部分はTwitterのサイトのOAuthクライアント登録で取得する必要がある。

tw_oauth_ase.py

#!/usr/bin/env python # -*- coding: utf-8 -*- import os, pickle, time, android from oauthtwitter import * CONSUMER_KEY = "CONSUMER_KEY" CONSUMER_SECRET = "CONSUMER_SECRET" KEY_FILE = "/sdcard/ase/scripts/twitter_key.dat" droid = android.Android() def twitter(): if os.path.isfile(KEY_FILE): access_token = pickle.load(file(KEY_FILE)) else: tw = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET) request_token = tw.getRequestToken() authorization_url = tw.getAuthorizationURL(request_token) droid.view(authorization_url) tw = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, request_token) time.sleep(60) oauth_verifier = droid.getInput(u"What is the PIN?", u"暗証番号を入力してください")["result"].strip() access_token = tw.getAccessTokenWithPin(oauth_verifier) pickle.dump(access_token, file(KEY_FILE, "w")) return OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, access_token) def main(): tw = twitter() post = droid.getInput(u"Tweet", u"いまどうしてる?")["result"].strip() if post: tw.PostUpdate(post.encode("utf-8")) droid.makeToast(post) if __name__ == "__main__": main()

使い方は以下の通り。一番最初の起動時だけOAuthによる認証をする必要がある。

まずはASEを起動して以下の画面で先に示したtw_oauth_ase.pyを実行する。


実行させると以下のようにブラウザが起動してTwitterのOAuth認証画面が表示される。


「許可する」を選ぶと以下の画面が表示される。


表示された暗証番号をメニューボタンから「テキストを選択してコピー」を選び、番号をコピーする。ここまでの作業を一分以内に完了させる必要がある。ただし、tw_oauth_ase.pyのtime.sleep(60)の数値(秒)を設定することで完了させるまでの時間を変更することができる。


一分後に以下のダイアログボックスが表示されるので、クリップボードにコピーした暗証番号を入力する。クリップボードから入力するにはテキストエリアを長押しすれば良い。


認証作業が完了すると以下のメッセージ入力ダイアログボックスが表示される。


入力したメッセージがAndroid画面に表示され、Twitterに投稿される。次以降の起動時には最初から上記のダイアログボックスが表示され、認証作業の必要はない。

追記(2010/5/16):

twitter.pyは日本語だと140文字の半分ほどでツイートできなくなってしまうので、文字コードをutf-8、len(status)len(status.decode("utf-8"))に変更してバイトコンパイル、Android端末の/sdcard/ase/extras/にコピーして使っている。

3 コメント:

鷹之丞 さんのコメント...

またもや楽しいASEネタありがとうございます!Pythonって割と簡単に書けちゃうところがGoodですねっ!

nox さんのコメント...

OAuthを使えばこんな簡単なスクリプトでも自由にクライアント名を設定できるのがポイント高いです。
それにASEだと場所も選びませんしね。

fukuchang0203 さんのコメント...

こんにちわ,今回初めて書き込みさせて頂きます(*^_^*)♪
内容がとても斬新でいつも楽しみにブログ拝見させて頂いております。

相続税 計算