PythonでGoogle Driveにファイルをアップロードする

PythonでGoogle Driveにファイルをアップロードしてみます。

■Python

今回のPythonのバージョンは、「3.8.5」を使用しています。(Windows10)(pythonランチャーでの確認)

■PyDriveライブラリ、google-api-python-clientライブラリをインストールする

Google Driveにファイルをアップロードするためには、PyDriveライブラリをインストールします。

pip install PyDrive

インストールを行うために、Windowsのコマンドプロンプトを起動し、上記のコマンドを入力しEnterキーを押します。

なお、今回は、pythonランチャーを使用しており、Python Version 3.8.5にインストールを行うために、pipを使う場合にはコマンドでの切り替えを行います。

py -3.8 -m pip install PyDrive

切り替えるために、上記のコマンドを入力し、Enterキーを押します。

Processing c:\users\user\appdata\local\pip\cache\wheels\c6\14\12\ccdcc5d3b41661f360f9c7d9f7ea9d1879a5f85aa4ecc8cc6f\pydrive-1.3.1-py3-none-any.whl
Requirement already satisfied: google-api-python-client>=1.2 in c:\pg\python38\lib\site-packages (from PyDrive) (1.12.8)
Collecting oauth2client>=4.0.0
Downloading oauth2client-4.1.3-py2.py3-none-any.whl (98 kB)
|████████████████████████████████| 98 kB 990 kB/s
Collecting PyYAML>=3.0
Downloading PyYAML-5.3.1-cp38-cp38-win_amd64.whl (219 kB)
|████████████████████████████████| 219 kB 1.3 MB/s
Requirement already satisfied: google-auth>=1.16.0 in c:\pg\python38\lib\site-packages (from google-api-python-client>=1.2->PyDrive) (1.23.0)
Requirement already satisfied: google-api-core<2dev,>=1.21.0 in c:\pg\python38\lib\site-packages (from google-api-python-client>=1.2->PyDrive) (1.23.0)
Requirement already satisfied: six<2dev,>=1.13.0 in c:\pg\python38\lib\site-packages (from google-api-python-client>=1.2->PyDrive) (1.15.0)
Requirement already satisfied: google-auth-httplib2>=0.0.3 in c:\pg\python38\lib\site-packages (from google-api-python-client>=1.2->PyDrive) (0.0.4)
Requirement already satisfied: uritemplate<4dev,>=3.0.0 in c:\pg\python38\lib\site-packages (from google-api-python-client>=1.2->PyDrive) (3.0.1)
Requirement already satisfied: httplib2<1dev,>=0.15.0 in c:\pg\python38\lib\site-packages (from google-api-python-client>=1.2->PyDrive) (0.18.1)
Requirement already satisfied: pyasn1-modules>=0.0.5 in c:\pg\python38\lib\site-packages (from oauth2client>=4.0.0->PyDrive) (0.2.8)
Requirement already satisfied: pyasn1>=0.1.7 in c:\pg\python38\lib\site-packages (from oauth2client>=4.0.0->PyDrive) (0.4.8)
Requirement already satisfied: rsa>=3.1.4 in c:\pg\python38\lib\site-packages (from oauth2client>=4.0.0->PyDrive) (4.6)
Requirement already satisfied: setuptools>=40.3.0 in c:\users\user\appdata\roaming\python\python38\site-packages (from google-auth>=1.16.0->google-api-python-client>=1.2->PyDrive) (50.3.2)
Requirement already satisfied: cachetools<5.0,>=2.0.0 in c:\pg\python38\lib\site-packages (from google-auth>=1.16.0->google-api-python-client>=1.2->PyDrive) (4.1.1)
Requirement already satisfied: googleapis-common-protos<2.0dev,>=1.6.0 in c:\pg\python38\lib\site-packages (from google-api-core<2dev,>=1.21.0->google-api-python-client>=1.2->PyDrive) (1.52.0)
Requirement already satisfied: pytz in c:\pg\python38\lib\site-packages (from google-api-core<2dev,>=1.21.0->google-api-python-client>=1.2->PyDrive) (2020.4)
Requirement already satisfied: requests<3.0.0dev,>=2.18.0 in c:\pg\python38\lib\site-packages (from google-api-core<2dev,>=1.21.0->google-api-python-client>=1.2->PyDrive) (2.25.0)
Requirement already satisfied: protobuf>=3.12.0 in c:\pg\python38\lib\site-packages (from google-api-core<2dev,>=1.21.0->google-api-python-client>=1.2->PyDrive) (3.14.0)
Requirement already satisfied: idna<3,>=2.5 in c:\pg\python38\lib\site-packages (from requests<3.0.0dev,>=2.18.0->google-api-core<2dev,>=1.21.0->google-api-python-client>=1.2->PyDrive) (2.10)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in c:\pg\python38\lib\site-packages (from requests<3.0.0dev,>=2.18.0->google-api-core<2dev,>=1.21.0->google-api-python-client>=1.2->PyDrive) (1.26.2)
Requirement already satisfied: chardet<4,>=3.0.2 in c:\pg\python38\lib\site-packages (from requests<3.0.0dev,>=2.18.0->google-api-core<2dev,>=1.21.0->google-api-python-client>=1.2->PyDrive) (3.0.4)
Requirement already satisfied: certifi>=2017.4.17 in c:\pg\python38\lib\site-packages (from requests<3.0.0dev,>=2.18.0->google-api-core<2dev,>=1.21.0->google-api-python-client>=1.2->PyDrive) (2020.11.8)
Installing collected packages: oauth2client, PyYAML, PyDrive
Successfully installed PyDrive-1.3.1 PyYAML-5.3.1 oauth2client-4.1.3

