如何在不与服务帐户共享工作表的情况下连接到Google表格?

时间:2015-09-25 20:17:54

标签: python oauth-2.0 google-sheets ipython-notebook

我一直在尝试编写一个python(IPython Notebook)脚本来访问和处理Google表格数据。

我已查看了gspread(http://gspread.readthedocs.org/en/latest/oauth2.html),但所描述的流程要求电子表格与注册的Google服务帐户(客户端电子邮件)共享。这不起作用,因为我的公司谷歌表不允许与"外部"账户。

但是,似乎有一种方法可以启用此处所述的访问(身份验证):https://developers.google.com/drive/web/quickstart/python

然而我无法弄清楚如何在IPython笔记本中做到这一点,因为示例代码似乎需要命令行参数(我不明白)。

有人可以提供一些关于如何使用服务帐户访问Google表格而不的示例吗?

1 个答案:

答案 0 :(得分:1)

进一步搜索后,似乎这个问题已在这里得到解答: gspread/OAuth2: authenticated default gmail account (used early in ClientLogin) 解决方案来自: http://www.indjango.com/access-google-sheets-in-python-using-gspread/#comment-2026863410

基本上这只需要使用谷歌创建一个Web应用程序客户端ID。客户端ID和机密可以在身份验证流程中使用,如下所示:

from oauth2client.client import OAuth2WebServerFlow
from oauth2client.tools import run
from oauth2client.file import Storage
CLIENT_ID = '<CLIENTID_FROM_GOOGLE_DEVLOPER_CONSOLE>'
CLIENT_SECRET = '<CLIENTSECRET_FROM_GOOGLE_DEVLOPER_CONSOLE>'
flow = OAuth2WebServerFlow(client_id=CLIENT_ID,
                           client_secret=CLIENT_SECRET,
                           scope='https://spreadsheets.google.com/feeds',
                           redirect_uri='http://localhost:8080/')
storage = Storage('mycredentials.data')
credentials = run(flow, storage)
import requests
import gspread, ast
from oauth2client.client import AccessTokenCredentials
data = {
    'refresh_token' : credentials.refresh_token,
    'client_id' : credentials.client_id,
    'client_secret' : credentials.client_secret,
    'grant_type' : 'refresh_token',
}
r = requests.post('https://accounts.google.com/o/oauth2/token', data = data)
try :
    credentials.access_token = ast.literal_eval(r.text)['access_token']
except Exception: 
    pass;
gc = gspread.authorize(credentials)

到目前为止,gc应该适合用于gspread活动。此流程需要两个依赖项:

pip install python-gflags oauth2client

我不确定是否收到以下警告:

WARNING:root:This function, oauth2client.tools.run(), and the use of the gflags library are deprecated and will be removed in a future version of the library.

不确定最新的做法是什么?