スキップしてメイン コンテンツに移動

投稿

ラベル(Twitter)が付いた投稿を表示しています

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: ...

一行でテキストに含まれるURLをすべて短縮URLに変換するPythonスクリプト

テキストに含まれるURLをすべてbit.lyの短縮URLに変換するPythonワンライナーを書いた。使用しているモジュールはre、urllib、urllib2、simplejson。コードに一行追加するだけだし、Twitterなどのメッセージを処理するのに便利だと思う。 for link in sorted(re.findall(r"(http(?:s?)\:\/\/(?!bit\.ly[\/\ ])[^\/\ ]+\/?.*?)(?:[\ <>\"\{\}\|\\\^\[\]\`]|$)", msg), reverse=True): msg = (lambda x: re.sub(re.escape(x), (lambda y: str(simplejson.loads(urllib2.urlopen("http://api.bit.ly/shorten?version=2.0.1&longUrl=%s&login= BITLY_ID &apiKey= BITLY_API_KEY " % urllib.quote(y)).read())["results"][y]["shortUrl"]))(x), msg))(link) bit.lyのAPIキーは 別途取得 しておく必要がある。 msg = u"ここのブログのURLはhttp://handasse.blogspot.com/ です。記事のURLはhttp://handasse.blogspot.com/2010/05/urlurlpython.html です。" としてURLを含むメッセージを処理すると以下のように変換される。 print msg ここのブログのURLはhttp://bit.ly/PQa9F です。記事のURLはhttp://bit.ly/cVRVu6 です。 上記のコードを展開したものが以下のコード。簡単なエラー処理を追加してある。 def bitly(x): try: data = urllib2.urlopen("http://api.bit.ly/shorten?version=2....

コマンドラインで動作するOAuth対応TwitterクライアントをPythonで作ってみた

6月末にTwitter APIのBASIC認証が終了してしまうので、OAuth対応のTwitterクライアントを作ってみることにした。とりあえず最もシンプルだと思われるコマンドラインで動作するクライアントをPythonで作成してみた。 まず、Twitterクライアントを作成する前に、Twitterのサイトで OAuthクライアントの登録 を行わなくてはならない。ここで、「アプリケーーション名」、「アプリケーションの説明」、「アプリケーションのウェブサイトURL」を記入する必要がある。また、今回はPC上で実行するクライアントで読み書きを行いたかったので、「あなたの招待状」には「送信」、"Default Accdess type"には"Read & Write"を選択した。 登録を済ますと、"Application Details"のページで"Consumer key"と"Consumer secret"が与えられるので、これを作成するアプリケーションで利用する(CONSUMER_KEY, CONSUMER_SECRET)。 次にコーディングだが、できるだけ短くシンプルに作りたかったので、Python外部モジュールの twitter 、 oauth 、 oauthtwitter を利用させてもらうことにした。ただ、 作者のページ のコードでは途中でエラーになってしまうので、 oauthtwitter.pyのOAuthApiクラスのgetAccessTokenメソッドの下に以下のgetAccessTokenWithPinメソッドを追加した。 def getAccessTokenWithPin(self, pin, url=ACCESS_TOKEN_URL): token = self._FetchUrl(url, parameters={"oauth_verifier": pin}, no_cache=True) return oauth.OAuthToken.from_string(token) 今回作成したTwitterクライアントの使い方だが、 tw.py で最新のタイムラインを表示する。取得件数...

AndroidからPythonでTwitterに投稿する

AndroidにASE (Android Scripting Environment)を入れて から楽しくてちょくちょくいじっているのだけど、Pythonに初めから twitterモジュール が入っていることに気が付いたので使ってみた。 普段はAndroid端末(HT-03A)のTwitterクライアントとして Twidroid を使っているのだけど、最初の立ち上げでタイムラインを取得しに行くのでちょっとだけ待たされる。あまり気にはならないけど、つぶやきをサクっと投稿したいだけならタイムライン取得は無駄なので、投稿専用のスクリプトを組んでみることにした。以下がそのコードだ。起動するとダイアログが出るのでつぶやきを書いて送信するだけだ。送信が完了したら画面に投稿したつぶやきが表示されて終了する。 # -*- coding: utf-8 -*- import android, twitter droid = android.Android() t = droid.getInput(u"Tweet", u"いまどうしてる?")["result"].strip() if t: api = twitter.Api(" username ", " password ") api.PostUpdate(t) droid.makeToast(t) これはすべてAndroid上でコーディングしたものだ。短いし、せいぜい数分もあれば書ける。書き終わったらそれをそのままホーム画面にショートカットアイコンとして登録すればいい。他にも、 bit.lyのAPIを使って短縮URLを実装 したり、サービスとして起動させ、特定のキーワードに引っかかったときにAndroidに通知させたり、メールを送信させたりすることも簡単だろう。やはり、スクリプトが使えるといろいろできて面白いな。