Enterキーを押すと、インストールが開始され、「Successfully installed(正常にインストールされました)」と表示されれば、インストールは完了です。

■Google API コンソール(Google Developers Console) のGoogle Drive APIを有効にする。

インストール後、Google API コンソール(Google Developers Console)に Google Drive API のアプリケーションを登録します。

Google API コンソール(Google Developers Console)へアクセスします。アクセスする前に、Googleのアカウント作成を行っておく必要があります。

アクセスすると、「Google Cloud Platform のインスタンス、ディスク、ネットワークなどのリソースを 1 か所で作成し、管理します。」というウインドウが表示されますので、利用規約の「私は、GoogleCloudPlatformの利用規約、および適用されるサービスとAPIの利用規約に同意します。」のチェックボックスに、利用規約を確認し、チェックを入れます。(最新情報をメールで通知してほしい方は、メールを定期的に受信するにチェックを入れます。)

チェックを入れた後、「同意して続行」ボタンをクリックします。

クリックすると、ダッシュボードの上部に検索バーがあるので「GoogleDriveAPI」と入力すると、「GoogleDriveAPI」という検索結果が表示されますので、GoogleDriveAPIと表示されたところをクリックします。

クリックすると、「Google Drive API」の詳細ページが表示されますので、「有効にする」ボタンをクリックします。

■OAuth 2.0 クライアント IDを作成する

クリックすると、有効になります。有効にした後に左側メニューの「認証情報」をクリックします。

クリックすると、「認証情報」の詳細ページが表示されますので、「認証情報を作成」ボタンをクリックします。

クリックすると、プルダウンメニューが表示されますので「OAuthクライアントID」をクリックします。

クリックすると「OAuthクライアントIDの作成」ページが表示されますので、「アプリケーションの種類」をクリックします。

クリックすると、プルダウンメニューが表示されますので、今回は「デスクトップアプリ」を選択します。

クリックすると、「名前」を入力する欄が表示されますので、自動的に入力されるのですが、変更したい場合は変更します。変更後、「作成」ボタンをクリックします。

クリックすると、「認証情報」の詳細ページの「OAuth 2.0 クライアント ID」に先ほど作成されたOAuth 2.0 クライアント IDが追加されます。追加後、一番右側のボタンをクリックします。

クリックすると、Webブラウザで指定されているファイルの保存場所に「client_secret_XXXXX.apps.googleusercontent.com.json」といったJSON形式のファイルがダウンロードされます。

ダウンロードされたファイルの名前を「client_secrets.json」に変更します。

変更後、「client_secrets.json」をPythonが実行されている作業ディレクトリ(カレントディレクトリ)に移動させます。

■Google Driveにファイルをアップロードする

移動後、Google Driveにファイルをアップロードするスクリプトを書いていきます。

■コード

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

import os

#認証
gauth = GoogleAuth()

#ローカルWebサーバとautoを作成
#Googleドライブの認証処理
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)

#アップロードするフォルダパス指定
path = r"C:\Users\user\test"

