PythonからGoogleDriveにファイルをアップロード

PythonからGoogleDriveにファイルをアップロードするときの手順です。

## 事前準備

### 認証情報の作成

GoogleDriveのAPIを利用するために、GCP上から認証情報を作成しダウンロードする必要がある。

認証情報の作成のため、下記のURLからGCPにアクセスする。

- https://console.cloud.google.com/

認証情報は、ポータルの「GCP > 認証情報」から作成する。

![スクリーンショット 2022-11-03 18.40.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163680/e06a98da-4d24-1401-3ac2-f9526c002942.png)

認証情報画面上部の「認証情報を作成」を押下し、「OauthクライアントID」を選択する。

![スクリーンショット 2022-11-03 17.17.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163680/5f0cb361-6712-0a12-a15a-c8421cbfc4d4.png)

次の画面で、「アプリケーションの種類」に「ディスクトップアプリ」を選択する。「名前」は任意の名称を入力し、「作成」ボタンを押下する。

![スクリーンショット 2022-11-03 17.19.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163680/099a7793-a8bf-13f8-4520-cf316861640c.png)

作成が完了すると下記のような画面が表示されるので、「JSONをダウンロード」よりJsonファイルをダウンロードする。

![スクリーンショット 2022-11-03 17.21.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163680/30d65174-a614-4d16-d8a6-36cc176b70ce.png)

これで認証情報の準備が完了。ダウンロードした認証情報は、`client_secrets.json`の名称で保存しておく。

## 実装

### 必要ライブラリのインストール

GoogleDriveに接続するためのライブラリとして、`PyDrive２`を利用する。`PyDrive２`の名称の通り`PyDrive`も存在するが、そちらはもう更新されていない様子。これから新規で利用するのであれば、基本的に`PyDrive２`を使うのが良いだろう。

https://github.com/iterative/PyDrive2

`PyDrive２`のインストールのために下記のコマンドを実行する。

```sh
pip install PyDrive2
```

### `settings.yaml`の準備

認証情報に関する情報を`settings.yaml`に記載する。

```yaml
client_config_file: client_secrets.json

save_credentials: True
save_credentials_backend: file
save_credentials_file: saved_credentials.json

get_refresh_token: True
```

### アップロードスクリプトの作成

```python:
import os

from pydrive2.auth import GoogleAuth
from pydrive2.drive import GoogleDrive


class GoogleDriveFacade:
    
    def __init__(self, setting_path: str='settings.yaml'):
        gauth = GoogleAuth(setting_path)
        gauth.LocalWebserverAuth()

        self.drive = GoogleDrive(gauth)

    def create_folder(self, folder_name):
        ret = self.check_files(folder_name)
        if ret:
            folder = ret
            print(f"{folder['title']}: exists")
        else:   
            folder = self.drive.CreateFile(
                {
                    'title': folder_name,
                    'mimeType': 'application/vnd.google-apps.folder'
                }
            )
            folder.Upload()

        return folder

    def check_files(self, folder_name,):
        query = f'title = "{os.path.basename(folder_name)}"'

        list = self.drive.ListFile({'q': query}).GetList()
        if len(list)> 0:
            return list[0]
        return False

    def upload(self, 
               local_file_path: str,
               save_folder_name: str = 'sample',
               is_convert : bool=True,
        ):
        
        if save_folder_name:
            folder = self.create_folder(save_folder_name)
        
        file = self.drive.CreateFile(
            {
                'title':os.path.basename(local_file_path),
                'parents': [
                    {'id': folder["id"]}
                ]
            }
        )
        file.SetContentFile(local_file_path)
        file.Upload({'convert': is_convert})
        
        drive_url = f"https://drive.google.com/uc?id={str( file['id'] )}" 
        return drive_url
    
        
if __name__ == "__main__":
    g = GoogleDriveFacade()
    g.upload(
        local_file_path='hoge.txt',
        save_folder_name="test",
        is_convert=True,
    )

```

### 動作確認

アップロード用に`hoge.txt`を作成し、マイドライブの`test`フォルダにアップロードしてみる。

```sh:
echo "Hello World" > hoge.txt
python main.py
```

初回実行時は下記のようなOAuth認証画面が表示されるので、画面に従って進めていく。はじめに利用するアカウントを選択する。

![スクリーンショット 2022-11-03 17.43.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163680/fb8c217f-6a98-f4e9-5ff6-61975479daa0.png)

その後確認画面が表示されるので、内容を確認し「続行」を押下する。

![スクリーンショット 2022-11-03 17.43.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163680/10f8d5c6-886a-d0a3-1206-cc3069565624.png)

認証が完了し、アップロード処理が完了する。

GoogleDriveにアクセスして確認すると、「test」フォルダが作成されていることが確認できる。

![スクリーンショット 2022-11-03 18.05.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163680/b365ef49-484d-8cc0-b364-bb81517cee3a.png)

その中に「hoge」というファイルがアップロードされていることが確認でき、内容も先ほど入力した内容が記載されている。

![スクリーンショット 2022-11-03 18.07.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163680/41823255-4fb5-9741-b592-bb02cd213b5b.png)

初回実行時に、OAuth2の認証情報が`saved_credential.json`の名称でローカルに保存される。そのため、２回目以降はOAuth2の認証画面を表示することなくGoogleDriveにファイルをアップロードできる。