12

有人可以给我一个关于如何让 Google Calendar API v3 与 Python 客户端一起工作的明确解释吗?具体来说,最初的 OAuth 阶段让我非常困惑。我需要做的就是访问我自己的日历,阅读它并对其进行更改。Google 提供了此代码来配置我的应用程序:

import gflags
import httplib2

from apiclient.discovery import build
from oauth2client.file import Storage
from oauth2client.client import OAuth2WebServerFlow
from oauth2client.tools import run

FLAGS = gflags.FLAGS

# Set up a Flow object to be used if we need to authenticate. This
# sample uses OAuth 2.0, and we set up the OAuth2WebServerFlow with
# the information it needs to authenticate. Note that it is called
# the Web Server Flow, but it can also handle the flow for native
# applications
# The client_id and client_secret are copied from the API Access tab on
# the Google APIs Console
FLOW = OAuth2WebServerFlow(
    client_id='YOUR_CLIENT_ID',
    client_secret='YOUR_CLIENT_SECRET',
    scope='https://www.googleapis.com/auth/calendar',
    user_agent='YOUR_APPLICATION_NAME/YOUR_APPLICATION_VERSION')

# To disable the local server feature, uncomment the following line:
# FLAGS.auth_local_webserver = False

# If the Credentials don't exist or are invalid, run through the native client
# flow. The Storage object will ensure that if successful the good
# Credentials will get written back to a file.
storage = Storage('calendar.dat')
credentials = storage.get()
if credentials is None or credentials.invalid == True:
  credentials = run(FLOW, storage)

# Create an httplib2.Http object to handle our HTTP requests and authorize it
# with our good Credentials.
http = httplib2.Http()
http = credentials.authorize(http)

# Build a service object for interacting with the API. Visit
# the Google APIs Console
# to get a developerKey for your own application.
service = build(serviceName='calendar', version='v3', http=http,
       developerKey='YOUR_DEVELOPER_KEY')

但是(a)这对我来说完全没有意义;评论解释很糟糕,而且(b)我不知道在变量中放什么。我已经在 Google 上注册了我的程序并注册了一个服务帐户密钥。但给我的只是一个要下载的加密密钥文件和一个客户端 ID。我不知道什么是“developerKey”,或者什么是“client_secret”?那是关键吗?如果是,我如何获得它,因为它实际上包含在加密文件中?最后,考虑到我使用 API 的相对简单的目标(即,它不是多用户、多访问操作),有没有更简单的方法可以做到这一点?谢谢。

4

2 回答 2

13

一个简单的(阅读:我已经完成的方式)方法是创建一个 Web 应用程序而不是一个服务帐户。这可能听起来很奇怪,因为您不需要任何类型的 Web 应用程序,但我以与您相同的方式使用它 - 对我自己的日历/添加事件/等进行一些查询。- 全部来自命令行,无需任何类型的网络应用程序交互。有一些方法可以使用服务帐户来完成(如果你确实想走那条路线,我会修改),但到目前为止这对我有用。

创建 Web 应用程序后,您将获得上述所有信息(旁注:上面的示例代码基于 Web 应用程序 - 要使用您FLOW需要调用的服务帐户flow_from_clientsecrets并需要进行进一步调整 - 请参阅在这里)。因此,您将能够填写此部分:

FLOW = OAuth2WebServerFlow(
    client_id='YOUR_CLIENT_ID',
    client_secret='YOUR_CLIENT_SECRET',
    scope='https://www.googleapis.com/auth/calendar',
    user_agent='YOUR_APPLICATION_NAME/YOUR_APPLICATION_VERSION')

您现在可以填写您在 API 控制台中看到的值(client_id= 整个Client ID字符串,client_secret= 客户端密码,scope是相同的,user_agent可以是您想要的任何值)。至于这一service行,developerKey您可以Simple API Access在 API 控制台的部分下找到 API 密钥(标签为API key):

service = build(serviceName='calendar', version='v3', http=http, 
    developerKey='<your_API_key>')

然后,您可以添加一个简单的检查,如下所示,看看它是否有效:

events = service.events().list(calendarId='<your_email_here>').execute()
print events

现在,当您运行此程序时,将弹出一个浏览器窗口,允许您完成身份验证流程。这意味着所有身份验证都将由 Google 处理,并且身份验证响应信息将存储在calendar.dat. 该文件(将与您的脚本存储在同一目录中)将包含服务现在将使用的身份验证信息。这就是这里的情况:

storage = Storage('calendar.dat')
credentials = storage.get()
if credentials is None or credentials.invalid == True:
  credentials = run(FLOW, storage)

它通过查找该文件并验证内容来检查是否存在有效凭据(这一切都从您那里抽象出来,以便于实现)。在您进行身份验证后,该if语句将进行评估False,您将能够访问您的数据而无需再次进行身份验证。

希望这对这个过程有更多的了解——长话短说,制作一个 Web 应用程序并使用其中的参数,验证一次然后忘记它。我敢肯定我忽略了很多要点,但希望它适用于您的情况。

于 2012-12-28T06:23:32.100 回答
-1

Google 现在有一个很好的示例应用程序,可以让您轻松启动并运行。它在他们的 入门页面上以“5 分钟体验 - 快速入门”的形式提供。

如果您在没有浏览器的远程服务器上工作,它将为您提供直接访问的 URL。

于 2013-10-03T16:24:01.813 回答