Мое приложение использует Gmail API. Сегодня, после месяца активности, он вошел в состояние ошибки, и мне нужно было его остановить. Взглянув на файлы журнала, я заметил следующий сценарий:
{
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "rateLimitExceeded",
"message": "User-rate limit exceeded. Retry after 2020-05-05T18:16:01.206Z"
}
],
"code": 429,
"message": "User-rate limit exceeded. Retry after 2020-05-05T18:16:01.206Z"
}
}
Полагая, что я нарушил квоту Gmail, я взглянул на них по адресу https://developers.google.com/gmail/api/v1/reference/quota. Будучи уверен, что я их не нарушал, я подошел к делу с философией и сказал себе, что это, вероятно, временная проблема Gmail, поэтому я дождался желаемого времени (15 минут) и вручную сделал новый запрос. Ответ на этот новый запрос следующий:
{
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "rateLimitExceeded",
"message": "User-rate limit exceeded. Retry after 2020-05-05T18:31:03.075Z"
}
],
"code": 429,
"message": "User-rate limit exceeded. Retry after 2020-05-05T18:31:03.075Z"
}
}
Я ждал 15 минут ... и снова
{
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "rateLimitExceeded",
"message": "User-rate limit exceeded. Retry after 2020-05-05T18:46:29.239Z"
}
],
"code": 429,
"message": "User-rate limit exceeded. Retry after 2020-05-05T18:46:29.239Z"
}
}
Я заявляю, что получение токена доступа работает правильно:
curl "https://www.googleapis.com/oauth2/v4/token" --data "client_id=<my_client_id>&client_secret=<my_client_secret>&refresh_token=<my_refresh_token>&grant_type=refresh_token"
Ответ:
{
"access_token": "here_my_access_token",
"expires_in": 3599,
"scope": "https://www.googleapis.com/auth/gmail.readonly https://www.googleapis.com/auth/contacts.readonly",
"token_type": "Bearer"
}
, а ошибка 429 - это запрос на чтение электронных писем с определенного адреса:
curl "https://content.googleapis.com/gmail/v1/users/me/messages?labelIds=INBOX&fields=messages/id&q=from:<email_address>" -H "Authorization: Bearer <access_token>"
Я не могу понять, что получилось. Приложение находится в разработке, и я не могу позволить себе такую проблему. Может ли кто-нибудь помочь мне выяснить причину и исправить ее?
Мои квоты: