PythonでGoogleドライブに画像をアップロードするプログラムを作ってみました。

環境

Windows 7 Professional SP1 64bit
Python 3.6.1 (64bit)
pip 9.0.1
google-api-python-client 1.6.2
PyDrive 1.3.1

パッケージインストール

「google-api-python-client」と「PyDrive」をインストールします。

コマンドプロンプト
>pip install google-api-python-client
>pip install PyDrive

PyDriveのインストールでエラーが発生したので以下の方法で解決しました。
http://qiita.com/akabei/items/da70ebf61cc413d5ff0d

OAuthクライアントID取得

Googleドライブにアクセスするのに「クライアントID」と「クライアントシークレット」が必要になるので取得します。

Google Developers Consoleにアクセスしてプロジェクトを作成します。
https://console.developers.google.com/

aaa.png

プロジェクト名を適当に入力します。

aaa.png

認証情報から「OAuthクライアントID」を作成します。

aaa.png

「OAuthクライアントIDを作成するには、まず同意画面でサービス名を設定する必要があります。」と表示されたら同意画面を設定します。

aaa.png

OAuth同意画面から「ユーザーに表示するサービス名」を適当に入力します。

aaa.png

クライアントIDの作成が表示されたら「その他」を選択して名前を適当に入力して作成を押します。

aaa.png

これで「クライアントID」と「クライアントシークレット」が取得できます。後で使うので忘れないようにメモしておいてください。

aaa.png

または、認証情報からJSONファイルをダウンロードしましょう。JSONファイルに「クライアントID」と「クライアントシークレット」が記入されています。

aaa.png

Google Drive APIを有効にする

引き続きGoogle Developers ConsoleのライブラリからGoogle Apps APIのDrive APIを選択します。

aaa.png

以下のような画面が表示されるので「有効にする」を押してGoogle Drive APIを有効にします。

aaa.png

「有効にする」が「無効にする」に変わったらGoogle Drive APIが有効になっています。(Google Drive APIの設定は不要です)

aaa.png

これでGoogleドライブにアクセスする準備が整いました。

プログラム作成

Googleドライブに画像をアップロードするプログラム(imageupload.py)を作成します。
今回はコマンドラインから呼び出すのでCommandLineAuth()を使っています。

imageupload.py
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

gauth = GoogleAuth()
gauth.CommandLineAuth()
drive = GoogleDrive(gauth)

f = drive.CreateFile({'title': 'test.jpg', 'mimeType': 'image/jpeg'})
f.SetContentFile('test.jpg')
f.Upload()

プログラムと同じフォルダに設定ファイル(settings.yaml)を作成します。
上記で取得した「クライアントID」と「クライアントシークレット」を記入します。

settings.yaml
client_config_backend: settings
client_config:
  client_id: <クライアントID>
  client_secret: <クライアントシークレット>

save_credentials: True
save_credentials_backend: file
save_credentials_file: credentials.json

get_refresh_token: True

oauth_scope:
  - https://www.googleapis.com/auth/drive.file
  - https://www.googleapis.com/auth/drive.install

プログラムと同じフォルダに今回テストで使う画像(test.jpg)を用意します。

test.jpg

プログラム実行

コマンドプロンプトからプログラムを実行します。初回実行時は識別コード(verification code)の入力を求められるので、表示されたURLをブラウザで表示します。

コマンドプロンプト
>python imageupload.py
C:\Python36\lib\site-packages\oauth2client\_helpers.py:255: UserWarning: Cannot access credentials.json: No such file o
r directory
  warnings.warn(_MISSING_FILE_MESSAGE.format(filename))
Go to the following link in your browser:

    https://accounts.google.com/o/oauth2/auth?client_id=915107419881-unme2nu12t3d5sf10cmpudgo20jq3mtg.apps.googleuserco
ntent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.file+h
ttps%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.install&access_type=offline&response_type=code&approval_prompt=force

Enter verification code: 

プラウザにGoogleドライブへのアクセスを承認する画面が表示されるので「許可」します。

aaa.png

ブラウザに識別コードが表示されるのでコピーして先程のコマンドプロンプトに貼り付けます。

aaa.png

識別コードを貼り付けたらエンターキーを入力します。

コマンドプロンプト
Enter verification code: 4/aiZHOmoP3Ufz5Y-d8BvTFq8-IL7Do2GK7FOAAurccN4
Authentication successful.

正常に終了したらGoogleドライブに画像がアップロードされます。(2回目以降は識別コードの入力は不要です)

Googleドライブ
https://drive.google.com/drive/

aaa.png

フォルダにアップロード

Googleドライブのフォルダにアップロードするときは「フォルダID」が必要です。
ブラウザでアップロードしたいフォルダを開いて表示されたURLの最後の部分がフォルダIDです。

aaa.png

CreateFile()のパラメータにフォルダIDを指定することでそのフォルダへアップロードできます。

imageupload.py
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

gauth = GoogleAuth()
gauth.CommandLineAuth()
drive = GoogleDrive(gauth)

folder_id = '0B5fATn-vXv5wZ0RlM1JpQzdFTk0'
f = drive.CreateFile({'title': 'test.jpg',
                      'mimeType': 'image/jpeg',
                      'parents': [{'kind': 'drive#fileLink', 'id':folder_id}]})
f.SetContentFile('test.jpg')
f.Upload()

参考

以下のサイトを参考にさせていただきました。

PyDrive による Google Drive の利用
http://python.keicode.com/advanced/pydrive.php