Gmail API - быстрый доступ к датам каждого письма, когда-либо отправленного / полученного

Я пытаюсь проанализировать мои 25k+ писем, похожих на пост здесь: http://beneathdata.com/how-to/email-behavior-analysis/

В то время как упомянутый скрипт использовал IMAP, я пытаюсь реализовать это, используя Gmail API для повышения безопасности. Я использую Python (и Pandas для анализа данных), но этот вопрос более применим к использованию API Gmail.

Из документов я могу читать электронные письма, используя:

msgs = service.users().messages().list(userId='me', maxResults=500).execute()

а затем получить доступ к данным с помощью цикла:

for msg in msgs['messages']:
    m_id = msg['id'] # get id of individual message
    message = service.users().messages().get(userId='me', id=m_id).execute()
    payload = message['payload'] 
    header = payload['headers']

    for item in header:
        if item['name'] == 'Date':
           date = item['value']
           ** DATA STORAGE FUNCTIONS ETC **

но это явно очень медленно. Помимо зацикливания каждого сообщения, мне приходится многократно вызывать API-интерфейс list () для циклического перебора всех электронных писем.

Есть ли более высокопроизводительный способ сделать это? например, попросить API вернуть только данные, а не всю нежелательную информацию сообщения.

Благодарю.

Ссылка: https://developers.google.com/resources/api-libraries/documentation/gmail/v1/python/latest/gmail_v1.users.messages.html

1 ответ

Решение

Вы можете объединить свои операции messages.get() в пакет, см. https://developers.google.com/gmail/api/guides/batch

Вы можете поместить до 100 запросов в пакет.

Обратите внимание, что "набор из n запросов, соединенных вместе, учитывает ваш лимит использования как n запросов, а не как один запрос". Так что вам может потребоваться сделать шаг, чтобы остаться ниже предела скорости запроса.

Вот грубый пример Python, который будет получать сообщения, представленные списком идентификаторов id_list

msgs = []
def fetch(rid, response, exception):
    if exception is not None:
        print exception
    else:
        msgs.append(response)

# Make a batch request
batch = gmail.new_batch_http_request()
for message_id in id_list:
    t = gmail.users().messages().get(userId='me', id=message_id, format=fmt)
    batch.add(t, callback=fetch)

batch.execute(http=http)
Другие вопросы по тегам