結局Pythonを使ってコマンドラインで動作するTwitterクライアントを作ってしまった

Twitterのアカウントを取ってから既に1年半になるが、活発に使っているとは言い難い。その原因の一つとして Twitterのクライアント がある。どうにも自分が利用するのにピッタリだと思うクライアントが見つからなかったのだ。そこで結局、自分の好みに合わせてコマンドライン上で動作するシンプルなTwitterクライアントをPythonで作ってしまった。しかも、ワンライナー(1行プログラム)。 最初の頃はいくつかのクライアントを使ってみたのだが、PCでの作業はシェルで行うことが多いので別のウィンドウを開きたくなかったり、Windows、Unix、MacなどのOSが変わっても同じクライアントを使いたかったり、GUIじゃなくてCUIで操作したかったり、それほど使い込むつもりがないので極力シンプルでコンパクトになっていて欲しかったり、そもそもクライアントをインストールしたくなかったりと、かなり条件を厳しく求めていたら使えるクライアントがなくなってしまい、結局、公式サイトもしくは 自分で作成した掲示板 からたまにつぶやくだけになってしまった(ただし、 Twitterfeed は利用している)。 しかし、最近になってタイムラインをよく眺めるようになり、これが結構面白いと気がついた。自分と違う考え方に触れるのは楽しい。そして、自分ももう少しつぶやいてみようかと思ったのだが、公式サイトや掲示板からのポストはいちいちブラウザを開かなくてはならず手軽だとは言い難かった。 そこで、先日、 PythonのワンライナーでTwitterを使える ようにしたこともあり、もう少し改良してそれをクライアントにすることにした。Pythonスクリプトなら、Pythonが入っていればどのOSでも動作するし、使い方はどこでも一緒で、コマンドラインでそのまま使え、タイムラインをgrepなどで簡単に選択表示できる。それに、たった1行のソースコードなので簡単に中身を確認でき、パスワード漏洩やキーロガーなどを心配しなくてもいい。 tw.py でタイムラインを取得することができ、 tw.py つぶやき tw.py つぶやき http://handasse.blogspot.com/ ブログのURLです。 tw.py "つぶやき&つぶやき" tw.py "つぶ...

PythonのワンライナーでTwitterを使う

Twitterでつぶやいたり、タイムラインを取得したりするPythonのワンライナー(1行プログラム)を作ってみた。取り敢えずWindowsで動作は確認した。Pythonさえ入っていればどこでも動くと思う。シェルやcronに組み込んだり、ウェブアプリや自作プログラムで利用したり、Python以外に必要なものがないから手軽に使えるんじゃないかな。ただ、ユーザ名とパスワードは生テキストなのでその辺は気をつけるべきかも。 まず、Twitterでつぶやくワンライナー。 python -c "import urllib,urllib2;pm=urllib2.HTTPPasswordMgrWithDefaultRealm();pm.add_password(None,'twitter.com',' username ',' password ');urllib2.install_opener(urllib2.build_opener(urllib2.HTTPBasicAuthHandler(pm)));urllib2.urlopen('http://twitter.com/statuses/update.xml',urllib.urlencode({'status':' つぶやき '.decode('cp932').encode('utf-8')}))" 次に、タイムライン取得。 simplejson を使っている。 python -c "import sys,urllib,urllib2,xml.sax.saxutils,simplejson;pm=urllib2.HTTPPasswordMgrWithDefaultRealm();pm.add_password(None,'twitter.com',' username ',' password ');urllib2.install_opener(urllib2.build_opener(urllib2.HTTPBasicAuthHandler(pm)));sys.stdout.write('...

Google App Engine: Twitter送信機能付き掲示板

先日、Google App Engineで 簡易掲示板 を作成したが、ほとんどの書き込みが自分自身の“つぶやき”であることに気がついて、これだったら Twitter にそのまま送信してもよさそうだと考え、作ることに。しかし、思ったよりも苦労したのだった。 まず最初、Twitter APIを使って以下のような実装を考えた。 import urllib, urllib2 def main(): top_url = "twitter.com" url = "twitter.com/statuses/update.xml" username = " username " password = " password " passman = urllib2.HTTPPasswordMgrWithDefaultRealm() passman.add_password(None, top_url, username, password) authhandler = urllib2.HTTPBasicAuthHandler(passman) opener = urllib2.build_opener(authhandler) urllib2.install_opener(opener) params = urllib.urlencode({"status": " つぶやき ".encode("utf-8")}) pagehandle = urllib2.urlopen("http://" + url, params) if __name__ == "__main__": main() しかし、これはurllib2でsocketを使うのでGAEの制限に引っ掛かりアウト。そこで次はネットなどで情報を集め、以下のようなurlfetchを使った実装を試みた。 url = "http://twitter.com/statuses/update.xml" payload = urllib.ur...