#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
не существует). Будьте осторожны с этим.