サイトアイコン Lonely Mobiler

OAuth を使用して Twitter へ投稿する。

最近は Launchy から twitter へ投稿しているのだけど、その時 via API となるのが気に入らなかったので、認証に OAuth を使いクライアント名を変更する事にした。ところでいつから from API じゃなくなったんだ?

OAuth については @ITgihyo.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'))

Sponsored Link
モバイルバージョンを終了