Python OAuth認証でCacoo API にアクセスする

というわけで、PythonOAuth認証を使って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>逾樣&#128;・/nickname>
  <imageUrl>https://cacoo.com/account/sinsoku/image/32x32</imageUrl>
</user>

C:\Users\sinsoku\Downloads>

nicknameは文字化けてますが、とりあえず動いています。

ただ...

これOAuthのライブラリとかを使えば、もっと簡単に書けるかもしれません。。。
とりあえず、自分用の備忘録も兼ねてブログ書いておきます。