#for文によるループ処理(繰り返し処理)
for x in os.listdir(path):
    #GoogleDriveFileオブジェクト作成
    f = drive.CreateFile({'title' : x})
    #ローカルのファイルをセットしてアップロード
    f.SetContentFile(os.path.join(path,x))
    #Googleドライブにアップロード
    f.Upload()

    f = None

今回は、「C:\Users\user\test(フォルダパス)」内にある画像を全てGoogleドライブにアップロードしてみます。アップロードする画像ファイルは、著作権フリーのものを使用しています。

■実行

今回書いたスクリプトを「g_drive_upload.py」という名前で保存し、コマンドプロンプトから実行してみます。

実行してみると、「Your browser has been opened to visit: https://accounts.google.com/o/oauth2/auth?client_id=○○○」といったメッセージが表示され、Webブラウザが起動します。

起動後、「ログイン – Googleアカウント」というページが表示されます。「アカウントの選択」と表示されていますので、お持ちのGoogleアカウントを選択します。

選択すると「このアプリは確認されていません」、「このアプリは、Google による確認が済んでいません。よく知っている信頼できるデベロッパーの場合に限り続行してください。」、「デベロッパーの場合は、この画面が表示されないようにするには確認リクエストを送信してください。」とページに表示されますので、ページ下の「詳細」ボタンをクリックします。

クリックすると、追加で文章が表示されて、その下に「(OAuthクライアントIDの名前)(安全ではないページ)に移動」という文字が表示されていますので、こちらをクリックします。

クリックすると、「権限の付与」というウインドウが表示されます。「Googleドライブのすべてのファイルの表示、編集、作成、削除」と表示されていますので、これを許可するために「許可」ボタンをクリックします。

クリックすると、「選択内容を確認してください」と表示されますので、内容を確認し、「許可」ボタンをクリックします。

クリックすると、「Authentication Status(認証ステータス)」のページが表示されます。「The authentication flow has completed.(認証フローが完了しました。)」と表示されていますので、これでGoogleドライブへのアップロードを許可するための認証フローは完了となります。完了後、Webブラウザを閉じます。

閉じた後に、Windowsのコマンドプロンプトを確認すると「Authentication successful.(認証に成功しました。)」と表示されます。

表示後、Googleドライブを確認すると、今回指定したフォルダ内の画像ファイルが全てアップロードされていることが確認できました。

■検証プロセスの自動化

今回、OAuth 2.0 クライアント IDを作成し、PythonでGoogleドライブにファイルをアップロードしましたが、紹介したスクリプト(プログラム)実行するたびに、Webブラウザを開いて、権限の付与の許可、認証フローの作業を行わないといけないのは手間です。

毎回Webブラウザを開いて、権限の付与の許可、認証フローの作業を行わずに、スクリプト(プログラム)を実行できるコードを書いてみます。

■コード

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

import os

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

#資格情報ロードするか、存在しない場合は空の資格情報を作成
gauth.LoadCredentialsFile("mycreds.txt")

#Googleサービスの資格情報がない場合
if gauth.credentials is None:
    #ユーザーから認証コードを自動的に受信しローカルWebサーバーを設定
    gauth.LocalWebserverAuth()
#アクセストークンが存在しないか、期限切れかの場合    
elif gauth.access_token_expired:
    #Googleサービスを認証をリフレッシュする
    gauth.Refresh()
#どちらにも一致しない場合    
else:
    #Googleサービスを承認する
    gauth.Authorize()
#資格情報をtxt形式でファイルに保存する  
gauth.SaveCredentialsFile("mycreds.txt") 
       
#Googleドライブの認証処理
drive = GoogleDrive(gauth)

#アップロードするフォルダパス指定
path = r"C:\Users\user\test"

#for文によるループ処理(繰り返し処理)
for x in os.listdir(path):
    #GoogleDriveFileオブジェクト作成
    f = drive.CreateFile({'title' : x})
    #ローカルのファイルをセットしてアップロード
    f.SetContentFile(os.path.join(path,x))
    #Googleドライブにアップロード
    f.Upload()

    f = None

上記のコードであれば、プログラムを1度実行して、Webブラウザを起動からの権限の付与の許可、認証フローの作業を行います。この作業を行い、Googleサービスの資格情報を「mycreds.txt」に保存させます。保存後、2回目にプログラムを実行すると、権限の付与の許可、認証フローの作業は行わずに済みます。

コメント

タイトルとURLをコピーしました