首页 > 解决方案 > 谷歌日历 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()

标签: pythongoogle-apigoogle-calendar-apigoogle-oauth

解决方案


这个改装怎么样?

不幸的是,在我的环境中,当我测试您提供的脚本时,我无法确认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_calendarofcreated_calendar = service.calendars().insert(body=calendar).execute()是一个对象。因此,当检索日历 ID 时,请使用created_calendar['id'].
  • 此答案假设这credentials.json是由“OAuth 客户端 ID”处的“创建凭据”下载的文件。
  • 如果出现授权相关的错误,请删除文件token.pickle并运行脚本,然后重新授权。

参考:


推荐阅读