最近は 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'))