OAuth を使用して Twitter へ投稿する。
最近は Launchy から twitter へ投稿しているのだけど、その時 via API となるのが気に入らなかったので、認証に OAuth を使いクライアント名を変更する事にした。ところでいつから from API じゃなくなったんだ?
OAuth については @IT や gihyo.jp の記事を読んだ。OAuthについて知らなければ目を通しておこう。
スクリプトにはいつも通り Python を使用する。ただし今回は Launchy からの投稿、すなわち Windows 環境で行う事になる。とはいっても普段使ってる Linux とはライブラリのインストールの仕方がちょっと違うだけだろう。
用意するもの
1) twitter へのアプリケーションの登録
2) simplegeo’s python-oauth2 at master – GitHub
まず twitter へアプリケーションを登録する。 Twitter / Applications: Register へアクセスし、適当に項目を入力して送信する。
登録画面。結構適当で大丈夫、かな?

登録後
“Consumer key” , “Consumer secret” , OAuth 認証用の URL を貰う。これは後で書くスクリプト内に挿入するので必要。

次にスクリプトの準備。
python-oauth2 はダウンロードして出てきた setup.py を実行する。
ちなみに python-oauth2 は httplib2 を使用するのだが、自分の環境では入っていなかったのでそれも入れる。
easy_install が入っていなければ Python Package Index : setuptools 0.6c11 からダウンロードしてインストールする。
C:\tmp\simplegeo-python-oauth2> python.exe setup.py C:\tmp\simplegeo-python-oauth2> easy_install.exe httplib2
ソースコードは下部に。
getOAuth は python-oauth のサンプルをそのまま使う。自動化とか全く考えてないです。
実行は
1)getOAuth を実行し、twitter から認証用のトークンを渡されるのでそれを使用して認証用URLへブラウザでアクセスする。
2)ブラウザ上に PIN といわれる8桁の数字が表示されるのでそれを入力する。
3)oauth_token と oauth_token_secret を返してくれるので、それをスクリプト上部の access_token,access_token_secret へ挿入する。
4)getOAuthをコメントアウト、postOAuthのコメントアウトを外して実行。
の順に行う。
OAuth の認証に成功すると、Twitter / Connections へ先ほど登録したクライアントが表示される。

投稿に成功すると、via の値が設定した値にかわるはず。

#!C:\Python25\python.exe
# -*- coding: utf-8 -*-
import sys
import urllib
import urllib2
import oauth2 as oauth
request_token_url = 'http://twitter.com/oauth/request_token'
access_token_url = 'http://twitter.com/oauth/access_token'
authorize_url = 'http://twitter.com/oauth/authorize'
post_url = 'http://twitter.com/statuses/update.xml'
consumer_key = 'hoge'
consumer_secret = 'fuga'
access_token = 'foo'
access_token_secret = 'bar'
def getOAuth():
consumer = oauth.Consumer(key=consumer_key, secret=consumer_secret)
client = oauth.Client(consumer)
resp, content = client.request(request_token_url, 'GET')
request_token = dict(parse_qsl(content))
print "Request Token:"
print " - oauth_token : %s" % request_token['oauth_token']
print " - oauth_token_secret: %s" % request_token['oauth_token_secret']
print ""
#step2
print "Go to the following link in your browser:"
print "%s?oauth_token=%s" % (authorize_url, request_token['oauth_token'])
print ""
accepted = 'n'
while accepted.lower() == 'n':
accepted = raw_input('Have you authorized me? (y/n) ')
oauth_verifier = raw_input('Wat is the PIN? ')
#step3
token = oauth.Token(request_token['oauth_token'], request_token['oauth_token_secret'])
client = oauth.Client(consumer, token)
resp, content = client.request(access_token_url, "POST", body="oauth_verifier=%s" % oauth_verifier)
access_token = dict(parse_qsl(content))
print "Access Token:"
print " - oauth_token = %s" % access_token['oauth_token']
print " - oauth_token_secret = %s" % access_token['oauth_token_secret']
print
print "You may now access protected resources using the access tokens above."
print ""
def postOAuth(message):
params = urllib.urlencode({'status': message})
consumer = oauth.Consumer(key=consumer_key, secret=consumer_secret)
token = oauth.Token(access_token, access_token_secret)
client = oauth.Client(consumer, token)
ret = client.request(post_url, "POST", params)
# python2.5 だと urlparse に入っていない様なので作成。2.6以降だと関数作る必要は無いでしょう。
def parse_qsl(url):
param = {}
for i in url.split('&'):
_p = i.split('=')
param.update({_p[0]: _p[1]})
return param
if __name__ == '__main__':
#getOAuth()
postOAuth(unicode(' '.join(sys.argv[1:]), 'cp932').encode('utf-8'))
2/15-2/21 FEB
- プログラミング
- Python でグラフ描画したりとか。
- 英語
- 瞬間英作文Part2終了。文法は大体分かってる気はするがまだ作文に時間がかかる。
- ESLpod.com
- ゲーム
- FEZ ひたすらバンク練習
ハワイアンバーガー食べた。

