Python OAuth認証でCacoo API にアクセスする
というわけで、PythonでOAuth認証を使ってCacoo APIを試してみました。
ほとんど↓2つのソースを弄っただけですが....
アプリの登録・認証など
Cacoo - Create diagrams online Real time collaboration - APIを読んでください。
登録が完了すると、Consumer Key, Consumer Secret がページに表示されます。
AccessTokenの取得
Tweepyのgetaccesstoken.pyと使い方は同じです。
実行して、先ほど取得したConsumer Key, Consumer Secret を入力してください。
import webbrowser import tweepy """ Query the user for their consumer key/secret then attempt to fetch a valid access token. """ class CacooOAuthHandler(tweepy.OAuthHandler): def _get_oauth_url(self, endpoint, secure=False): host = 'cacoo.com' root = '/oauth/' prefix = 'https://' return prefix + host + root + endpoint def get_authorization_url(self, signin_with_twitter=False): """Get the authorization URL to redirect the user""" try: # get the request token self.request_token = self._get_request_token() # build auth request and return as url if signin_with_twitter: url = self._get_oauth_url('authenticate') else: url = self._get_oauth_url('authorize') request = tweepy.oauth.OAuthRequest.from_token_and_callback( token=self.request_token, http_url=url ) return request.to_url() except Exception, e: raise tweepy.TweepError(e) if __name__ == "__main__": consumer_key = raw_input('Consumer key: ').strip() consumer_secret = raw_input('Consumer secret: ').strip() auth = CacooOAuthHandler(consumer_key, consumer_secret) # Open authorization URL in browser webbrowser.open(auth.get_authorization_url()) # Ask user for verifier pin pin = raw_input('Verification pin number from cacoo.com: ').strip() # Get access token token = auth.get_access_token(verifier=pin) # Give user the access token print 'Access token:' print ' Key: %s' % token.key print ' Secret: %s' % token.secret
APIを呼び出してみる
Big Sky :: デスクトップアプリケーションでも認証可能なOAuth「xAuth」をpythonから試してみた。のソースとほぼ同じです。
ソース内の Key, Token, post_url を書き換えて実行すると、標準出力にXMLのデータを出力します。
from random import getrandbits from time import time import hmac, hashlib import sys import urllib import urllib2 import urlparse # build parameters to post consumer_key = 'your <consumer_key>' consumer_secret = 'your <consumer_secret' token_key = 'your <token_key>' token_secret = 'your <token_secret>' message = '' post_url = 'https://cacoo.com/api/v1/users/sinsoku.xml' params = { 'oauth_consumer_key' : consumer_key, 'oauth_signature_method' : 'HMAC-SHA1', 'oauth_timestamp' : str(int(time())), 'oauth_nonce' : str(getrandbits(64)), 'oauth_version' : '1.0', 'oauth_token' : token_key, } params['status'] = urllib.quote(message, '') params['oauth_signature'] = hmac.new( '%s&%s' % (consumer_secret, token_secret), '&'.join([ 'POST', urllib.quote(post_url, ''), urllib.quote('&'.join(['%s=%s' % (x, params[x]) for x in sorted(params)]), '') ]), hashlib.sha1).digest().encode('base64').strip() del params['status'] # post with oauth token req = urllib2.Request(post_url, data = urllib.urlencode(params)) req.add_data(urllib.urlencode({'status' : message})) req.add_header('Authorization', 'OAuth %s' % ', '.join( ['%s="%s"' % (x, urllib.quote(params[x], '')) for x in params])) # done! print urllib2.urlopen(req).read()
出力結果
C:\Users\sinsoku\Downloads>python cacootest.py <?xml version="1.0" encoding="utf-8"?> <user> <name>sinsoku</name> <nickname>逾樣€・/nickname> <imageUrl>https://cacoo.com/account/sinsoku/image/32x32</imageUrl> </user> C:\Users\sinsoku\Downloads>
nicknameは文字化けてますが、とりあえず動いています。
ただ...
これOAuthのライブラリとかを使えば、もっと簡単に書けるかもしれません。。。
とりあえず、自分用の備忘録も兼ねてブログ書いておきます。