使用 Python urllib2/requests 验证 Google 驱动器并下载电子表格

Authenticate to Google Drive and download spreadsheet with Python urllib2/requests

我想下载我的 Google 驱动器验证 Google 中的文档(我只希望某些用户能够访问它,不想将它发布到网页)。

我试过使用 requests 但显然我做错了什么。 从浏览器我可以下载我的文档到地址 https://docs.google.com/spreadsheets/d/<document key>/export?format=xls.

所以在我的 python 脚本中,我执行以下操作:

import os
import requests
import shutil
from requests.auth import HTTPBasicAuth

remote = "https://docs.google.com/spreadsheets/d/<document key>/export?format=xls"
username = os.environ['GOOGLEUSERNAME']
password = os.environ['GOOGLEPASSWORD']
r = requests.get(remote, auth=HTTPBasicAuth(username,password))
if r.status_code == 200:
  with open("document.xls","wb") as f:
    shutil.copyfileobj(r.raw, f)

但是结果 document.xls 是空的。

我做错了什么?

您尝试做的事情实际上可能是可行的,但这里有 一些 原因,为什么它会很重要(绝不是完整列表):

  1. Google 通常会阻止 user-agents 非浏览器(例如您的 Python 脚本)浏览器预期的内容(出于安全原因);你必须 spoof it, which is actually easy
  2. 多因素身份验证 - 您必须将其关闭(很简单,但您可能会被黑客入侵...)
  3. Session-cookie - aka security cookie; (不太容易得到)

你应该怎么做

使用 official google-drive API. Also, the Python client library has a nice tutorial and this page 描述如何从 google-驱动器下载文件。

如果您想编写更少的代码,那么像 PyDrive 这样的库会让您的生活更轻松。

希望对您有所帮助!

我可能会为您提供一个简单的解决方案,具体取决于身份验证要求。你是说

I only want certain users to be able to access it and do not want to publish it on the web

仅根据此声明,您可能足以为您的文档创建一个 "secret" link,并在您的用户中共享它。然后您可以轻松自动检索该文档,例如使用wget,并指定格式,例如csv:

wget -O data.csv "https://docs.google.com/spreadsheets/d/***SHARED-SECRET***/export?format=csv"

或者,在 Python (2) 中:

import urllib2
from cookielib import CookieJar

spreadsheet_url = "https://docs.google.com/spreadsheets/d/***SHARED-SECRET***/export?format=csv"
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(CookieJar()))
response = opener.open(spreadsheet_url) 
with open("data.csv", "wb") as f:
    f.write(response.read())

我实际上在生产中使用它,它工作可靠,没有伪造用户代理。