使用 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
是空的。
我做错了什么?
您尝试做的事情实际上可能是可行的,但这里有 一些 原因,为什么它会很重要(绝不是完整列表):
- Google 通常会阻止
user-agents
非浏览器(例如您的 Python 脚本)浏览器预期的内容(出于安全原因);你必须 spoof it, which is actually easy
- 多因素身份验证 - 您必须将其关闭(很简单,但您可能会被黑客入侵...)
- 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())
我实际上在生产中使用它,它工作可靠,没有伪造用户代理。
我想下载我的 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
是空的。
我做错了什么?
您尝试做的事情实际上可能是可行的,但这里有 一些 原因,为什么它会很重要(绝不是完整列表):
- Google 通常会阻止
user-agents
非浏览器(例如您的 Python 脚本)浏览器预期的内容(出于安全原因);你必须 spoof it, which is actually easy - 多因素身份验证 - 您必须将其关闭(很简单,但您可能会被黑客入侵...)
- 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())
我实际上在生产中使用它,它工作可靠,没有伪造用户代理。