Ошибка API Google для quickstart.py KeyError: '_module'
Использование API Gmail. Мой секретный файл клиента загружается и работает на Ruby. Когда я пытаюсь выполнить версию quickstart.py(python), я получаю эту ошибку
File "quickstart.py", line 70, in <module>
main()
File "quickstart.py", line 55, in main
credentials = get_credentials()
File "quickstart.py", line 38, in get_credentials
credentials = store.get()
File "/Library/Python/2.7/site-packages/oauth2client/client.py", line 374, in get
return self.locked_get()
File "/Library/Python/2.7/site-packages/oauth2client/file.py", line 79, in locked_get
credentials = Credentials.new_from_json(content)
File "/Library/Python/2.7/site-packages/oauth2client/client.py", line 281, in new_from_json
module = data['_module']
KeyError: '_module'
Я вообще не изменил файл, просто добавил client_secret.json в этот рабочий каталог, а также установил google-api-python-client. Мой код python появился здесь: https://developers.google.com/gmail/api/quickstart/python
Ответы
Ответ 1
oauth2client пытается загрузить учетные данные из json файла с неправильной структурой.
Возможно, клиент Ruby использует другой формат файла, но я был бы удивлен. Вы уверены, что случайно не сохранили client_secret.json
как ~/.credentials/gmail-quickstart.json
?
Независимо, удаление ~/.credentials/gmail-quickstart.json
и повторная аутентификация будут генерировать новый файл учетных данных с правильной структурой.
Ответ 2
Попробуйте заменить creds = store.get()
на creds = None
временно. Если это работает, вы можете реорганизовать свой код, чтобы всегда начинать с создания экземпляров учетных данных на основе потока. Это сработало для меня. Похоже, что образцы Google не синхронизированы с их oauth2client.
Ответ 3
Я сам изучаю Python и имею аналогичную проблему, но с Пример API календаря. Оказалось, что это была опечатка в отношении СФЕРА.
## Typo - Invalid definition
SCOPES = 'https://ww.googleapies.com/auth/calendar.readonly'
## Correct Value for SCOPE
SCOPES = 'https://www.googleapis.com/auth/calendar'
Кроме того, Мэтт ответ поможет мне в правильном направлении. Gmail-quickstart.json - это не то же самое, что и client_secret.json. Client_secret.json позволяет вам сделать запрос на токен OAuth2. В то время как gmail-quickstart.json содержит выданный токен и метаданные, связанные с ним. Gmail-quickstart.json не создается до успешного входа в систему.
Последняя мысль: для успешного входа в систему приложение quickstart.py запустило экземпляр моего веб-браузера (Firefox) и перешло на экран входа в Google. Чтобы Firefox работал правильно, мне сначала нужно было установить свою DISPLAY-переменную.
$ export DISPLAY=:0
$ xhost +
access control disabled, clients can connect from any host
Ответ 4
Я решил это, переместив client_secret.json в тот же каталог, что и файл py, который пытается его прочитать (quickstart.py), мой был на рабочем столе, а я сохранил json в Documents. Я спас Джессона и на рабочем столе, и на мальчика, Он летел!.
Я не знаю, почему это не работает, когда они находятся в разных каталогах, а определение пользовательского credential_path не помогает.
Ответ 5
Я следовал нескольким рекомендациям, перечисленным здесь:
-
перемещение client_secret.json в ту же директорию, где находится py файл, который пытается его прочитать, в соответствии с рекомендациями simic0de.
-
Работая с идеей skirill, вместо того, чтобы полностью исключить 'credentials = store.get()', я решил обработать исключение, чтобы оно работало с созданием на основе потока учетных данных.
Окончательный код:
try:
credentials = store.get()
except:
print('Working with flow-based credentials instantiation')
Вы можете написать свой собственный код в строке исключений. Такой подход позволит команде store.get() работать при соблюдении условий.