Dropbox への OAuth 認証 (Python)

昨日は、Python も初めて、OAuth も初めてという感じでいいかげんにプログラムを書いていたのだけれども、自分で書いていたコードがあまりに非効率なので、もう少しちゃんとできるだろうと思って、家に帰ってからハックを続けました。

やっぱり、アクセストークンは保存しておいて再利用することができるんですね。Dropbox.com にはリクエストトークンとアクセストークンをバシバシと発行要求してしまって悪いことをしてしまいました。以下に認証部分を修正したコードを書きます。

~/.dropit/auth に設定ファイルを保存しておき、もしそこにアクセストークンが含まれていなかったら、昨日の要領で要求していき、うまくアクセストークンが入手できたら ~/.dropit/auth に保存します。エラー処理はしていないので、途中で失敗したら一生 Dropbox に繋がらないかもしれません。

一旦、アクセストークンが手にはいったら ~/.dropit/auth に保存しています。

auth_config_path = posix.environ['HOME'] + "/.dropit/auth"
config = auth.Authenticator.load_config(auth_config_path)
dba = auth.Authenticator(config)

if config.has_key('access_token'):
    access_token = oauth.OAuthToken.from_string(config['access_token'])
else:
    # Request for an access token and save it in the configuration
    request_token = dba.obtain_request_token()
    authorize_url = dba.build_authorize_url(request_token)
    commands.getstatusoutput('/usr/bin/open -g ' + authorize_url)
    print 'When connection to Dropbox.com is established please push ENTER>',
    raw_input()
    access_token = dba.obtain_access_token(request_token,  config['verifier'])
    fp = open(auth_config_path, "a")
    fp.writelines('access_token = ' + access_token.to_string())
    fp.close()
    print 'Thank you.  Authorization session is complete.'

db_client = client.DropboxClient(config['server'],
        config['content_server'], 80, dba, access_token)

アクセストークンを要求しなくなったので、起動後の動作がキビキビするようになりました。

いろいろいじっているうちに、Python の面白い機能に出会いました。ひとつは、関数に属性を与えることができること。たとえば、以下のようにして、do_exit 関数が引数を取らないことを、その関数の arity 属性で示すことができました。

def do_exit():
    print 'Good bye!'
    sys.exit(0)
do_exit.arity = 0

あと、辞書を作成するための簡単な記法があったのですね。

dropbox_commands = dict(info = do_info, exit = do_exit, quit = do_exit)

みたいに書けて、昨日のバージョンよりかなり単純になりました。


Spam Protection by WP-SpamFree