Python#pydriveを使ってみよう

いつもお読みいただきありがとうございます。
原文は私のプログにのってます、どうぞよろしくおねがいします。
http://soup01.com/ja/2018/07/26/pythonwithpydrive/

いまは自分で色々簡単なWEBアプリケーションを試しに作っててGoogleDriveにあるFolder、Filesなどを吸出してみようかなと思って。この記事はpydriveというライブラリーを使ってます。ライブラリー使う前に一番大事なのは公式ドキュメントを読むこと。

https://pythonhosted.org/PyDrive/　　　　←pythonhosted

https://pypi.org/project/PyDrive/　　　　　←HP

https://github.com/gsuitedevs/PyDrive　　←Github

>PyDrive is a wrapper library of google-api-python-client that simplifies many common Google Drive API tasks.  
Features  
Simplifies OAuth2.0 into just few lines with flexible settings.
Wraps Google Drive API into classes of each resource to make your program more object-oriented.
Helps common operations else than API calls, such as content fetching and pagination control.

うん〜PyDriveはgoogle-api-python-clientが包んでるライブラリーで、Google Drive APIタスクを簡単に実現できるように作られてる。どんな機能持ってるのかな？簡単でOAuth2.0の設定、Google Drive APIをクラスにおさめてプログラマーにもっとOOPでプログラム作られるように、あとはDataを取るときとか、Paginationするときもっと簡単にできるように。なるほど。でもこの説明の中に3つちょっとわからない単語ありますね〜OAuth2.0とgoogle-api-python-clientとGoogle Drive API。

##OAuth2.0
SNSやWebサービス間で「アクセス権限の認可」を行うためのプロトコルのことであり、現在では2012年に発行されたOAuth 2.0が標準化されています。

SNSアカウントやWebユーザーページなどにアクセスする際、そのサービスのユーザーだということを「ログイン」によって認可させなければなりませんが、これを行うインターフェイスをAPIといいます。

たとえば、InstagramとFacebookに同じ写真を投稿する場合、通常であれば双方のAPIを通じたログインが必要になるはずです。

しかし、実際はInstagramへのログインだけでどちらにも投稿が可能となっており、この共有機能に使われているのがOAuthプロトコルなのです。

Source Come From:https://boxil.jp/mag/a3207/

##google-api-python-client
The Google API Client Library for Python is designed for Python client-application developers. It offers simple, flexible access to many Google APIs.
 

https://code.google.com/archive/p/google-api-python-client/

https://github.com/google/google-api-python-client

https://developers.google.com/api-client-library/python/

##Google Drive API
このAPIを使えばあなたのアプリケーションをGoogle DriveにFilesをダウンロード・アップロードできるます。さらにそれらのFilesを開いてPDFなどにEXPORTすることもできます。もちろんやろうと思えばFILEを削除・復元のような操作も可能です。

https://developers.google.com/drive/api/v3/about-sdk

認証
https://developers.google.com/drive/api/v3/about-auth  ←ここで書いてる

https://qiita.com/Gara-tech/items/df461947344bb76ee25f  ←qittaの中にも

ScreenShotするのはめんどくさいなので、認証のやり方は上記のLINKを参照してください。

ここで注意してほしいのはScopeの権限です：あとで使うConfig FileでこのTableが大変助けるのは、頭の隅ところに入れて置きましょう。

https://developers.google.com/drive/api/v2/about-auth

##データをとってみよう
みんなさんclient_idとclient_secretをちゃんともらいましたか？次はPyDriveを使って見ましょう。まずpipでライブラリーをインストールします。

```pip install PyDrive```
今回のFILE構成を書いてみましょう。

- myDriveApp
 - drive.py
 - setting.yaml

Setting.yamlの中身がこんな感じですが、覗いていじってる設定を見てみましょう。

```setting.yaml
setting.yaml

client_config_backend: settings
client_config:
　client_id: xxxxxxx.apps.googleusercontent.com
　client_secret: yyyyyyyyyyyyyy

save_credentials: True
save_credentials_backend: file
save_credentials_file: credentials.json

get_refresh_token: True
```

- oauth_scope:
 - https://www.googleapis.com/auth/drive
 - client_config_backend (str):
とこからClient Configuration Fileを読み込むかを決める。有効な設定は”file”か”settings”か。Defaultは”file”です。
- client_config (dict):
もしclient_config_backendが”setting”になるとここは絶対にdictを入れないといけません。ここでclientの設定をされる場所です。
 - client_config[‘client_id’] (str):
