Python スクリプトで Dropbox に


Python で Dropbox API のインストールができたので、サンプルファイルをいじって Dropbox.com にアクセスできるようになりました。”rm” とか、”mv” とか、”cp” とかも動くんですけれど、やばそうなので無難に ”ls” と ”info” のみを実装したファイルを紹介します。これがぼくにとって始めての Python スクリプトとなりました。リスト、辞書、lambda とか勉強になりました。なんで ”apply” なんて便利なものをなくしちまったんだ。面倒じゃないか!

”/usr/bin/open” を使ってブラウザを起動しているので、Mac OS X 以外の方は修正しないと動きません。

#!/usr/bin/python

import posix, sys, os, commands
import re
from dropbox import client, auth
import simplejson as json

place = ‘dropbox’

def login_and_authorize(authorize_url):
commands.getstatusoutput(‘/usr/bin/open -g ‘ + authorize_url)
print ‘When connection to Dropbox.com is established please push ENTER.’
raw_input()
print ‘Authorization completed. Welcome to Dropbox!’
return

def pp_json(x):
s = json.dumps(x, sort_keys=True, indent=2 * ‘ ‘)
print ‘¥n’.join([l.rstrip() for l in s.splitlines()])

# load the configuration file and make an authenticator
config = auth.Authenticator.load_config(posix.environ[‘HOME’] + “/.sakura-sync.conf”)
dba = auth.Authenticator(config)
token = dba.obtain_request_token()
login_and_authorize(dba.build_authorize_url(token))
access_token = dba.obtain_access_token(token, config[‘verifier’])
print “Access token: “, access_token

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

command_sep_re = re.compile(‘ +’)

commands = {}

def do_ls(path):
if path[-1] != ‘/’:
path = path + ‘/’
resp = db_client.metadata(place, path)
print “STATUS:”, resp.status
info = resp.data
for file in info[‘contents’]:
p = file[‘path’][len(path):]
if file[‘is_dir’]:
print (p + ‘/’)
else:
print(‘{0}, {1}’.format(p, file[‘size’]))
commands[‘ls’] = { ‘arity’: 1, ‘f’: do_ls }

def do_info():
r = db_client.account_info()
print ‘STATUS: ‘, r.status
pp_json(r.data)
commands[‘info’] = { ‘arity’: 0, ‘f’: do_info }

commands[‘exit’] = { ‘arity’: 0, ‘f’: lambda: sys.exit(0) }

while True:
print “> “,
command_line = command_sep_re.split(raw_input())
command = command_line[0].lower()

if command and commands.has_key(command):
arity = commands[command][‘arity’]
if len(command_line) > arity:
f = commands[command][‘f’]
args = command_line[1:arity+1]
print “arity = “, arity, “, len(args) = “, len(args)
if arity > 0:
f(*command_line)
else:
f()
else:
print(‘Error: {0} takes exactly {1} arguments.’.format(command, arity))
else:
print(‘Invalid command ({0})’.format(command))