2016-10-11 1 views
0

J'ai utilisé l'API Google Vision pour effectuer des tâches d'OCR dans certains documents utilisant Python.Comment puis-je éviter le code d'erreur Http 429 de l'API Google Vision?

Il commence à fonctionner parfaitement, jusqu'à ce que je commence à recevoir le code d'erreur Http 429, ce qui signifie que je fais trop de demandes dans un court laps de temps. Ensuite, j'ai décidé de mettre un sommeil entre chaque requête, dont le temps augmente au fur et à mesure que le nombre d'Http Error Code 429 augmente. Cependant, après un certain temps, le message d'erreur continue à venir. Comme les messages continuent d'arriver, le temps de sommeil continue d'augmenter jusqu'à ce qu'il atteigne un point où il dort si longtemps que je perds la connexion. La chose la plus étrange est que si je reçois un tel message d'erreur plusieurs fois de suite et, immédiatement, termine le processus et le redémarre, les requêtes recommencent à fonctionner au premier essai. En d'autres termes, il semble que peu importe le temps de sommeil que je mets, je vais commencer à recevoir de tels messages à un moment donné et la seule façon de le remettre en marche est de redémarrer le processus (qui ne fait aucun sens).

Comment puis-je éviter d'avoir un tel message d'erreur sans avoir à redémarrer le processus? Quelqu'un peut-il m'aider?

Merci beaucoup!

EDIT:

Voici le code de la demande (partie).

from apiclient import discovery 
    from oauth2client.client import GoogleCredentials 
    # The other imports are omitted 

    DISCOVERY_URL = 'https://{api}.googleapis.com/$discovery/rest?version={apiVersion}' # noqa 
    credentials = GoogleCredentials.get_application_default() 
    self.vision = discovery.build(
     'vision', 'v1', credentials=credentials, 
     discoveryServiceUrl=DISCOVERY_URL) 

    batch_request = [] 

    for image in images: 
     batch_request.append({ 
      'image': { 
       'content': base64.b64encode(image).decode('UTF-8') 
      }, 
      'features': [{ 
       'type': 'TEXT_DETECTION', 
      }] 
     }) 

    request = self.vision.images().annotate(
     body={'requests': batch_request}) 
+1

Y at-il un en-tête 'Retry-After' qui revient, pour que vous sachiez quand faire la prochaine requête? – jonrsharpe

+0

@jonrsharpe merci pour votre réponse rapide. J'ai essayé d'obtenir les informations d'en-tête, mais il semble que la requête soit entièrement faite dans une méthode de l'API que j'utilise.Par conséquent, je n'ai accès à aucune réponse et en-tête en cas d'erreur. L'API vient de lancer une exception (dans ce cas HttpError). Je n'ai rien trouvé dans le message d'exception qui pourrait aider, malheureusement. C'est l'appel: request = self.vision.images(). Annotate (body = {'requests': batch_request}) –

+0

Quelle bibliothèque utilisez-vous? Parfois une erreur aura plus d'informations disponibles si vous l'attrapez et l'inspectez: 'urttib2'' HttpError', par exemple, contient 'info',' message', 'reason', etc. –

Répondre

0

Vous avez utilisé, les informations d'identification par défaut d'application,

credentials = GoogleCredentials.get_application_default() 

Peut-être que ce n'est pas en mesure de trouver les informations d'identification et l'utilisation de la demande et ainsi faire la demande anonyme à l'API, qui ne permet pas plus de 2 ou 3 demandes comme dans votre cas, j'ai également fait face au même problème et trouvé le travail comme:

(Remarque: Si vous n'avez pas configuré de clé d'API ou de compte de service, référez-vous à doc pour créer un.)

pour le développement: en utilisant l'API clé

vous pouvez l'utiliser comme:

self.vision = discovery.build(
    'vision', 'v1', credentials=credentials, 
    discoveryServiceUrl=DISCOVERY_URL, developerKey='your_api_key' 

)

pour la production: en utilisant la clé compte de service

from oauth2client.service_account import ServiceAccountCredentials 
scopes = ['https://www.googleapis.com/auth/sqlservice.admin'] 
credentials = ServiceAccountCredentials.from_json_keyfile_name(
    '/path/to/keyfile.json', scopes=scopes) 

vous pouvez trouver une liste des étendues à utiliser here.

De plus, vous devez définir cette variable d'environnement:

GOOGLE_APPLICATION_CREDENTIALS="/path/to/secret-key-file" 

Vous ne doit pas augmenter le temps de sommeil chaque demande, il suffit d'augmenter si une requête échoue en utilisant l'une des approches susmentionnées. chercher l'algorithme de backoffs exponentiel dans docs.

+0

L'utilisation de la clé de compte de service est ce qui a résolu mon problème. Merci. – Cheesegraterr