请求 gmail-api 时出现 HttpError 429:超出用户速率限制

Posted

技术标签:

【中文标题】请求 gmail-api 时出现 HttpError 429:超出用户速率限制【英文标题】:HttpError 429 when rquesting gmail-api : User-rate limit exceeded 【发布时间】:2021-05-27 18:42:38 【问题描述】:

我正在使用 Gmail-api 从接收箱中检索电子邮件,但我从一段时间以来就遇到了这个错误:googleapiclient.errors.HttpError: https://gmail.googleapis.com/gmail/v1/users/***/?alt=json returned "User-rate limit exceeded .鉴于链接中指出的错误的json是:


  "error": 
    "code": 401,
    "message": "Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
    "errors": [
      
        "message": "Login Required.",
        "domain": "global",
        "reason": "required",
        "location": "Authorization",
        "locationType": "header"
      
    ],
    "status": "UNAUTHENTICATED"
  

我想知道这个错误是否是由于凭据过期或达到每用户速率限制或其他原因造成的。如果错误是由于凭据过期引起的,我如何通过 python 代码自动刷新它们。如果没有,解决办法是什么?

与gmail_api建立连接的代码如下:

def connect(self):
    SCOPES = ['https://www.googleapis.com/auth/gmail.modify']
    SERVICE_ACCOUNT_FILE = 'credentials.json'

    # The user we want to "impersonate"
    USER_EMAIL = "box@company.com"

    credentials = service_account.Credentials. \
        from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    delegated_credentials = credentials.with_subject(USER_EMAIL)

    service = discovery.build('gmail', 'v1', credentials=delegated_credentials)

    
    return service

之后,我得到要处理的电子邮件列表:

def emails_list_by_labels(self, service, user_id='me', label_ids=[]):
    try:
        response = service.users().messages().list(userId=user_id,
                                                   labelIds=label_ids).execute()
        messages = []
        if 'messages' in response:
            messages.extend(response['messages'])
        while 'nextPageToken' in response:
            page_token = response['nextPageToken']
            response = self.service.users().messages().list(userId=user_id,
                                                            labelIds=label_ids,
                                                            pageToken=page_token).execute()
            messages.extend(response['messages'])
        return messages
    except errors.HttpError as error:
        logging.error('an error occured: %s' % error)

如果有人有任何建议,我将不胜感激。我真的不知道如何解决这个问题。

【问题讨论】:

您是否在服务帐户上设置了域范围的委派? 【参考方案1】:

查看您的错误消息 -

请求https://gmail.googleapis.com/gmail/v1/users/***/?alt=json时的HttpError 429返回“超出用户速率限制

那里的链接不是要被“点击”的,它是失败请求的 url。您在尝试访问它时会收到未经身份验证的错误,因为您没有经过身份验证才能查看它,但您的应用程序没有这个问题。

您的应用遇到的问题是请求过多,如 429 错误所示。详情可以查看here。您必须调查错误的确切原因,并从那里寻找合适的解决方案 - 指数退避、缓存等。

【讨论】:

感谢您的回答。我尝试了本期***.com/questions/31109540/… 中给出的解决方案,但仍然无法正常工作 某些请求是否成功?如果是这样,您很可能会达到每秒请求数限制,在这种情况下,您应该尝试在请求失败时添加指数退避。 @IvanFurdek 是对的,这可能每秒请求太多 感谢您的回答。我尝试了退避解决方案,但它不起作用,因为问题不是由于达到了每秒限制。问题是由于使用了每日配额(问题是由服务器配置的不当行为产生的)在第一次失败后 24 小时,问题得到解决。所以解决办法是耐心等待。

以上是关于请求 gmail-api 时出现 HttpError 429:超出用户速率限制的主要内容,如果未能解决你的问题,请参考以下文章

使用球衣在飞行前请求后解析请求时出现异常

使用 python 模块请求上传 Strava GPX 时出现 ValueError - 为啥?

发出 GET 请求时没有 CORS 错误,但发出 POST 请求时出现 CORS 错误

尝试处理 CORS 请求时出现 ParseError

请求 OWIN 令牌时出现 CORS 错误

发布到 Razor 页面时出现 400 错误请求