当前位置: 首页 > 知识库问答 >
问题:

Google Calendar Python API服务号不返回任何结果

李凯定
2023-03-14

我正在尝试下载我的用户可以看到的谷歌日历列表。我已经设置了一个服务帐户,并且我有以下代码(适用于分析API的其他帐户):

from apiclient.discovery import build
from oauth2client.client import SignedJwtAssertionCredentials
import pprint

def prepare_credentials():
    f = file(keyFilePath, 'rb')
    key = f.read()
    f.close()
    credentials = SignedJwtAssertionCredentials(
        service_account_email_address, key,
        scope='https://www.googleapis.com/auth/calendar.readonly')
    return credentials
http = httplib2.Http()
credentials = prepare_credentials()
http = credentials.authorize(http)
service = build('calendar', 'v3', http=http)
httpRequest = service.calendarList().list()
data = httpRequest.execute()
pprint.pprint(data)

这导致:

{u'etag': u'"YXs7dfDSFSFD9F0k/sofIhuT4dSLyxKaRH7vNpx5BOEU"',
u'items': [],
u'kind': u'calendar#calendarList',
u'nextSyncToken': u'00001405024697194000'}

问题是,我知道我可以访问日历,我甚至使用了这个页面的“尝试它!”部分:https://developers.google.com/google-apps/calendar/v3/reference/calendarList/list,它返回预期的结果,大约10个日历。我尝试了不同版本的范围参数(‘https://www.googleapis.com/auth/calendar.readonly’和[‘https://www.googleapis.com/auth/calendar’、‘https://www.googleapis.com/auth/calendar.readonly’),我还尝试将我自己的电子邮件地址添加为“prn”和“sub”参数,所有这些都会给我“访问拒绝”错误。我不明白为什么我可以使用我的服务号获得授权,但无法实际查看结果,而这些结果可以通过不同的身份验证方法清晰地查看。

我做错了什么?

共有3个答案

双恩
2023-03-14

经过一些挖掘,您可以允许您域外的用户(api服务帐户)访问google日历。

在中检查以下设置:Google Admin、Google Apps、Calendar、Share Settings,然后选择以下选项之一:

( ) Only free/busy information (hide event details) Default
( ) Share all information, but outsiders cannot change calendars  
(X) Share all information, and outsiders can change calendars
( ) Share all information, and allow managing of calendars

然后,您可以在与特定人员共享下的每个单独的日历共享设置中将您的日历共享到api服务

这是如何帮助别人的。

尹善
2023-03-14

只有使用此用户的凭据执行呼叫时,才能看到特定用户的日历列表。服务帐户将始终为您提供属于该服务帐户的日历列表。如果您想访问日历列表,我建议您对您的帐户使用Oauth2令牌。

桑坚成
2023-03-14

只是想用我最终使用的解决方案更新这个问题。

如果您希望服务帐户能够在日历上拥有所有者权限,那么似乎唯一的方法是在作为服务帐户进行身份验证时使用API创建辅助日历(https://developers.google.com/google-apps/calendar/v3/reference/calendars/insert). 服务帐户没有其所有者的任何主日历,但它将是新的辅助日历的所有者。

然后可以使用访问控制规则APIendpoint(https://developers.google.com/google-apps/calendar/v3/reference/acl/insert)使用您自己的Google帐户(或任何可以登录以在浏览器中查看日历的非服务帐户)共享此日历。新用户也可以设置为所有者。

编辑:以下解决方案不准确。

这不是问题,但我在任何地方都找不到,我想人们可能会想知道,所以我也在这里回答:

如果您希望与会者在插入或更新活动时收到电子邮件通知,那么将“sendNotifications”参数设置为True并不是唯一需要做的事情。与该用户共享日历后,用户还需要进入服务帐户日历的“日历设置”,并在“提醒和通知”选项卡中激活电子邮件通知。

编辑:这是不准确的。任何更改设置以在此日历上接收通知的人都会收到通知,无论他们是否被邀请参加活动。我还没有找到通过带有服务号的API邀请人们参加活动的方法,并且只有受邀者收到邀请电子邮件。我将在StackOverflow上就此提出另一个问题。

 类似资料:
  • [root@externalsystem~]#curl-xpost-h'请求:{“request”:“prepareandexecute”,“connectionid”:“000000-0000-0000-00000000”,“stateMentID”:12345,“sql”:“select*FROM questtweets1”,“maxrowcount”:1}'http://here.comes

  • 我正在创建一个Android应用程序,它使用BLE与MCU进行通信,目前我可以使用我的应用程序与MCU建立连接,但当我试图发现并获取设备的服务时,我返回了一个空数组,并且不确定原因。 输出: 09-26 16:33:09.648 10917-10931/bamboomobile.medheadI/TAG:连接到GATT服务器。 09-26 16:33:09.648 10917-10931/bamb

  • 我试图在我的代码中实现这个引导表,但我最不喜欢它。在添加行侧页码“server”之前,我将返回结果。那我什么也得不到。代码 服务器端代码 我花了两天时间摆弄这张桌子。请,任何有经验的人,任何形式的帮助或指导都将不胜感激。

  • 我一直在使用异步任务来访问web服务器,并使用结果更新控件。这有缺点,即它使异步方法特定于控件,并阻止我再次使用返回的字符串。 我的典型asyncTask代码如下

  • 问题内容: 我的样子 当我看起来像 我有一条路线 我的控制器看起来像 当我运行我的应用程序时,我看到console.log为 我在这里做错了什么? 问题答案: 是异步的。它立即返回一个空数组,并在响应到达时稍后从请求中添加结果- 来自http://docs.angularjs.org/api/ngResource.$resource: 重要的是要意识到调用$ resource对象方法会立即返回空引

  • 本文向大家介绍Dapper.NET 执行不返回任何结果的命令,包括了Dapper.NET 执行不返回任何结果的命令的使用技巧和注意事项,需要的朋友参考一下 示例