Gmail API читает все сообщения, а не сообщения UNREAD - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь получить все непрочитанные сообщения из учетной записи Gmail, используя указанный ниже код

msgs = service.users().messages().list(userId='me',q='in:inbox is:unread').execute()

flag=1
while flag==1:
    for i in range(0,len(msgs['messages'])):
        message = service.users().messages().get(userId='me', id=msgs['messages'][i]['id']).execute()
        print(message['snippet'])
    if 'nextPageToken' in msgs.keys():
            msgs = service.users().messages().list(userId='me',pageToken= msgs['nextPageToken']).execute()
    else:
        flag=0

Лог c для указанного выше кода

API возвращает 100 идентификаторов сообщений и идентификатор для следующей страницы с именем nextPageToken. Мы используем этот токен для получения следующих 100 идентификаторов сообщений и так далее. Если следующей страницы нет, у нее не будет токена, и, следовательно, мои последние 4 строки кода проверяют ее существование. Если он не существует, он устанавливает флаг в 0, и пока l oop завершается.

Задача

Приведенный выше код извлекает ВСЕ сообщения (READ и UNREAD)

Пробовали другие методы

msgs = service.users().messages().list(userId='me',labelIds=['UNREAD']).execute()

и

msgs = service.users().messages().list(userId='me',q='in:inbox is:unread').execute()

Возможно Root Причина

Я заметил, что если непрочитанные сообщения <100, то они выбираются правильно. Однако, если непрочитанные сообщения> 100, тогда он извлекает все сообщения (READ + UNREAD)

Я рассмотрел этот ответ стекопотока , но он также не помог.

1 Ответ

0 голосов
/ 13 января 2020

Что меня беспокоит в вашем коде, так это то, что вы фильтруете свои сообщения только при первом вызове API.

Таким образом, без фильтрации сообщений имеет смысл получать все сообщения ( READ или UNREAD ). За исключением первого вызова (только вы фильтруете).

msgs = service.users().messages().list(userId='me',q='in:inbox is:unread').execute()

flag=1
while flag==1:
    for i in range(0,len(msgs['messages'])):
        message = service.users().messages().get(userId='me', id=msgs['messages'][i]['id']).execute()
        print(message['snippet'])
    if 'nextPageToken' in msgs.keys():
            msgs = service.users().messages().list(userId='me',
                                                   q='in:inbox is:unread', # Add this to subsequent calls
                                                   pageToken= msgs['nextPageToken']
                                                  ).execute()
    else:
        flag=0

Посмотрите на примеры нумерации страниц в официальной документации . Там вы можете увидеть, как передается запрос для каждого вызова (а не только для первого).

 try:
    response = service.users().messages().list(userId=user_id,
                                               q=query).execute()
    messages = []
    if 'messages' in response:
      messages.extend(response['messages'])

    while 'nextPageToken' in response:
      page_token = response['nextPageToken']
      response = service.users().messages().list(userId=user_id, q=query,
                                         pageToken=page_token).execute()
      messages.extend(response['messages'])

    return messages
  except errors.HttpError, error:
    print 'An error occurred: %s' % error
...