大塚店に行ったらハワイアンバーガーが売ってたので食べてきました。
美味しいけど普段マクド行くと100円のやつかクーポン使えるものばっかなんで高く感じますね。
matplotlib でグラフを描画する。
Python でグラフを描画するのに何が良いかなーと思って、適当にぐぐって出てきた matplotlib を使ってみる。Python にこだわらなければ Google Chart Api を使ったほうが楽かなーという気もする。
インストール
numpy が必要。
matplotlib は easy_install から入れようとしたらエラーが出たので apt で入れる。
$ sudo easy_install numpy $ sudo apt-get install python-matplotlib
とりあえずチュートリアルを実行してみる。関係ないけど最近は ipython を使う様にしてます。
$ ipython in[1]: import matplotlib.pyplot as plt in[2]: plt.plot([1,2,3]) TclError: no display name and no $DISPLAY environment variable
エラーでたし・・・
$DISPLAYにはセットしてあるしなんじゃろうと思ってぐぐったら同様の問題を発見。
Re: [Matplotlib-users] Error TclError: no display name and no $DISPLAY e
そのままコピって以下の様にした。
import matplotlib
matplotlib.use('Agg')
import pylab
matplotlib.pyplot.plot([1,2,3])
matplotlib.pyplot.savefig('test.png')
これで動いた。
サーバ上で動かしてるので show() は使用せずファイルに出力する様にしています。
これで何をしたいのかというと、先週に書いた jkl.lomo.jp » Python で Mechanize と BeautifulSoup を使用して SNS をスクレイピングする。 というエントリで取得してきたデータを折れ線グラフにプロットしたかったのだ。スクレイピングの部分は省略して、与ダメージ、キル数、デッド数をそれぞれグラフに描画してみる。
matplotlib はサンプルが多くて結構楽に作れます。今回使用したサンプルスクリプトは axes_grid example code: demo_parasite_axes2.py — Matplotlib v0.99.1.1 documentation というもの。複数のグラフを同時に一つのグラフに描画する、という事でいいのかな。
以下コード
import matplotlib
from mpl_toolkits.axes_grid.parasite_axes import SubplotHost
matplotlib.use('Agg')
import pylab
dam_player_ret = [31074, 16661, 33495, 22153, 22812, 36667, 28225, 25140, 24533, 6367, 20797, 22421, 10797, 7678, 20082, 15227, 3121, 7915, 14410, 11005, 25274, 17207, 12343, 12841, 25924, 18106, 26027, 22260, 27397, 23639, 26389, 20337, 16724, 20660]
kill_ret = [1, 0, 1, 0, 0, 2, 2, 3, 2, 0, 3, 1, 0, 1, 0, 3, 0, 2, 3, 7, 0, 1, 6, 1, 4, 2, 2, 1, 0, 0, 1, 4, 2, 0]
dead_ret = [0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 2, 2, 0, 2, 0, 0, 1, 0, 0, 1, 2, 0, 0, 2, 0, 1, 2, 2, 0, 0, 2, 1]
_len = len(dam_player_ret)
_range = range(0, _len)
fig = matplotlib.pyplot.figure(1)
host = SubplotHost(fig, 111)
par1 = host.twinx()
par2 = host.twinx()
par1.axis["right"].set_visible(True)
offset = 60, 0
new_axisline = par2.get_grid_helper().new_fixed_axis
par2.axis["right2"] = new_axisline(loc="right", axes=par2, offset=offset)
par2.axis["right2"].label.set_visible(True)
par2.axis["right2"].set_label("dead")
fig.add_axes(host)
matplotlib.pyplot.subplots_adjust(right=0.75)
host.set_xlim(0, _len)
host.set_ylim(0, 40000)
host.set_xlabel("times")
host.set_ylabel("damage")
par1.set_ylabel("kill")
p1, = host.plot(_range, dam_player_ret, label="damage")
p2, = par1.plot(_range, kill_ret, label="kill")
p3, = par1.plot(_range, dead_ret, label="dead")
par1.set_ylim(0, 20)
par2.set_ylim(0, 20)
host.legend()
host.axis["left"].label.set_color(p1.get_color())
par1.axis["right"].label.set_color(p2.get_color())
par2.axis["right2"].label.set_color(p3.get_color())
matplotlib.pyplot.draw()
matplotlib.pyplot.savefig('test.png')
以下が出力結果

こんなかんじ。
Avatar 見てきた。
とりあえず、3D難民ではなかったので一安心。
手榴弾(だったか忘れたけど)が飛んできたときに回避行動を取ったのは俺だけではないと信じたい。
