Google Calendar API HttpError 404 для идентификатора календаря

Я использовал модифицированную версию кода Google Calendar API Python Quickstart, который какое-то время работал у меня нормально. Недавно у меня появился новый компьютер, и я перекидывал на него файлы. Теперь, когда я запускаю скрипт, я получаю HTTPError 404. Код ниже:

from __future__ import print_function
import httplib2
import os

from apiclient import discovery
from oauth2client import client
from oauth2client import tools
from oauth2client.file import Storage

import datetime

try:
    import argparse
    flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
    flags = None

# If modifying these scopes, delete your previously saved credentials
# at ~/.credentials/calendar-python-quickstart.json
SCOPES = 'https://www.googleapis.com/auth/calendar.readonly'
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'Google Calendar API Python Quickstart'


def get_credentials():
    """Gets valid user credentials from storage.

    If nothing has been stored, or if the stored credentials are invalid,
    the OAuth2 flow is completed to obtain the new credentials.

    Returns:
        Credentials, the obtained credential.
    """
    home_dir = os.path.expanduser('~')
    credential_dir = os.path.join(home_dir, '.credentials')
    if not os.path.exists(credential_dir):
        os.makedirs(credential_dir)
    credential_path = os.path.join(credential_dir,
                                   'calendar-python-quickstart.json')

    store = Storage(credential_path)
    credentials = store.get()
    if not credentials or credentials.invalid:
        flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
        flow.user_agent = APPLICATION_NAME
        if flags:
            credentials = tools.run_flow(flow, store, flags)
        else: # Needed only for compatibility with Python 2.6
            credentials = tools.run(flow, store)
        print('Storing credentials to ' + credential_path)
    return credentials

def main():
    """Shows basic usage of the Google Calendar API.

    Creates a Google Calendar API service object and outputs a list of the next
    10 events on the user's calendar.
    """
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    service = discovery.build('calendar', 'v3', http=http)

    now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC 
time
    print('Getting the upcoming 10 events')

"""Below, I switched out 'primary' with the calendarId of the calendar I 
actually wanted"""

    eventsResult = service.events().list(
        calendarId='[email protected]', timeMin=now, 
maxResults=10, singleEvents=True,
        orderBy='startTime').execute()
    events = eventsResult.get('items', [])

    if not events:
        print('No upcoming events found.')
    for event in events:
        start = event['start'].get('dateTime', event['start'].get('date'))
        print(start, event['summary'])

if __name__ == '__main__':
    main()

Я заметил, что когда я заменяю «calendarId» на «основной» вместо идентификатора календаря, который мне нужен, код работает нормально. Я не могу понять, почему я получаю сообщение об ошибке, когда точно такой же код отлично работал на моей предыдущей машине. Вот полное сообщение об ошибке ниже (отредактировано):

Traceback (most recent call last):
  File "C:\redacted.py", line 84, in <module>
    main()
  File "C:\redacted.py", line 73, in main
    orderBy='startTime').execute()
  File "C:\redacted\Python\Python36-32\lib\site-
   packages\oauth2client\_helpers.py", line 133, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "C:\redacted\Python\Python36-32\lib\site-
    packages\googleapiclient\http.py", line 844, in execute
    raise HttpError(resp, content, uri=self.uri)
  googleapiclient.errors.HttpError: <HttpError 404 when requesting 
    https://www.googleapis.com/calendar/v3/calendars/redacted=json returned 
    "Not Found">

Может ли кто-нибудь помочь объяснить, что мне не хватает?


person Chester Poon    schedule 02.03.2018    source источник
comment
Каково значение CalendarId, которое вы заменяете? Это должен быть адрес электронной почты пользователя, использующего ваше приложение. Кроме того, если вы обращаетесь к другому идентификатору календаря, отличному от его собственного, он должен быть предоставлен пользователю, который к нему обращается. Надеюсь это поможет.   -  person Mr.Rebot    schedule 03.03.2018
comment
Ах, это исправлено. Так просто и заставляет меня чувствовать себя таким глупым. Благодарю вас!   -  person Chester Poon    schedule 05.03.2018


Ответы (1)


Это должен быть адрес электронной почты пользователя, использующего ваше приложение. Кроме того, если вы обращаетесь к другому идентификатору календаря, отличному от его собственного, он должен быть предоставлен пользователю, который к нему обращается.

calendarId

  • Идентификатор календаря. Чтобы получить идентификаторы календаря, вызовите calendarList.list. метод. Если вы хотите получить доступ к основному календарю текущего пользователя, вошедшего в систему, используйте ключевое слово primary.

См. изображение ниже:

введите здесь описание изображения

Надеюсь это поможет.

person Mr.Rebot    schedule 06.03.2018
comment
должен быть адресом электронной почты пользователя, использующего ваше приложение [...], если вы обращаетесь к другому идентификатору календаря, отличному от его собственного, он должен быть передан пользователю, обращающемуся к нему - что, если это дополнительный календарь, который есть у пользователя, т.е. не их основной календарь (доступ к которому можно получить, передав их электронную почту или «основной»)? Я пытаюсь вставить новый дополнительный календарь с помощью .insert(), но получаю указанную выше ошибку. - person Zilbert97; 23.10.2020