2017-09-07 1 views
7

Je travaille sur un projet dans lequel nous souhaitons collecter des données sur les performances de GMB via l'API GMB. Cela implique la capture de nombreux résultats de reportInsights. Nous ne créons ou ne mettons à jour aucun enregistrement pour ce compte. J'ai essayé l'approche d'Oauth2 mais cela m'a obligé à fournir la permission et puisque nous n'accédons pas ou ne mettons pas à jour n'importe quelles données d'utilisateur je voudrais éviter Oauth. De la documentation et pour ce cas d'utilisation, je crois qu'un compte de service est la meilleure approche et j'ai créé cette information d'identification dans la console d'API de Google.Obtention d'une erreur 403 lors de l'accès à l'API Google My Business via le compte de service

Je peux créer des informations d'identification, mais, quand je lance le processus que je reçois l'erreur suivante:

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

Cela semble étrange puisque j'ai un ensemble valide de service d'identification de compte. J'ai inclus une clé API valide de la console API Google, mais j'ai la même erreur.

Voici mon code Python:

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) 

L'erreur est renvoyée de la dernière ligne. Toute aide est appréciée.

+0

Avez-vous essayé de régénérer la clé? Parfois, ils expirent, ou ont des restrictions que vous pouvez vérifier dans [Developer Console] (https://console.developers.google.com/apis/credentials) – zipa

+0

Les différentes informations d'identification sont toutes récentes et ont les plus hauts niveaux d'autorisations possibles. Avez-vous des directives sur ce que j'aurais dû définir pour le compte de service et la clé API? – analyticsPierce

+0

Il y a une adresse e-mail que google fournit pour chaque projet, une longue, et j'ai changé mon adresse pour celle-ci et elle l'a résolu pour mon projet d'API Google Analytics. – zipa

Répondre

1

Essayez de changer votre code à l'

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

suivantes, si cela fonctionne essayez ce qui suit pour obtenir des informations d'identification de fichier JSON

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

vos deux lignes se ressemblent exactement. J'ai une clé API, son affichage dans le code. Je vais vérifier à nouveau, mais il ne devrait pas y avoir de problèmes. – analyticsPierce

+0

Opps votre droite je vais le changer. Vous voulez changer la clé de développeur en clé – James

+0

Lorsque j'ai essayé votre suggestion, j'ai obtenu: TypeError: build() a un argument de mot clé inattendu 'clé' – analyticsPierce

0

Le problème est avec l'URL du service de découverte. Il semble que les apis privés ne sont pas accessibles via le service d'api de découverte (même si vous utilisez apikeys). En tant que tel, la résolution est de changer l'URL du service de découverte en un fichier json valide affichant le service mybusiness.

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