这几天需要通过 API 下载谷歌表格,但没想到这么麻烦,资料也不是很多,所以在这里记录一下
一、基本代码
首先放一个示例文件Sample Spreadsheet.xlsx,假设我们现在需要下载这个文件,要用到的基本代码如下
import io
import os
from typing import List
from googleapiclient.discovery import build
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.http import MediaIoBaseDownload
def run(file_id: str, save_path: str, credentials_path: str, scopes: List[str]):
creds = None
if os.path.exists("token.json"):
creds = Credentials.from_authorized_user_file("token.json", scopes)
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(credentials_path, scopes)
creds = flow.run_local_server(port=0)
with open("token.json", "w") as token:
token.write(creds.to_json())
service = build("drive", "v3", credentials=creds)
# 不同的文件需要不同的下载接口,目前暂时不知道如何区分,只能在报错后尝试另一种
# Export:Docs Editors files
# Get:files with binary content
try:
request = service.files().get_media(fileId=file_id)
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))
except Exception:
request = service.files().export(
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))
with open(save_path, "wb") as f:
fh.seek(0)
f.write(fh.read())
if __name__ == "__main__":
file_id = "1JI17N-NFAIOxX_2Y88gmuKMlsuGhBPcB"
save_path = "Sample Spreadsheet.xlsx"
scopes = ["https://www.googleapis.com/auth/drive"]
credentials_path = "credentials.json"
run(file_id, save_path, credentials_path, scopes)
安装依赖
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
执行上面的代码需要获取需要一个关键的凭据文件credentials.json,这是谷歌的凭据文件,要下载谷歌云盘文件需要经过谷歌的权限检查,也就是验证你有没有资格访问该资源,下面介绍如何获取该文件
二、新建项目
要创建凭据文件,首先要在谷歌云工作台创建一个项目,如果已经有项目也可以直接使用
三、启用谷歌云盘API服务
因为谷歌表格实际上也是存在谷歌云盘的,所以这里只需要谷歌云盘API即可,如果需要访问和修改表格的单元格数据,可以开通Google Sheets API服务
新建项目后选中该项目,然后点击启用API和服务,找到Google Drive API,点击启用,给项目开通调用谷歌云盘的服务权限
四、创建凭据
启用之后,回到主页面,点击创建凭据,选择OAuth 客户端 ID
五、配置同意屏蔽
对于新创建的项目,创建凭据前会需要配置同意屏蔽,点击配置同意屏蔽
User Type只能选择外部
填一下自己的邮箱地址,后面的邮箱地址都可以用自己的谷歌邮箱
六、选择授权范围
因为我只需要下载文件,这里就只选择了查看和下载,如果要进行其他操作,选择对应的范围即可
测试用户还是继续用自己的谷歌邮箱地址
到这里同意屏蔽就配置好了
七、生成credentials.json
回到第三步的页面,再次创建凭据,选择桌面应用
下载和重命名该文件为credentials.json即可
八、运行
第一次运行代码,需要登陆账号密码,用于生成token.json,之后就不再需要登陆了(只要没过期)。这里是你自己创建的个人应用,不用担心安全问题。
九、查看结果
等终端输出之后就可以看到已经下载好了
Download 100%.
如果发现下载的文件未同步云端修改记录,一般是因为编辑者仍停留在页面上,需要保存退出,然后再进行下载即可同步最新的编辑结果