【问题标题】:How can I avoid Http Error Code 429 from Google Vision API?如何避免来自 Google Vision API 的 Http 错误代码 429?
【发布时间】:2016-10-11 16:52:14
【问题描述】:

我一直在使用 Google Vision API 在一些使用 Python 的文档中执行 OCR 任务。

它开始正常工作,直到我开始收到 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})

【问题讨论】:

  • 是否有Retry-After 标头返回,所以您知道何时发出下一个请求?
  • @jonrsharpe 感谢您的及时回答。我试图获取标头信息,但似乎该请求完全是在我正在使用的 API 的方法中发出的。因此,当出现错误时,我无权访问任何响应和标头。 API 只是抛出一个异常(在本例中为 HttpError)。不幸的是,我在异常消息中找不到任何可以提供帮助的内容。这是调用:request = self.vision.images().annotate(body={'requests': batch_request})
  • 您使用的是什么库?有时,如果您捕获并检查错误,它会有更多可用信息:例如,urllib2HttpError 包含infomessagereason 等。
  • 我用一些代码编辑了帖子。 @ap 我正在使用适用于 Python 的 Google 客户端 API。无论如何,我会更深入地研究异常消息,看看我是否发现了一些有用的东西。谢谢!
  • 我刚刚检查了异常属性,并没有找到Retry-After字段。这是异常消息中的消息: "error": {\n "code": 429,\n "message": "Insufficient tokens for quota group and limit \'DefaultGroupUSER-100s\' of service \'vision.googleapis .com\',使用 ID 限制 (...)"}

标签: python ocr http-error google-cloud-vision http-status-code-429


【解决方案1】:

您已使用,应用程序默认凭据,

credentials = GoogleCredentials.get_application_default()

也许它无法找到凭据并用于请求,因此向 API 发出匿名请求,这在您的情况下不允许超过 2 或 3 个请求,我也面临同样的问题并找到了工作大约为:

(注意:如果您尚未设置 API 密钥或服务帐户密钥,请参考此doc 来创建。)

用于开发:使用 API 密钥

你可以像这样使用它:

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

)

用于生产:使用服务帐户密钥

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"

您无需为每个请求增加睡眠时间,只需在使用上述任何方法时请求失败时增加睡眠时间即可。在文档中查找指数退避算法。

【讨论】:

  • 使用服务帐户密钥解决了我的问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 2019-10-15
  • 2016-01-02
相关资源
最近更新 更多