検索してみたところ、そもそも日本語の文献が少ないのと、最新のOAuth2.0に対応している資料が少なかったので記しておきます。
作りたいアプリがデスクトップアプリでファイルの操作を行うため今回はそのためのTipsとなりますが、サーバ上のWebアプリであっても基本的には同様の使い方ができるかと思います。
本当はBox.comを利用したかったのですが、DropboxはPythonからのAPIのアクセスができるような公式のフレームワークを準備してくれていることと、BoxのAPIは後に紹介するOAuthによるユーザ認可のプロセスが自動リダイレクトを想定しているため有効期限が30秒しか無いなど、デスクトップアプリからだと著しく使いにくくなるため、ひとまずDropboxを利用することに。
1. 作成するアプリケーションの登録
https://www.dropbox.com/developers/apps
からアプリケーションの登録をします。
DatastoresというのはDropboxをDBのように使ってしまうためのAPIみたいです。通常のDropboxアプリからWindowsやMacのファイルを共有させる用途で使うのであればCore APIが必要になりますので、Files and Datastoresを選択します。
登録が終わったらアプリ名の画面に行き、登録したアプリを選択します。
するとApp keyとApp secretが表示されるので、これらを後のAPIでの利用のために控えておきましょう。
2. Dropbox API Python SDKのダウンロード
pipを使っている方は、
pip install dropbox
で入ります。ダウンロードが必要な方はこちらからダウンロード
https://www.dropbox.com/developers/core/sdks/python
Dropboxのサイトからダウンロードした場合は、いくつかのExampleも同梱されています。
余談ですが、2013年のPyCon APACに参加した際、DropboxのエンジニアによるKeynoteがあったのですが、Dropboxでは至るところにPythonを使っているらしいです。デスクトップアプリすらもPython製だとか。
3. access_tokenの取得
ユーザが初めて作成サードパーティのDropboxアプリを利用する際には、TwitterやFacebookと同じようにユーザによる認証・認可が必要になります。
2014/4/16現在ではDropbox SDKのバージョンは2.0となっており、OAuth2.0を使うのが標準となっているようです。自分がOAuthを最後に触ったのがもう数年前でOAuth1.0の頃だったのですが、OAuth2.0ではSSLによる通信を必須にすることで、access_secretを設定しなくてもよくなっているそうです。
以下にコードを示します。
まず認可するためのURLを生成して、ユーザがこのURLにブラウザからアクセスし、今回作成したアプリの利用を許可してもらったあとに表示されるコードを入力してもらう、という流れになっています。Webアプリの場合は、このコードをDropboxのサイトからのリダイレクトで渡すことができるので、ユーザによるコピー&ペーストの手間を省くことができます。これをデスクトップアプリでやろうとすると、恐らく内部にブラウザを立てる必要がありそうです。
import dropbox
APP_KEY = '上で取得したAPP_KEY'
APP_SECRET = '上で取得したAPP_SECRET'
def get_access_token_from_dropbox():
flow = dropbox.client.DropboxOAuth2FlowNoRedirect(APP_KEY, APP_SECRET)
url = flow.start()
print 'access to the url below and allow this application, then copy PIN on your browser.'
print url
print 'put PIN code here.'
pin = raw_input()
user_meta = {}
(user_meta['access_token'], user_meta['username']) = flow.finish(pin)
return user_meta
ここで取得したaccess_tokenは、今回のApp keyのアプリからのアクセスの場合使いまわすことができますので、何らかの方法で永続化しておけばよいでしょう。
4. SDKを使ってファイルをアップロードしてみる
先ほど取得したアクセストークンを使って、DropboxClientのインスタンスを作ります。
PNGファイルを一つアップロードしてみましょう。
client = dropbox.client.DropboxClient(token)
with open('hoge.png', 'rb') as f:
file_meta = client.put_file('/testtest.png', f.read(), overwrite=True)
print file_meta
非常に簡単に書けることがわかります。
参考にしたサイト
http://dkpyn.com/blog/1182

0 件のコメント:
コメントを投稿