🍺

[Python]GoogleDriveAPIを使う方法

2021/05/03に公開

できること

  • PythonでGoogleDriveAPIを操作できる
  • これまで通らなかった認証が通るようになる!(はず)

この記事はサーバ側のGoogleDriveAPIのOauth認証がうまく行かない人のための記事です。

技術

Pythonを使います。Python派ではない方ごめんなさい。

  • 言語
    • Python3.7
  • ライブラリ
    • google-api-python-client
    • google-auth-httplib2
    • google-auth-oauthlib
    • oauth2client
  • API
    • GoogleDriveAPI

ライブラリですが、使っていないライブラリが含まれているかもしれません。いらないライブラリはご自身で検証してみてください。

手順

おおよそこんな流れです。

  • googleアカウントにログインします(ない人は作りましょう)
  • google developer consoleにアクセス
  • 同意する
  • プロジェクト作成
  • ライブラリで「GoogleDriveAPI」を有効にする
  • 認証情報の作成
  • 同意画面の設定
  • 改めて認証情報の作成
  • pip install
  • コーディング
  • 実行

google developer consoleにアクセス

ここです。「google developer console」とでも検索しましょう。以下のリンクを辿っても大丈夫です。
https://console.developers.google.com/

同意する

初めてなら利用規約に同意してください。

こんな画面に移動します。(↓)

プロジェクト作成

プロジェクトの選択」→「新しいプロジェクト」でプロジェクトを作りましょう。

ここでは「sample」としておきます。

ライブラリで「GoogleDriveAPI」を有効にする

左メニューの「ライブラリ」をクリック、API一覧画面から「GoogleDriveAPI」を探し、「有効にする」をクリックします。

画面が若干変わります。ロゴやメニューが若干変わっていますね。左上の「Google APIs」をクリックすれば一番最初の画面に戻れます。

認証情報の作成(ここから過去記事と異なります)

左の「認証情報」クリックし、「認証情報を作成」してください。選ぶのは「OauthクライアントID」です

同意画面の設定

同意画面の設定」をクリックします。こんな感じになるはずです。

アプリケーション名をmyapp

として、スコープの設定もしておきます。今回、GoogleDriveについて一通りの操作をしたいので、「GoogleDrive API
../auth/drive
」にチェックを入れておきます。(チェックしなかったら操作できないんですかね?)

戻って認証情報の設定

  • その他」を選択し、
  • 名前が「その他のクライアント」と入れてくれたのでそのままにしときます。
  • そして「作成

鍵の情報を大切に保管する

作成」ボタンを押したら、「OK」としておきましょう

あとは鍵をダウンローするのみです。「client_secret.xxxxxx.json」的なファイル名だと思います。

ソースコード編

今回は、「もうこれで誰でもできるだろう」っていう方法を見つけたので早速そのコードを書いて行きます。(参考にさせていただいた記事投稿者のみなさまありがとうございます)

まずはライブラリのインストール

これはガイド通りに実行しましょう。どんな方もこれは実行してください。ガイド通りにと言いましたが、追加で「oauth2client」もインストールしています。

$ pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib oauth2client

コーディング

名前だけはガイドに習ってquickstart.pyとします。

quickstart.py
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools

# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/drive']


def main():
    """Shows basic usage of the Drive v3 API.
    Prints the names and ids of the first 10 files the user has access to.
    """
    """ここから"""
    store = file.Storage('token.json')
    creds = store.get()
    if not creds or creds.invalid:
        flow = client.flow_from_clientsecrets('./client_secret.json', SCOPES)
        creds = tools.run_flow(flow, store)
    service = build('drive', 'v3', http=creds.authorize(Http()))
    """ここまでがポイント!"""

    # Call the Drive v3 API
    results = service.files().list(
        pageSize=10, fields="nextPageToken, files(id, name)").execute()
    items = results.get('files', [])

    if not items:
        print('No files found.')
    else:
        print('Files:')
        for item in items:
            print(u'{0} ({1})'.format(item['name'], item['id']))


if __name__ == '__main__':
    main()

**先ほどダウンロードした鍵はquickstart.pyと同じフォルダに置いてください。**しっかりファイルパスを考慮したコーディングができるのであれば好きなところに置いてコードを修正してください。また、名前が長かったので「client_secret.json」に変更しておきました。

project
┣ quickstart.py
┗ client_secret.json

quickstart.pyを実行する

私の場合はブラウザの無いサーバで実行したのでこんな感じになりました。ブラウザ認証を求められます。サーバにw3mが入っていてそれが反応して、見慣れないような画面になります。そんな時は「q」(quit)と押して「y」(yes)で抜けられます。

$ python quickstart.py

w3mを抜けたらメッセージがきてました。

Your browser has been opened to visit:

    https://accounts.google.com/o/oauth2/auth?client_~省略~

If your browser is on a different machine then exit and re-run this
application with the command-line parameter

  --noauth_local_webserver

なるほど。「もしあなたのブラウザがこのマシンと異なる場所で実行されるなら、exitして『--noauth_local_webserver』というパラメータをつけて再挑戦しろと。」というわけで「ctrl+C」で脱出。

<u>※私の場合EC2サーバで実行しましたが、自分のマシンでやる場合素直にpython quickstart.pyを実行するだけで大丈夫な気がします。</u>

これでできる(--noauth_local_webserver)

ヒントは得たので再挑戦。

$ python quickstart.py --noauth_local_webserver
~省略~
Go to the following link in your browser: 

ログイン用アドレスが表示される

とこんな感じになるので、URLをコピペしてブラウザで開きましょう。

ブラウザ操作していく

アカウントを選びます。(複数アカウントでログインした形跡がある方は適切なアカウントを選んでくださいね)

ちょっとドキッとするような画面がでます。詳細を表示して、myappに移動してください。

myappへの権限の付与を許可してください。

これも許可します。

最後にこんな画面が出てきます。これをコピーして、コンソールの「Enter verification code:」 に貼り付けます。

そうするとAuthentication successful.となるはずです。

Enter verification code: ここにコードを貼り付けてEnter
Authentication successful.
Files:
テストフォルダ (1WxcFKQW58DLecKhxOM3TBuJ2dLfOUB5N)
~他にもドライブに入っているファイルの一覧がでる~

ちなみにもしドライブのファイルがたくさん表示されたならコードの「# Call the Drive v3 API」以降の部分によるものです。接続自体はそれ以前のコードですでに達成しています。操作の仕方はまた追い追い紹介します。

以降は--noauth_local_webserverをつけなくてOK

初回の実行によって、token.jsonというファイルができているはずなので、以降はそのtoken.jsonによってブラウザ認証なしで実行することができます。便利!

しかし最初だけは、token.json取得のために手動で実行しなければならないことは覚えておいてください。

今はこんなファイル構造になってるはず。↓

project
┣ quickstart.py
┣ token.json
┗ client_secret.json

まとめ

環境作るまで結構大変でしたが、これで環境構築完了です。

Discussion