GoogleDriveからファイルの取得を定期的にして処理をする必要があったのでその備忘録で。
OAuth 2.0を使った例は結構あったのですが、認証の有効期限があったりなのでDrive v3 APIを使って実施です。
まずこちらから「サービスアカウント」を登録する必要があります。
ロールはプロジェクトの編集者などを選び設定します。
サービスアカウントキーを後ほど使うのでJSONでダウンロードしておく必要があります。
こちらのライブラリからGoogleDriveを有効にしておく必要もあります。
ライブラリのインストール
python3を使ってなので、pip3を使ってインストールします。
1 2 3 |
# pip3 install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib |
ダウンロードプログラム
まず、「service_account_key.json」という名前などでgoogle developer consoleから取得したJSONを保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "type": "service_account", "project_id": "***", "private_key_id": "***", "private_key": "-----BEGIN PRIVATE KEY-----***-----END PRIVATE KEY-----\n", "client_email": "***@***.iam.gserviceaccount.com", "client_id": "***", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/***%***.iam.gserviceaccount.com" } |
以下がダウンロードを実施するプログラムになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
from apiclient.discovery import build from oauth2client.service_account import ServiceAccountCredentials from httplib2 import Http from googleapiclient.http import MediaIoBaseDownload import io SCOPES = ['https://www.googleapis.com/auth/drive'] credentials = ServiceAccountCredentials.from_json_keyfile_name( 'service_account_key.json', SCOPES ) http_auth = credentials.authorize(Http()) drive_service = build('drive', 'v3', http=http_auth) results = drive_service.files().list( pageSize=10, fields="nextPageToken, files(id, name)").execute() items = results.get('files', []) if not items: print('No files found.') else: for item in items: ## 拡張子がある時(ファイルの時) if "." in item['name']: print(u'{0} ({1})'.format(item['name'], item['id'])) request = drive_service.files().get_media(fileId=item['id']) fh = io.FileIO(item['name'], "wb") downloader = MediaIoBaseDownload(fh, request) done = False while done is False: status, done = downloader.next_chunk() |
実行は以下のようにコマンドで実施します。
1 2 3 |
$ python3 get_file.py |
データのやり取りなどGoogleDriveで実施したものを直接処理することができるので何かと便利です。
このブログは株式会社CoLabMixによる技術ブログです。
GCP、AWSなどでのインフラ構築・運用や、クローリング・分析・検索などを主体とした開発を行なっています。
Ruby on RailsやDjango、Pythonなどの開発依頼などお気軽にお声がけください。
開発パートナーを増やしたいという企業と積極的に繋がっていきたいです。