如何下载云端硬盘“附件”
所指的“附件”实际上只是一个指向云端硬盘文件的链接,因此令人困惑的是它根本不是附件,而只是文本或 HTML。
这里的问题是,由于它本身不是附件,因此您将无法通过 Gmail API 本身获取它。您需要使用 Drive API。
要使用 Drive API,您需要获取文件 ID。这将在HTML 等内容部分中。
您可以使用re 模块对HTML 内容执行findall,我使用以下正则表达式模式来识别驱动器链接:
(?<=https:\/\/drive\.google\.com\/file\/d\/).+(?=\/view\?usp=drive_web)
这是一个获取文件 ID 的示例 python 函数。它将返回一个列表。
def get_file_ids(service, user_id, msg_id):
message = service.users().messages().get(userId=user_id, id=msg_id).execute()
for part in message['payload']['parts']:
if part["mimeType"] == "text/html":
b64 = part["body"]["data"].encode('UTF-8')
unencoded_data = str(base64.urlsafe_b64decode(b64))
results = re.findall(
'(?<=https:\/\/drive\.google\.com\/file\/d\/).+(?=\/view\?usp=drive_web)',
unencoded_data
)
return results
获得 ID 后,您需要调用 Drive API。
您可以按照docs 中的示例进行操作:
file_ids = get_file_ids(service, "me", "[YOUR_MSG_ID]"
for id in file_ids:
request = service.files().get_media(fileId=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)
请记住,由于您现在将使用 Drive API 和 Gmail API,因此您需要更改项目中的范围。还记得在开发者控制台中激活 Drive API,更新您的 OAuth 同意屏幕、凭据并删除本地 token.pickle 文件。
参考文献