GMail API:threads()。list with pageToken错过了结果中的一些线程

时间:2015-03-18 13:07:10

标签: python gmail-api

我试图从标有标签的邮箱中获取线程列表。 Python上的代码示例(基于https://developers.google.com/gmail/api/v1/reference/users/threads/list

try:
    response = gmail_service.users().threads().list(userId='me', labelIds='Label_1').execute()
    if 'threads' in response:
        threads.extend(response['threads'])

    while 'nextPageToken' in response:
        page_token = response['nextPageToken']
        response = gmail_service.users().threads().list(userId='me', labelIds='Label_1', pageToken=page_token).execute()
        threads.extend(response['threads'])

except errors.HttpError, error:
    logging.error('ERROR: page_token ' + page_token + ' ' + str(error))

print len(threads)
threads = set([x.get('id') for x in threads])  #exclude threads with the same id
print len(threads)

输出结果为:

2264  
1862

在我的邮箱中,我看到2644封带有标签' Label_1'的电子邮件 你可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,并且可以通过切换'if'和'while'语句的顺序来解决它,如下所示:

response = gmail_service.users().threads().list(userId='me', labelIds='Label_1').execute()

while 'nextPageToken' in response:
    page_token = response['nextPageToken']
    response = gmail_service.users().threads().list(userId='me', labelIds='Label_1', pageToken=page_token).execute()
    threads.extend(response['threads'])
if 'threads' in response:
    threads.extend(response['threads'])

这是因为您(以及Google的API文档!)使用的代码实际上并未返回结果的最后一页。它说得到第一页结果,然后继续,如果没有线程,直到当前页面上没有'nextPageToken'。我建议的修复首先使用'nextPageToken'循环遍历所有页面,然后如果它包含任何线程则再循环一次。顺便提一下,这也处理了开始只有一页结果的情况(因为'while'循环不会被执行)。

这对我有用。希望它适合你。