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
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.
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.
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.
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
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.