我正在使用python urllib在Google日历(API V3)上发出请求。
现在,问题在于,当我提出“Events: list”请求时,虽然该日历中有事件,但我的回复项为零。
示例
{ "kind": "calendar#events",
"nextPageToken": "CigKGm83a292ZzZ2YXBsNXRsMHJhZnV2cGprdHVvGAEggIDA97TfuYYUGg0IABIAGOjEqd_6q7kC",
"items": [ ]
}
如果我在下一个请求中使用“ nextPageToken ”,则正常。(但我不想发出任何额外请求。)
每次都不会出现此问题。如果我创建新的email_id,这工作正常。但一两个月后,这个问题又重新出现了。
这是Google Calendar API中的错误吗?
或
是否有任何解决方案可以在一个请求中获取任何日历的事件列表?
提前致谢。
答案 0 :(得分:11)
我一直试图弄清楚同样的问题,我相信我有答案。
此处的问题是,当Google计算要返回的事件的“页面”时,它会在该计算中包含已删除的事件,并且您的第一页内容中包含您未看到的已删除事件,除非您的请求具有“showDeleted” =真“。
我为用户提供了一种“清除”日历并重新填充日历的方法,并遇到了这个问题。请考虑以下情况:
用户在其日历中有250个事件,为了论证,让Googles的“页面”大小相同。
当用户运行要重新填充的流程时,将删除这250个事件并创建250个“新”事件。
当我们接下来要在重新填充过程之前删除事件时,第一页返回时没有事件 - 这是因为列表中的前250个是最初删除的那些事件。 (我已使用API Explorer)
使用nextPageToken获取下一页结果的工作原理 - 正如您所指出的那样。
这就是为什么创建一个新日历可以工作一段时间 - 也就是说,直到你超过那个'page'限制并开始返回0个事件,这就是我们遇到问题的地方。
随着时间的推移,如果用户经常使用这种重新填充功能,他们的 已删除事件的列表可能会变得很大,而且需要很多 请求返回所有事件。 (我知道无法清除所有被删除的内容 完全来自Google Cal的活动 - 它们似乎永远存在)
我无法在一次通话中返回所有事件。您需要循环访问一次获取页面的过程,直到不再返回“NextPageToken”。这是有道理的,因为对于拥有1000个约会的巨大日历的用户来说,在一个请求中返回所有内容是低效的。
在这里使用Google Calendar API V3是我在VB.Net中使用的一个示例,用于删除所有事件。 (服务是Google.Apis.Calendar.v3.CalendarService)
Private Sub ClearAllEvents()
Dim pageToken As String = Nothing
Dim events As Events
Dim qry As New ListRequest(Service, GCalId)
Do
qry.PageToken = pageToken
events = qry.Execute()
For Each ev As [Event] In events.Items
Dim dr As New DeleteRequest(Service, GCalId, ev.Id)
dr.Execute()
Next
pageToken = events.NextPageToken
Loop While Not IsNothing(pageToken)
End Sub
答案 1 :(得分:1)
将showDeleted = false和pageToken = next_page_token添加到url并再次调用api。
答案 2 :(得分:1)
我遇到了类似的问题(gleng&#39答案中的完整描述)。我找到的唯一解决方案,我现在仍在使用它:只需添加一个参数(singleEvents=true
)即可。这将从日历API中删除空响应。祝你好运。
答案 3 :(得分:0)
这是C#版本
private void ClearAllEvents()
{
string pageToken = null;
Events events;
EventsResource.ListRequest qry = service.Events.List(CALENDAR_ID);
do
{
qry.PageToken = pageToken;
events = qry.Execute();
foreach(Event ev in events.Items)
{
service.Events.Delete(CALENDAR_ID, ev.Id).Execute();
}
pageToken = events.NextPageToken;
} while (pageToken != null);
}