グーグルドライブAPIというものがありこれを使えばブラウザにアクセスしなくてもダウンロードできるぞと書いてあったが思いの外手こずったのでメモ
APIキーやOAuthを手に入れる方法は他にあるので割愛
また、コードはpythonで書く。
調べてみたところやれることはスコープによって変わるようだ
# これでダウンロードや書き込み、読み込み、その他諸々が自由になる。
SCOPES = ['https://www.googleapis.com/auth/drive', 'https://www.googleapis.com/auth/drive.metadata.readonly']
from googleapiclient.discovery import build
from googleapiclient.http import MediaIoBaseDownload
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
def getfile():
"""
ファイルをダウンロードするだけの簡単な関数。
"""
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
service = build('drive', 'v3', credentials=creds)
file_id = '1lllnzSFApok_umno0gsXotykBSjOOBgCr85F6gM1ed4'
file_name = 'chatwork_test.xlsx'
request = service.files().export_media(fileId=file_id, mimeType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
status, done = downloader.next_chunk()
print("Download %d%%." % int(status.progress() * 100))
fh.seek(0)
with open(os.path.join('./resultFile', file_name), 'wb') as f:
f.write(fh.read())
f.close()
if __name__ == '__main__':
getfile()
コードを見るとわかるように
request = service.files().export_media(fileId=file_id, mimeType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
ここのmimeType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
でspreadsheetをexcelファイルに変換し、
file_name = 'chatwork_test.xlsx'
fh = io.BytesIO() # ファイルをバイナリで開く、エクセルファイルはバイナリだから
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
status, done = downloader.next_chunk()
print("Download %d%%." % int(status.progress() * 100))
ここで実際にダウンロードを行うわけだがここの処理をよく理解していなかった。
このあたりの処理はいわゆるf.open('hoge', 'rb')
しただけと大体一緒なのでその後に書き込む処理をしなければならなかったのだ。
つまり「ダウンロードしました(ダウンロードしたとはいってない)」と同じ状態なのである。したがって。
fh.seek(0)
with open(os.path.join('./resultFile', file_name), 'wb') as f:
f.write(fh.read())
f.close()
これらの処理が必要になる。
正直このfh.seek(0)
の意味がよくわかっていない、