Google 日历 API 创建事件时出现 400 错误
Google calendar API 400 error when creating event
我正在尝试使用 Google 日历 API 在 Python 3 中使用此处提供的文档创建一个事件:
- https://developers.google.com/calendar/quickstart/python
- https://developers.google.com/calendar/v3/reference/events#conferenceData
- https://developers.google.com/calendar/create-events
但是,我一直收到错误 400 错误请求,我不知道为什么。我的代码如下:
from pathlib import Path
from pickle import load
from pickle import dump
from google.auth.transport.requests import Request
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from uuid import uuid4
from typing import Dict, List
from oauth2client import file, client, tools
class EventPlanner:
"""
pass
"""
def __init__(self, guests: Dict[str, str], schedule: Dict[str, str]):
guests = [{"email": email} for email in guests.values()]
service = self._authorize()
self.event_states = self._plan_event(guests, schedule, service)
@staticmethod
def _authorize():
scopes = ["https://www.googleapis.com/auth/calendar"]
credentials = None
token_file = Path("./calendar_creds/token.pickle")
if token_file.exists():
with open(token_file, "rb") as token:
credentials = load(token)
if not credentials or not credentials.valid:
if credentials and credentials.expired and credentials.refresh_token:
credentials.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file('calendar_creds/credentials.json', scopes)
credentials = flow.run_local_server(port=0)
with open(token_file, "wb") as token:
dump(credentials, token)
calendar_service = build("calendar", "v3", credentials=credentials)
return calendar_service
@staticmethod
def _plan_event(attendees: List[Dict[str, str]], event_time, service: build):
event = {"summary": "test meeting",
"start": {"dateTime": event_time["start"]},
"end": {"dateTime": event_time["end"]},
"attendees": attendees,
"conferenceData": {"createRequest": {"requestId": f"{uuid4().hex}",
"conferenceSolutionKey": {"type": "hangoutsMeet"}}},
"reminders": {"useDefault": True}
}
event = service.events().insert(calendarId="primary", sendNotifications=True, body=event).execute()
return event
if __name__ == "__main__":
plan = EventPlanner({"test_guest": "test.guest@gmail.com"}, {"start": "2020-07-29T20:00:00-4:00",
"end": "2020-07-29T20:30:00-4:00"})
print(plan.event_states)
第一次认证成功。我还尝试了文档中提到的不同方法,但没有用。有谁知道我做错了什么?谢谢。
我认为您的问题原因如下。
修改点:
- 在 RFC3339 中,对于
start
的 dateTime
,请将 2020-07-29T20:00:00-4:00
修改为 2020-07-29T20:00:00-04:00
。另外,请将此修改为 end
的 dateTime
。
- 请添加时区。
修改后的脚本:
plan = EventPlanner({"test_guest": "test.guest@gmail.com"}, {"start": "2020-07-29T20:00:00-04:00", "end": "2020-07-29T20:30:00-04:00"})
和
time_zone = str(get_localzone())
event = {"summary": "test meeting",
"start": {"dateTime": event_time["start"], "timeZone": time_zone},
"end": {"dateTime": event_time["end"], "timeZone": time_zone},
"attendees": attendees,
"conferenceData": {"createRequest": {"requestId": f"{uuid4().hex}",
"conferenceSolutionKey": {"type": "hangoutsMeet"}}},
"reminders": {"useDefault": True}
}
注:
- 我不确定你所在的时区。所以我使用
get_localzone()
作为修改后的脚本。在这种情况下,也请使用 from tzlocal import get_localzone
。如果要更改时区,请修改上面的脚本。
- 此修改后的脚本假定您已经能够使用日历 API 在 Google 日历中创建新事件。请注意这一点。
参考文献:
我正在尝试使用 Google 日历 API 在 Python 3 中使用此处提供的文档创建一个事件:
- https://developers.google.com/calendar/quickstart/python
- https://developers.google.com/calendar/v3/reference/events#conferenceData
- https://developers.google.com/calendar/create-events
但是,我一直收到错误 400 错误请求,我不知道为什么。我的代码如下:
from pathlib import Path
from pickle import load
from pickle import dump
from google.auth.transport.requests import Request
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from uuid import uuid4
from typing import Dict, List
from oauth2client import file, client, tools
class EventPlanner:
"""
pass
"""
def __init__(self, guests: Dict[str, str], schedule: Dict[str, str]):
guests = [{"email": email} for email in guests.values()]
service = self._authorize()
self.event_states = self._plan_event(guests, schedule, service)
@staticmethod
def _authorize():
scopes = ["https://www.googleapis.com/auth/calendar"]
credentials = None
token_file = Path("./calendar_creds/token.pickle")
if token_file.exists():
with open(token_file, "rb") as token:
credentials = load(token)
if not credentials or not credentials.valid:
if credentials and credentials.expired and credentials.refresh_token:
credentials.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file('calendar_creds/credentials.json', scopes)
credentials = flow.run_local_server(port=0)
with open(token_file, "wb") as token:
dump(credentials, token)
calendar_service = build("calendar", "v3", credentials=credentials)
return calendar_service
@staticmethod
def _plan_event(attendees: List[Dict[str, str]], event_time, service: build):
event = {"summary": "test meeting",
"start": {"dateTime": event_time["start"]},
"end": {"dateTime": event_time["end"]},
"attendees": attendees,
"conferenceData": {"createRequest": {"requestId": f"{uuid4().hex}",
"conferenceSolutionKey": {"type": "hangoutsMeet"}}},
"reminders": {"useDefault": True}
}
event = service.events().insert(calendarId="primary", sendNotifications=True, body=event).execute()
return event
if __name__ == "__main__":
plan = EventPlanner({"test_guest": "test.guest@gmail.com"}, {"start": "2020-07-29T20:00:00-4:00",
"end": "2020-07-29T20:30:00-4:00"})
print(plan.event_states)
第一次认证成功。我还尝试了文档中提到的不同方法,但没有用。有谁知道我做错了什么?谢谢。
我认为您的问题原因如下。
修改点:
- 在 RFC3339 中,对于
start
的dateTime
,请将2020-07-29T20:00:00-4:00
修改为2020-07-29T20:00:00-04:00
。另外,请将此修改为end
的dateTime
。 - 请添加时区。
修改后的脚本:
plan = EventPlanner({"test_guest": "test.guest@gmail.com"}, {"start": "2020-07-29T20:00:00-04:00", "end": "2020-07-29T20:30:00-04:00"})
和
time_zone = str(get_localzone())
event = {"summary": "test meeting",
"start": {"dateTime": event_time["start"], "timeZone": time_zone},
"end": {"dateTime": event_time["end"], "timeZone": time_zone},
"attendees": attendees,
"conferenceData": {"createRequest": {"requestId": f"{uuid4().hex}",
"conferenceSolutionKey": {"type": "hangoutsMeet"}}},
"reminders": {"useDefault": True}
}
注:
- 我不确定你所在的时区。所以我使用
get_localzone()
作为修改后的脚本。在这种情况下,也请使用from tzlocal import get_localzone
。如果要更改时区,请修改上面的脚本。 - 此修改后的脚本假定您已经能够使用日历 API 在 Google 日历中创建新事件。请注意这一点。