アプリケーションのClient ID。もしclient_config_backendが”setting”になるとここにIDを入れるの必要です。
 - client_config[‘client_secret’] (str):
アプリケーションのClient secret。もしclient_config_backendが”setting”になるとここにIDを入れるの必要です。
- save_credentials (bool):
 - save_credentialsを保存したいならTrueをいれてください。DefaultはFalseです。Trueになるとcredentials.jsonが作成される。
- save_credentials_backend (str):
 - No.Backendでcredentialsを保存します。現在の有効値は”file”しかありません。
- save_credentials_file (str):
  - .credentialsの保存先。もしsave_credentials_backendが”file”なら入れるの必要。
- get_refresh_token (bool):
 - Trueになる認証したこと覚える。Default:False。
- oauth_scope (list of str):
 - OAuth scope to authenticate.[‘https://www.googleapis.com/auth/drive‘].

次は簡単プログラムを説明しましょう。ここでPydriveにあるサンプルの少しつづ修正し解説したいと思います。わたしはネットで苦戦してたとき体験はやっばり公式ドキュメントのコードを一行一行説明しれくれるのは一番わかり易い。ークラスされたり色々組み込んでしまうと自分であと読んでも大変そうなので。うんうん、常に簡単なところから始まりましょう。

```drive.py

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

gauth = GoogleAuth()
gauth.CommandLineAuth()
drive = GoogleDrive(gauth)
```

認証するためにGoogleAuthとそのあとのDrive操作が必要のモジュールをImportします。

- GoogleAuth
 - class pydrive.auth.GoogleAuth(settings_file=’settings.yaml’, http_timeout=None)
  - Bases: pydrive.apiattr.ApiAttributeMixin, object
  - google-api-python-clientの中にあるoautrh2clientライブラリーを包んでるクラスですね。このクラス使う、全ての設定とcredentialsは’setting.yaml’に従って、そして一般なOAuth2.0認証などを行います。
- CommandLineAuth(*args, **kwargs)
 - Returns: str – code returned from commandline.
 - GoogleAuthの中にあるFunctionです。
認証方法はコマンドラインに認証URLをPrintしてユーザーが手動で認証行う。

- GoogleDrive()
 - Bases: pydrive.apiattr.ApiAttributeMixin, object
Driveが使われるメインクラス。

###認証を走ってみよう。

```shell-session
$ python drive.py

py:255: UserWarning: Cannot access credentials.json: No such file or 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=....
Enter verification code:XXXXXX

Authentication successful.
```

コマンドラインにURLをアクセスしverification codeを入れてください。OKならAuthentication successful.が出てきます。

いまのFILE構成はこうなりますね。

- myDriveApp
 - drive.py
 - setting.yaml
 - credentials.json

このFILEがないと毎回Scriptを走るときも認証しないといけません。これで認証までできましたね。
###FILEを読んでみましょう。

```drive.py

for file_list in drive.ListFile({'q': 'trashed=false'}):
 for file1 in file_list:
  print('title: %s, id: %s' % (file1['title'], file1['id']))
```

- ListFile(param=None)
 - 認証されたGoogleDrive Instanceにそれに対してのGoogleDriveFileListが戻ります。いわゆる認証OKならすべてのFILEが戻るってことですね〜
 - file1[‘title’]とか、file1[‘id’]とかの辞書KEY多分？どっかで乗ってるけど見つかりません…私いつもすべてもらってその中に必要なKEYを見つかってもう一回修正する。非常に非効率なやり方…
 - qのパラメータはここにあります：https://developers.google.com/drive/api/v2/search-parameters

###Folderを見ましょう。

```py
for file_list in drive.ListFile({'q':"mimeType='application/vnd.google-apps.folder'"}):
 for file1 in file_list:
  print('title: %s, id: %s ,modified: %s' % (file1['title'], file1['id'],file1['modifiedDate']))
  #parsed=json.dumps(file1,indent=4)
  #print(parsed)
```
今度はqにmimeTypeをFOLDERに指定します。
Commentにされたコードは戻ってきたのJSONを綺麗にPrintできるようにするだけです。

###もし指定のFolder中身だけなら？

```py
for f in drive.ListFile({'q':"'yourFolderID' in parents"}):
 for f1 in f:
  print(f1['title']+' '+f1['id'])
```

結構便利なライブラリーですね！〜て、Backendはなに？

それじゃねー