wake-up-neo.net

Google API quickstart.py error KeyError: '_module'

Verwenden der Google Mail-API. Meine geheime Clientdatei wird heruntergeladen und arbeitet für Ruby. Wenn ich die quickstart.py (python) -Version versuche, erhalte ich diese Fehlermeldung

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'

Ich habe die Datei überhaupt nicht geändert, ich habe lediglich das client_secret.json zu diesem Arbeitsverzeichnis hinzugefügt und auch den google-api-python-client installiert. Mein Python-Code stammt von hier: https://developers.google.com/gmail/api/quickstart/python

30
ElioRubens

oauth2client versucht, Anmeldeinformationen aus einer Json-Datei mit einer falschen Struktur zu laden.

Vielleicht verwendet der Ruby-Client ein anderes Dateiformat, aber ich wäre überrascht. Sind Sie sicher, dass Sie client_secret.json nicht versehentlich als ~/.credentials/gmail-quickstart.json gespeichert haben?

Unabhängig davon wird durch das Entfernen von ~/.credentials/gmail-quickstart.json und die erneute Authentifizierung eine neue Berechtigungsnachweisdatei mit der richtigen Struktur erstellt.

11
Matt

Versuchen Sie, creds = store.get() vorübergehend durch creds = None zu ersetzen. Wenn dies funktioniert, können Sie Ihren Code so umgestalten, dass er immer mit der flussbasierten Instantiierung von Anmeldeinformationen beginnt. Das hat bei mir funktioniert. Es scheint, dass Google-Samples nicht mit ihrem oauth2client synchron sind.

7
skirill

Ich löste das Problem, indem ich client_secret.json in dasselbe Verzeichnis wie die py-Datei verschoben habe, die versucht, sie zu lesen (quickstart.py). Meiner war auf dem Desktop, während ich den Json in Documents gespeichert hatte. Ich habe den Json auch auf dem Desktop gespeichert und Junge, es flog!.

Ich weiß nicht, warum es nicht funktioniert, wenn sie sich in verschiedenen Verzeichnissen befinden. Das Definieren eines benutzerdefinierten Berechtigungspfads hilft nicht.

1
simic0de

Ich lerne Python selbst und hatte ein ähnliches Problem, aber mit dem Calendar API-Beispiel . Es stellte sich heraus, dass es sich bei dem SCOPE um einen Tippfehler handelte. 

## Typo - Invalid definition
SCOPES = 'https://ww.googleapies.com/auth/calendar.readonly'
## Correct Value for SCOPE
SCOPES = 'https://www.googleapis.com/auth/calendar'

Auch die Antworthilfe von Matt weist mich in die richtige Richtung. Gmail-quickstart.json ist nicht dasselbe wie client_secret.json. Mit client_secret.json können Sie eine Anforderung für ein OAuth2-Token stellen. Während die Datei gmail-quickstart.json das ausgegebene Token und die dazugehörigen Metadaten enthält. Die Datei gmail-quickstart.json wird erst erstellt, wenn Sie sich erfolgreich angemeldet haben. 

Ein letzter Gedanke: Um sich erfolgreich anzumelden, startete die App quickstart.py eine Instanz meines Webbrowsers (Firefox) und ging zum Google-Anmeldebildschirm. Damit Firefox ordnungsgemäß ausgeführt werden kann, musste ich zuerst meine DISPLAY-Variable richtig einstellen.

$ export DISPLAY=:0
$ xhost +
access control disabled, clients can connect from any Host
1
Randy B.

Ich habe einige der hier aufgeführten Empfehlungen befolgt:

  • verschieben Sie die Datei client_secret.json in dasselbe Verzeichnis wie die PY-Datei, die sie zu lesen versucht, wie von simic0de empfohlen.

  • In Zusammenarbeit mit skirill idea entschied ich mich für die Ausnahmebehandlung, anstatt 'credentials = store.get ()' vollständig zu entfernen, damit die Instanziierung von Anmeldeinformationen auf Flow-Basis funktioniert.

Der endgültige Code lautet:

try:
    credentials = store.get()
except:
    print('Working with flow-based credentials instantiation')

Sie können Ihren eigenen Code in die except-Zeile schreiben. Mit diesem Ansatz kann der Befehl store.get () ausgeführt werden, wenn die Bedingungen erfüllt sind.

0
xiaxio