python - 谷歌日历 API——“超出未经验证使用的每日限制。继续使用需要注册”
问题描述
我正在尝试编写一些 Python 代码来创建日历(在我自己的帐户中)并向其中添加事件。
我不断收到以下 403 错误:
Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup
当我创建新日历时不会发生这种情况:
created_calendar = service.calendars().insert(body=calendar).execute()
但是,当我尝试在刚刚创建的日历中创建事件时,确实会出现错误:
event = service.events().insert(calendarId=created_calendar, body=event).execute()
根据其他帮助线程,我已经进行了所有正确的身份验证(API 密钥、OAuth、服务帐户):
而且我的每日限制远远超出了我一直发送的请求数量:
我在创建我的 api 客户端时指定了 OAuth credentials.json 文件。在运行之前,我将GOOGLE_APPLICATION_CREDENTIALS
环境变量指向服务帐户密钥(也是 json)。
我不确定我还能如何验证自己...一些帮助真的很感激!
编辑
这是我的脚本(我相信是错误的最小示例)以防万一:
import datetime
import pytz
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
# If modifying these scopes, delete the file token.pickle.
# Add .readonly for read only
SCOPES = ['https://www.googleapis.com/auth/calendar']
def build_cal_service():
creds = None
# The file token.pickle stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
# Save the credentials for the next run
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
service = build('calendar', 'v3', credentials=creds)
return service
def main():
service = build_cal_service()
calendar = {
'summary': 'TEST CAL',
'timeZone': 'America/Los_Angeles'
}
created_calendar = service.calendars().insert(body=calendar).execute()
time = datetime.datetime(
year=2019,
month=11,
day=9,
hour=21,
tzinfo=pytz.timezone('US/Pacific'))
event = {
'summary': 'test summary',
'description': 'test description.',
'start': {
'dateTime': time.isoformat(),
},
'end': {
'dateTime': (time + datetime.timedelta(hours=1)).isoformat(),
},
'attendees': [
{'email': 'test1@example.com'},
{'email': 'test2@example.com'},
],
}
event = service.events().insert(calendarId=created_calendar, body=event).execute()
解决方案
这个改装怎么样?
不幸的是,在我的环境中,当我测试您提供的脚本时,我无法确认Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup
. 但我认为在你的脚本中,event = service.events().insert(calendarId=created_calendar, body=event).execute()
会发生错误。那么下面的修改呢?
从:
event = service.events().insert(calendarId=created_calendar, body=event).execute()
到:
event = service.events().insert(calendarId=created_calendar['id'], body=event).execute()
笔记:
created_calendar
ofcreated_calendar = service.calendars().insert(body=calendar).execute()
是一个对象。因此,当检索日历 ID 时,请使用created_calendar['id']
.- 此答案假设这
credentials.json
是由“OAuth 客户端 ID”处的“创建凭据”下载的文件。 - 如果出现授权相关的错误,请删除文件
token.pickle
并运行脚本,然后重新授权。
参考:
推荐阅读
- julia - 从目录中读取多个txt文件
- nginx - Nginx:Error_log 和 Access_log 最大大小
- typescript - Vue Typescript 组件 Jest 测试不会在 html 中呈现值
- python - 如何将 int64 转换为日期时间?
- c - 验证输入和重复语句
- python - ValueError:两个形状中的维度 2 必须相等,但为 512 和 511。形状为 [?,384,512] 和 [?,384,511]
- php - Laravel Eloquent Join On Exists 查询
- scala - 如何在执行期间计算的列上应用火花窗口函数
- python - 从 matplotlib 画布中删除 hspace 和 vspace
- parse-platform - 无需登录用户即可调用云代码 Parse Server JS SDK