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 必须包含事件的 startend 日期。

如何更新具有摘要的事件

  1. List 特定日历上的所有事件(primary 默认日历)
  2. 检查所有事件的 summary,直到找到与您的搜索匹配的事件
  3. 保留 idstartend 日期
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')
  1. 定义新摘要(以及要更新的所有字段)
  2. 定义 body request。它可以很容易地用 Try this API
  3. 构造
  4. 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()
  1. 打印result检查活动是否更新成功

一些笔记

我保留 startend 日期,因为它们对于 update 事件是强制性的。如果你想覆盖它们也可以,你不必事先存储它们,但我想给出一个可以适应更多情况的解决方案。

参考