PythonでGoogleドライブに画像をアップロード

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」をインストールします。

```bat:コマンドプロンプト
>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](https://qiita-image-store.s3.amazonaws.com/0/112075/5fe423e9-9a27-6ffd-34b0-e8efd53706e9.png)

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

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/241fc92c-04fd-8610-8ca8-894f734f7af9.png)

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

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/54271487-6f0f-289f-0727-964151cd5052.png)

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

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/93ad1b52-9c6f-a261-b4f1-488f3274618c.png)

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

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/35ed01ca-68d0-c8af-9165-f76cfc0d4a83.png)

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

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/0145ce18-0f7e-d02a-97e2-f1296d7fdba9.png)

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

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/7710033c-ce16-e600-c7e9-a4c1d1ecfbd8.png)

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

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/9326637f-3597-e154-40a6-ec25992d66c9.png)

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

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/86db21e7-c0fd-0baa-fbff-b24ea1fc2b8b.png)

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

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/7e234bd7-0444-5c9a-09d9-34b1347edb8e.png)

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

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/484ed95a-8ebb-f065-1cf4-cf4cb98d4c1d.png)

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

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

```Python: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」と「クライアントシークレット」を記入します。

```yaml: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](https://qiita-image-store.s3.amazonaws.com/0/112075/c9765e0c-cba6-63cd-bc5a-3351ab19dc25.jpeg)

#プログラム実行
コマンドプロンプトからプログラムを実行します。初回実行時は識別コード(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](https://qiita-image-store.s3.amazonaws.com/0/112075/676854e8-2202-9a53-87f9-0a73c28b919a.png)

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

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/6db7cfdf-2312-620e-750c-00a2cab509c2.png)

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

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

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

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

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/5ad5b5ce-6dc7-e4cf-882a-5aff7a51349a.png)

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

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/efd15cc7-7e7c-40aa-c3de-46e96c5e6505.png)

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

```Python: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