PythonでGoogle Driveを操作する。

pythonを実行し、Google Driveにファイルをアップロードする方法を試してみた。

# 環境
Python version:3.9.7
OS: windows 10.0
Anaconda:conda 4.11.0

# Google Cloud Platformについて
今回、 Google Cloud Platformを使用する。Google Cloud Platform（GCP）とは、Google がクラウド上で提供するサービスの総称で、その中にあるGoogle Drive APIを利用し、Google Driveを操作する。

# プログラムの実行イメージ
自分のPCで実行するプログラムからgoogle driveまでに行われるイメージをまとめてみた。
Google Driveを操作するには、Google Cloud Platform（GCP）上にプロジェクトを作成し、Google Drive APIの有効化、OAuth認証アプリの設定をする必要がある。この設定を行うと、クライアントIDが発行される。
今回試したプログラムは、setting.yamlにそのIDを記述してpython実行することで、アプリにアクセスできるようになる。このアプリを経由して、Google Driveを操作する。
<font color="Blue">※OAuth認証とは、Google Cloud PlatformにあるAPIを使い、google driveを操作するためのアクセストークンを発行することで、google drive操作の権限認可を行っている。</font>
![スクリーンショット 2022-03-02 16.05.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176158/0e54b658-f40c-a1ac-ba7b-81f4a0f3f63e.png)

## 1.1 Google Drive APIの有効化
1. [Google Cloud Platform](https://console.developers.google.com/)を開く。
2. プロジェクトの選択 -> 新しいプロジェクトを選択する。
3. プロジェクト名を入力し、作成をクリックする。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176158/290ffcea-04a6-bc4a-284c-caf10f16a817.png)
4. ライブラリ-> Google Drive APIを選択し、「有効にする」をクリック。

## 1.2 OAuth認証アプリの設定
### 1.2.1 OAuth認証画面の作成

1. OAuth同意認証 -> User Type 外部 を選択。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176158/a85e5ade-3386-a582-39df-3e4685d378c6.png)
2. アプリ名とユーザーサポートメール、ディベロッパーの連絡先情報を入力し、保存して次へを選択。
3. スコープは何も選択せず、保存して次へを選択。
4. テストユーザーも何も選択せず、保存して次へを選択。

### 1.2.2 認証情報の作成
5. APIとサービス -> 認証情報 ->上部にある+認証情報を作成 -> OAuth クライアント ID を選択。
6. アプリケーションの種類 デスクトップアプリ -> 名前　を入力し、作成を選択。 
　<font color="Blue">※クライアントID、クライアントシークレットをメモしておく。</font>
7. JSONをダウンロードする。 

### 1.2.3 アプリの公開
8. 再びOAuth同意画面に移動し、「アプリを公開」を選択。

## 2. プログラムの作成とGoogle Driveの操作
### 2.1.1 yamlの設定
1. yamlファイルを作成する。ここでは、上記で作成したOAuth認証アプリへのアクセスと1回目のプログラムを走行させたときに、credentials.jsonというファイルを生成させるための設定をしている。このファイルを生成することで、2回目以降の認証画面の省略ができる。上記で取得した、クライアント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
```

### 2.1.2 pythonプログラムの作成
pydriveをインストールし、下記のようにpythonのプログラムを作成する。
　（このプログラムは、Google drive上に新規フォルダの作成をしている。）

```create_folder.py
import pprint

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

#Googleサービスの認証
gauth = GoogleAuth()

#ユーザーから認証コードを自動的に受信しローカルWebサーバーを設定
gauth.LocalWebserverAuth()

drive = GoogleDrive(gauth)

#フォルダの作成
f_folder = drive.CreateFile({'title': 'new_folder',
                             'mimeType': 'application/vnd.google-apps.folder'})
#作成したフォルダの情報を表示
print(f_folder)

#フォルダのアップロード(google driveの最上位のディレクトリにファイルが置かれます。)
f_folder.Upload()

```

### 2.1.3 pythonプログラムの実行
3. 上記で作成したthonsettings.yamlとcreate_folder.pyを同じディレクトリに置き、プログラムを実行する。

4. webサーバー上に認証画面が出てくる。作成したアプリがアクセスを求めてくるので、チェックを入れ、続行を選択する。
　- 4の操作は、一度だけ行う。実行後、credentials.jsonというファイルが生成、省略できる。
　- webサーバー上は、The authentication flow has completed.と表示される。
　- google driveには、new_folderという名前のフォルダが作られる。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176158/e8816140-8d81-c80f-8a91-44ec62e92b22.png)

# link
今回参照したリンク。
[OAuth認証](https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733b)
[Python, PyDriveでGoogle Driveのダウンロード、アップロード、削除など](https://note.nkmk.me/python-pydrive-download-upload-delete/)