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

シェアする

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

OAuth については @ITgihyo.jp の記事を読んだ。OAuthについて知らなければ目を通しておこう。

スクリプトにはいつも通り Python を使用する。ただし今回は Launchy からの投稿、すなわち Windows 環境で行う事になる。とはいっても普段使ってる Linux とはライブラリのインストールの仕方がちょっと違うだけだろう。

用意するもの
1) twitter へのアプリケーションの登録
2)

まず twitter へアプリケーションを登録する。 Twitter / Applications: Register へアクセスし、適当に項目を入力して送信する。

登録画面。結構適当で大丈夫、かな?
twitter application register

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

次にスクリプトの準備。

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 へ先ほど登録したクライアントが表示される。
twitter connections

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

#!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

シェアする

フォローする

コメント

  1. iru_ka より:

    難しい!ていうか、難しい以前にワケワカメだぁ!!
    真似出来るならしたかったけど…自分には無理ゲー杉wwww

  2. 雪子 より:

    この記事読んで、OAuth対応できました!
    ありがとうございました!

  3. soranin より:

    できました。
    ありがとうございました。

  4. ikuikuo より:

    できました。
    ありがとうございました。

  5. poko より:

    Linux(RHEL5.6)でもできました。
    ありがとうございます。

    【変更箇所】

    1 #!/usr/bin/python

    14 #consumer_key = ‘hoge’
    15 #consumer_secret = ‘fuga’
    16 #access_token = ‘foo’
    17 #access_token_secret = ‘bar’

    75 #postOAuth(“日本語てすと”)