Ошибка Http 403: запрос сведений содержал недостаточные области аутентификации для объявлений Google в классе

#google-classroom

#google-classroom

Вопрос:

Я использую Python Google Classroom API для извлечения данных объявлений. Вот мой код.

 from fetch import Fetch
from googleapiclient.discovery import build

cred = 'catp.json'
get_credits = Fetch(cred) #fetching credential data
credit = get_credits()

service = build('Classroom', 'v1', credentials=credit)
setup = service.courses()
data = setup.list().execute()['courses']
course_names = []
course_ids = []
for i in range(len(data)):
      course_names.append(data[i]['name'])
      course_ids.append(data[i]['id'])

announcement_data = setup.announcements().list(courseId=course_ids[0]).execute()
 

Но я получаю следующую ошибку обратной трассировки:
Ошибка обратной трассировки

Дополнительная информация: Мой проект зарегистрирован под учетной записью службы. Моя роль — владелец. У меня есть учетная запись учащихся в Google Classroom.

Чтобы проверить, будет ли вызвана та же ошибка, если я попытаюсь получить доступ к объявлениям из учетной записи учителя, я создал курс в классе, используя свою учетную запись учащихся, и разместил несколько демонстрационных объявлений. Результатом была та же ошибка TracebackError. Я также попытался получить доступ к данным с помощью API Explorer от Google, передав тот же идентификатор курса в качестве аргумента. Данные были получены нормально, без каких-либо ошибок.

[Редактировать] Вот код для получения учетных данных, Fetch (cred):

 import os
import pickle
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

class Fetch:
      def __init__ (self, credential_filename):
            self.scopes = ['https://www.googleapis.com/auth/classroom.courses.readonly',
                           'https://www.googleapis.com/auth/classroom.announcements',
                           ]
            self.path = 'C:/frank/programs/python/google api'
            self.credential_file = credential_filename

      def __call__(self):
            os.chdir(self.path)

         
            token = open('token.pickle', 'rb')
            creds = pickle.load(token)

            if creds.valid == False:
                  if creds.expired == True:
                        creds.refresh(Request())
                  else:
                        try:
                              flow = InstalledAppFlow.from_client_secrets_file(self.credential_file, self.scopes)
                              creds = flow.run_local_server(port=0)
                        except FileNotFoundError:
                              print(f'{self.credential_file} does not exist')

                        token = open(self.token_file, 'wb')
                        pickle.dump(creds, token)
            return creds
 

                   
        
              
                       
 

Комментарии:

1. Пожалуйста, укажите код, связанный с Fetch(cred) . Скорее всего, вы не предоставляете соответствующие области, как указано в ошибке. Должен быть как минимум один из них: https://www.googleapis.com/auth/classroom.announcements , https://www.googleapis.com/auth/classroom.announcements.readonly . Кроме того, я не уверен, что вы можете использовать учетную запись службы для доступа к этому API (если не выдавать себя за кого-либо), но сначала о главном.

2. Я не могу воспроизвести это. Если я использую эти области, я могу announcements: list успешно выполнить вызов. Я думаю, что вы, возможно, изменили области после создания файла token.pickle , и в этом случае дальнейшее изменение области не обнаружено. Чтобы убедиться, что это так, пожалуйста, удалите файл token.pickle и повторите попытку аутентификации.

3. Кроме того, для процесса аутентификации я использовал не ваш точный код def Fetch , а тот, который был получен из быстрого запуска Python , поскольку ваш вызывал дополнительные ошибки (например, сбой, когда token.pickle не существует). Будьте осторожны с этим.