2016-10-11 8 views
0

私はGoogle Vision APIを使用して、Pythonを使用していくつかのドキュメントでOCRタスクを実行してきました。Google Vision APIからHttp Error Code 429を回避するにはどうすればよいですか?

HTTPエラーコード429の受信が始まるまで、完全に動作し始めます。これは、短時間で多くのリクエストを処理していることを意味します。次に、リクエストごとに睡眠をとることに決めました。そのうち、Http Error Code 429の数が増えるにつれて時間が長くなりました。ただし、しばらくすると、エラーメッセージが表示され続けます。メッセージが到着し続けるので、スリープ時間は、それが眠っている間に長くなり、接続が失われるまで、増加し続けます。

このようなエラーメッセージが何度も連続して受信された場合、すぐに処理を終了してもう一度開始すると、リクエストは最初の試行で再び動作します。

言い換えれば、私が眠っている時間に関係なく、私はある時点でそのようなメッセージを受信し始め、それを再び動作させる唯一の方法はプロセスを再起動することです(全く感知しません)。

プロセスを再起動せずにこのようなエラーメッセージが表示されないようにするにはどうすればよいですか?誰でも助けてくれますか?

ありがとうございます!

編集:

これはリクエスト(その一部)のコードです。

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

'Retry-After'ヘッダが戻ってくるので、いつ次のリクエストを行うのか分かりますか? – jonrsharpe

+0

@jonrsharpeあなたの迅速な答えに感謝します。私はヘッダー情報を取得しようとしましたが、要求は完全に私が使用しているAPIからメソッド内で行われているようです。したがって、エラーが発生した場合には、応答とヘッダーにアクセスすることはできません。 APIは単に例外(この場合はHttpError)をスローします。残念ながら、私は例外メッセージの中で何かを見つけることができませんでした。これは、 リクエスト= self.vision.images()。annotate(body = {'requests':batch_request}) –

+0

あなたが使っているライブラリは何ですか? 'urllib2'の' HttpError'に 'info'、' message'、 'reason'などが含まれています。 –

答えて

0

あなたは

credentials = GoogleCredentials.get_application_default() 

は多分2つ以上を許可されていないこと、資格情報を検索し、要求し、そのAPIへの匿名の要求を行うために使用することはできないが、アプリケーションの既定の資格情報を使用していましたあなたの場合のように3つのリクエストがあった場合、私は同じ問題に直面していて、回避策を見つけました:

(注:APIキーまたはサービスアカウントキーを設定していない場合は、docを参照してください1)

開発のための

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

を生産するために:あなたが好きそれを使用することができ、APIキー

を使用してサービスアカウントにキー

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) 

を使用してリストを見つけることができますスコープの範囲はhereです。

はまた、あなたは、この環境変数を設定する必要があります。

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

あなたは、上記のアプローチのいずれかを使用している間、要求が失敗した場合にそれを増やし、すべての要求で睡眠時間を増やす必要はありません。 docsで指数バックオフアルゴリズムを探します。

+0

サービスアカウントのキーを使用すると、問題が解決しました。ありがとう。 – Cheesegraterr

関連する問題