HttpError 400 Ошибка проверки предварительного условия во время вызова users (). Messages (). List Gmail API с использованием служебной учетной записи - PullRequest
1 голос
/ 11 июля 2020

Я использую учетную запись службы для вывода сообщения в моем почтовом ящике, однако при вызове этого API я получаю сообщение об ошибке ниже service.users().messages().list(userId='me').execute()

    HttpError                                 Traceback (most recent call last)
<ipython-input-44-da1dc3cccc81> in <module>
     27 
     28 apiservice = build('gmail', 'v1', credentials=service_cred)
---> 29 response = apiservice.users().messages().list(userId='me').execute()

~/opt/anaconda3/lib/python3.7/site-packages/googleapiclient/_helpers.py in positional_wrapper(*args, **kwargs)
    128                 elif positional_parameters_enforcement == POSITIONAL_WARNING:
    129                     logger.warning(message)
--> 130             return wrapped(*args, **kwargs)
    131         return positional_wrapper
    132 

~/opt/anaconda3/lib/python3.7/site-packages/googleapiclient/http.py in execute(self, http, num_retries)
    849       callback(resp)
    850     if resp.status >= 300:
--> 851       raise HttpError(resp, content, uri=self.uri)
    852     return self.postproc(resp, content)
    853 

HttpError: <HttpError 400 when requesting https://www.googleapis.com/gmail/v1/users/me/messages?alt=json returned "Precondition check failed.">

код:

scopes = [
    "https://mail.google.com/",
    "https://www.googleapis.com/auth/gmail.modify",
    "https://www.googleapis.com/auth/gmail.readonly",
    "https://www.googleapis.com/auth/gmail.labels",
    "https://www.googleapis.com/auth/gmail.metadata",
    'https://www.googleapis.com/auth/userinfo.email',
    'https://www.googleapis.com/auth/userinfo.profile',
]

service_cred = service_account.Credentials.from_service_account_info(
                credentials, scopes=scopes)

service = build('gmail', 'v1', credentials=service_cred)
response = service.users().messages().list(userId='me').execute()

1 Ответ

1 голос
/ 11 июля 2020

Я тоже столкнулся с этим, когда пытался составить список писем из моей личной электронной почты. Панель управления Google предоставила мне учетные данные учетной записи службы при включении Gmail API, поэтому я решил, что это то, что мне следует использовать.

Чтобы убрать эту ошибку 400 go, мне пришлось добавить:

delegated_credentials = credentials.with_subject('my-email@gmail.com')

См. https://developers.google.com/identity/protocols/oauth2/service-account#authorizingrequests.

Однако затем я получил сообщение об ошибке, что моя учетная запись службы не авторизована для отправки запросов от имени моего личного Эл. адрес. И если вы не используете G Suite, я не думаю, что есть способ использовать учетную запись службы от имени пользователя.

Итак, окончательным решением моей проблемы было использование аутентификации OAuth, как в Python Быстрый запуск .

...