Google 日历 API 获取更新继续提供 404
Google calendar API get to update keep on giving 404
我正在尝试获取日历事件,以便我可以将其更新为文档 shows。
我的假设是这样的事件 JSON:
{
'kind': 'calendar#event',
'etag': '"32...000"',
'id': '6oo....jsa',
'status': 'confirmed',
'htmlLink': 'https://www.google.com/calendar/event?eid=Nm...YjhAZw',
'created': '2021-02-25T20:13:18.000Z',
'updated': '2021-02-28T01:21:43.762Z',
'summary': 'code',
'creator': {
'email': 'example@gmail.com'
},
'organizer': {
'email': 'abc@group.calendar.google.com',
'displayName': 'Website',
'self': True
},
'start': {
'dateTime': '2021-02-27T23:30:00-05:00'
},
'end': {
'dateTime': '2021-02-28T00:00:00-05:00'
},
'iCalUID': 'xyz@google.com',
'sequence': 27,
'reminders': {
'useDefault': True
},
'eventType': 'default'
}
calendarId 将是 iCalUID
& eventId 将是 id
甚至是日历之后的 id url。但是,从 google API 平台交替尝试这两种方法会继续提供:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "notFound",
"message": "Not Found"
}
],
"code": 404,
"message": "Not Found"
}
}
我应该怎么做?
我的最终目标是修改事件的 summary
、startTime 和 endTime 用于任何具有 calendarID 和 eventID 的事件,因此我的代码:
def modifying():
credentials = google.oauth2.credentials.Credentials(
**flask.session['credentials'])
flask.session['credentials'] = credentials_to_dict(credentials)
service = build('calendar', 'v3', credentials=credentials)
event = {
'summary': 'modified',
'location': '',
'description': '',
'start': {
'dateTime': '2021-02-27T17:09:25.993663-05:00',
'timeZone': 'America/Los_Angeles',
},
'end': {
'dateTime': '2021-02-27T21:09:25.993663-05:00',
'timeZone': 'America/Los_Angeles',
}
}
try:
events_result =service.calendarList().list().execute()
events = events_result.get('items', [])
Ids = [item['id'] for item in events] #do this so it can search across all calendars & not just 'primary'
service.events().update(calendarId=Ids, eventId='6oo....jsa', body=event).execute()
return 200
except Exception as err:
print(err)
return {"message":"Server under maintenance"}
P.S: 我已经尝试了 SO post 中的所有解决方案,如图所示。
首先你正在做 calendarlist.list
events_result =service.calendarList().list().execute()
哪个Returns the calendars on the user's calendar list.
作为日历资源列表的响应
然后您似乎在尝试更新日历列表响应 return 编辑的第一个日历上的静态事件 ID“6oo....jsa”。
service.events().update(calendarId=Ids, eventId='6oo....jsa', body=event).execute()
您究竟是如何知道这个静态事件 ID 甚至是该日历的一部分的?这就是为什么您收到 404 它不存在的原因。
为什么不做一个 events.list 以获得日历上的事件列表。如果您不介意出错,甚至更好,只需在日历上为您的静态事件 ID 执行 event.get。
顺便说一句 event.list 不会 return 响应中的日历 ID,因为它假设您已经知道日历 ID,因为您使用它首先获取事件。
解决方案
要update一个事件 Python 你需要使用日历服务的方法 update
:
service.events().update(calendarId=calendarId, eventId=eventId, body=body).execute()
request body
必须包含事件的 start
和 end
日期。
如何更新具有摘要的事件
- List 特定日历上的所有事件(
primary
默认日历)
- 检查所有事件的
summary
,直到找到与您的搜索匹配的事件
- 保留
id
、start
和 end
日期
summarySearch = 'old summary'
events = service.events().list(calendarId=calendarId).execute()
for ev in events['items']:
try:
print(ev['summary'])
if ev['summary'] == summarySearch:
eventId = ev['id']
startDate = ev['start']['date']
endDate = ev['end']['date']
except:
print('empty summary')
- 定义新摘要(以及要更新的所有字段)
- 定义
body request
。它可以很容易地用 Try this API 构造
- Update 事件
#startDate = '2021-02-16' # uncomment to overwrite
#endDate = '2021-02-18' # uncomment to overwrite
summary = 'new summary'
body = {
'start': {'date': startDate},
'end': {'date': endDate},
'summary': summary
}
result = service.events().update(calendarId=calendarId, eventId=eventId, body=body).execute()
- 打印
result
检查活动是否更新成功
一些笔记
我保留 start
和 end
日期,因为它们对于 update 事件是强制性的。如果你想覆盖它们也可以,你不必事先存储它们,但我想给出一个可以适应更多情况的解决方案。
参考
我正在尝试获取日历事件,以便我可以将其更新为文档 shows。
我的假设是这样的事件 JSON:
{
'kind': 'calendar#event',
'etag': '"32...000"',
'id': '6oo....jsa',
'status': 'confirmed',
'htmlLink': 'https://www.google.com/calendar/event?eid=Nm...YjhAZw',
'created': '2021-02-25T20:13:18.000Z',
'updated': '2021-02-28T01:21:43.762Z',
'summary': 'code',
'creator': {
'email': 'example@gmail.com'
},
'organizer': {
'email': 'abc@group.calendar.google.com',
'displayName': 'Website',
'self': True
},
'start': {
'dateTime': '2021-02-27T23:30:00-05:00'
},
'end': {
'dateTime': '2021-02-28T00:00:00-05:00'
},
'iCalUID': 'xyz@google.com',
'sequence': 27,
'reminders': {
'useDefault': True
},
'eventType': 'default'
}
calendarId 将是 iCalUID
& eventId 将是 id
甚至是日历之后的 id url。但是,从 google API 平台交替尝试这两种方法会继续提供:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "notFound",
"message": "Not Found"
}
],
"code": 404,
"message": "Not Found"
}
}
我应该怎么做?
我的最终目标是修改事件的 summary
、startTime 和 endTime 用于任何具有 calendarID 和 eventID 的事件,因此我的代码:
def modifying():
credentials = google.oauth2.credentials.Credentials(
**flask.session['credentials'])
flask.session['credentials'] = credentials_to_dict(credentials)
service = build('calendar', 'v3', credentials=credentials)
event = {
'summary': 'modified',
'location': '',
'description': '',
'start': {
'dateTime': '2021-02-27T17:09:25.993663-05:00',
'timeZone': 'America/Los_Angeles',
},
'end': {
'dateTime': '2021-02-27T21:09:25.993663-05:00',
'timeZone': 'America/Los_Angeles',
}
}
try:
events_result =service.calendarList().list().execute()
events = events_result.get('items', [])
Ids = [item['id'] for item in events] #do this so it can search across all calendars & not just 'primary'
service.events().update(calendarId=Ids, eventId='6oo....jsa', body=event).execute()
return 200
except Exception as err:
print(err)
return {"message":"Server under maintenance"}
P.S: 我已经尝试了 SO post 中的所有解决方案,如图所示。
首先你正在做 calendarlist.list
events_result =service.calendarList().list().execute()
哪个Returns the calendars on the user's calendar list.
作为日历资源列表的响应
然后您似乎在尝试更新日历列表响应 return 编辑的第一个日历上的静态事件 ID“6oo....jsa”。
service.events().update(calendarId=Ids, eventId='6oo....jsa', body=event).execute()
您究竟是如何知道这个静态事件 ID 甚至是该日历的一部分的?这就是为什么您收到 404 它不存在的原因。
为什么不做一个 events.list 以获得日历上的事件列表。如果您不介意出错,甚至更好,只需在日历上为您的静态事件 ID 执行 event.get。
顺便说一句 event.list 不会 return 响应中的日历 ID,因为它假设您已经知道日历 ID,因为您使用它首先获取事件。
解决方案
要update一个事件 Python 你需要使用日历服务的方法 update
:
service.events().update(calendarId=calendarId, eventId=eventId, body=body).execute()
request body
必须包含事件的 start
和 end
日期。
如何更新具有摘要的事件
- List 特定日历上的所有事件(
primary
默认日历) - 检查所有事件的
summary
,直到找到与您的搜索匹配的事件 - 保留
id
、start
和end
日期
summarySearch = 'old summary'
events = service.events().list(calendarId=calendarId).execute()
for ev in events['items']:
try:
print(ev['summary'])
if ev['summary'] == summarySearch:
eventId = ev['id']
startDate = ev['start']['date']
endDate = ev['end']['date']
except:
print('empty summary')
- 定义新摘要(以及要更新的所有字段)
- 定义
body request
。它可以很容易地用 Try this API 构造
- Update 事件
#startDate = '2021-02-16' # uncomment to overwrite
#endDate = '2021-02-18' # uncomment to overwrite
summary = 'new summary'
body = {
'start': {'date': startDate},
'end': {'date': endDate},
'summary': summary
}
result = service.events().update(calendarId=calendarId, eventId=eventId, body=body).execute()
- 打印
result
检查活动是否更新成功
一些笔记
我保留 start
和 end
日期,因为它们对于 update 事件是强制性的。如果你想覆盖它们也可以,你不必事先存储它们,但我想给出一个可以适应更多情况的解决方案。