2017-09-07 3 views
7

Ich arbeite an einem Projekt, bei dem Daten zur GMB-Leistung über die GMB-API erfasst werden sollen. Dazu müssen viele der Ergebnisse von reportInsights erfasst werden. Wir erstellen oder aktualisieren keine Datensätze für dieses Konto. Ich habe den Oauth2-Ansatz ausprobiert, der jedoch die Erlaubnis erfordert, und da wir keine Benutzerdaten abrufen oder aktualisieren, möchte ich Oauth vermeiden.Fehler 403 beim Zugriff auf Google My Business API über Dienstkonto

Aus der Dokumentation und für diesen Anwendungsfall glaube ich, ein Dienstkonto ist der beste Ansatz, und ich habe diese Berechtigung in der Google-API-Konsole erstellt.

ich Anmeldeinformationen erstellen können, aber wenn ich laufe den Prozess ich folgende Fehlermeldung erhalten:

googleapiclient.errors.HttpError: <HttpError 403 when requesting https://mybusiness.googleapis.com/$discovery/rest?version=v3 returned "The request is missing a valid API key."> 

Dies scheint seltsam, da ich einen gültigen Satz von Dienstkontodaten haben. Ich habe einen gültigen API-Schlüssel aus der Google-API-Konsole eingefügt, aber ich erhalte denselben Fehler.

Hier ist mein Python-Code:

import os 
import httplib2 
import json 
import argparse 
import apiclient.discovery 

from oauth2client.service_account import ServiceAccountCredentials 

from apiclient.discovery import build 

api_name = 'mybusiness' 
api_version = 'v3' 
api_key = '<my valid api key from google api console that has permission for this GMB project>' 

discovery_uri = 'https://mybusiness.googleapis.com/$discovery/rest?version={}'.format(api_version) 

flow_scope='https://www.googleapis.com/auth/plus.business.manage' 

credentials_file = '/Google_My_Business-service_account.json' # the service account credentials from the Google API console that have permission for this GMB project 

credentials = ServiceAccountCredentials.from_json_keyfile_name(credentials_file, scopes=flow_scope) 

print("credentials: ", credentials) 

http = credentials.authorize(httplib2.Http()) 
print("http: ", http) 

# Build the service object 
service = build(api_name, api_version, http=http, developerKey=api_key, discoveryServiceUrl=discovery_uri) 

Der Fehler aus der letzten Zeile ausgelöst. Jede Hilfe wird geschätzt.

+0

Haben Sie versucht, Schlüssel zu regenerieren? Manchmal verfallen sie oder haben Einschränkungen, die Sie in [Entwicklerkonsole] (https://console.developers.google.com/apis/credentials) überprüfen können. – zipa

+0

Die verschiedenen Anmeldeinformationen sind alle neu und verfügen über die höchstmöglichen Berechtigungen. Haben Sie Richtlinien, was ich für das Dienstkonto und den API-Schlüssel hätte festlegen sollen? – analyticsPierce

+0

Es gibt eine E-Mail-Adresse, die Google für jedes Projekt anbietet, eine lange, und ich habe meine Adresse für diese geändert und sie für mein Google Analytics-API-Projekt gelöst. – zipa

Antwort

1

Versuchen Sie Ihren Code auf die folgenden

from oauth2client.client import AccessTokenCredentials 
credentials = AccessTokenCredentials('<an access token>', 'my-user-agent/1.0') 
http = httplib2.Http() 
http = credentials.authorize(http) 

dann zu ändern, wenn das folgende erhalten Anmeldeinformationen von JSON-Datei

from oauth2client.client import AccessTokenCredentials 
credentials = AccessTokenCredentials.from_json(credentials_file) 
http = httplib2.Http() 
http = credentials.authorize(http) 
+0

Ihre zwei Zeilen sehen genau gleich aus. Ich habe einen API-Schlüssel, der im Code angezeigt wird. Ich werde es noch einmal überprüfen, aber es sollte keine Probleme haben. – analyticsPierce

+0

Opps Ihr Recht, ich werde es ändern. Sie möchten den Entwicklerschlüssel in den Schlüssel – James

+0

ändern. Als ich Ihren Vorschlag ausprobierte, bekam ich: TypeError: build() hat ein unerwartetes Schlüsselwort argument 'key' – analyticsPierce

0

Das Problem ist, mit der Discovery-Dienst-URL funktioniert versuchen. Es scheint, dass private Apis nicht über Discovery-API-Dienst zugegriffen werden kann (auch wenn Sie Apikeys verwenden). Daher besteht die Lösung darin, die Erkennungsdienst-URL in eine gültige JSON-Datei zu ändern, die den myBusiness-Dienst anzeigt.

discovery_uri = "https://developers.google.com/my-business/samples/mybusiness_google_rest_v3p3.json" 
Verwandte Themen