Как сохранять помесячные письма, а также делить почту в зависимости от времени, используя gmail api и сохранять выходные данные в csv или преобразовывать их в df? - PullRequest
0 голосов
/ 22 января 2019

Приведенный ниже код возвращает нам количество сообщений за каждые 30 дней с момента отправки сообщения.

Этот код получает нас: (подробно)

1.Амазонка первая почта на мою почту с определенной фазой (здесь первый заказ).

2. Преобразуйте этот формат эпохи в дату и время, используя timedelta И получая количество писем, отправленных в интервале 30 дней.

Вывод этого кода будет выглядеть следующим образом:

Amazon first order:

1534476682000

Amazon total orders between 2018-08-01 and 2018-09-01: 20

Amazon total orders between 2018-09-01 and 2018-10-01: 11

Amazon total orders between 2018-10-01 and 2018-11-01: 15

Amazon total orders between 2018-11-01 and 2018-12-01: 7

Amazon total orders between 2018-12-01 and 2019-01-01: 19

Amazon total orders between 2019-01-01 and 2019-02-01: 23

Amazon total orders between 2019-02-01 and 2019-03-01: 12

Код:

#amazonfirstorder
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
from dateutil.relativedelta import relativedelta
from datetime import datetime


SCOPES = 'https://www.googleapis.com/auth/gmail.readonly'

def main():

    store = file.Storage('token.json')
    creds = store.get()
if not creds or creds.invalid:
    flow = client.flow_from_clientsecrets('credentials.json', SCOPES)
    creds = tools.run_flow(flow, store)
service = build('gmail', 'v1', http=creds.authorize(Http()))

results = service.users().messages().list(userId='me', q='from:auto-confirm@amazon.in subject:(your amazon.in order of )',labelIds = ['INBOX']).execute()

messages = results.get('messages', [])


print('\nFilpkart first order:')
if not messages:
    print (" ")
else:
    print (" ")

    msg = service.users().messages().get(userId='me', id=messages[-1]['id']).execute()
    #print(msg['snippet'])
    a=(msg['internalDate'])
    ts = int(a)
    ts /= 1000
    year=int(datetime.utcfromtimestamp(ts).strftime('%Y'))
    month=int(datetime.utcfromtimestamp(ts).strftime('%m'))
    #print(year)
    #print(month)
    print(msg['internalDate'])

    log_results = []
    start_date = datetime(year,month,1)
#start_date = datetime(2016,1,1)
    end_date = datetime.today()
    increment = relativedelta(months=1)
    target_date = start_date + increment

    while target_date <= end_date:

        timestamp_after = int(start_date.timestamp())  # timestamp of start day
        timestamp_before = int(target_date.timestamp())  # timestamp of start day + 30 days

        query = f'from:(auto-confirm@amazon.in) subject:(your amazon.in order of ) after:{timestamp_after} before:{timestamp_before}'
        results = service.users().messages().list(userId='me', q=query, labelIds=['INBOX']).execute()

        messages = results.get('messages', [])
        orders = len(messages)
        start_date_str = start_date.strftime('%Y-%m-%d')
        target_date_str = target_date.strftime('%Y-%m-%d')
        print(f"\nFlipkart total orders between {start_date.strftime('%Y-%m-%d')} and {target_date.strftime('%Y-%m-%d')}: {orders}")

        log_results.append(dict(start=start_date_str, end=target_date_str, orders=orders))

    # update interval
        start_date += increment
        target_date += increment

    return log_results



if __name__ == '__main__':
    log_results = main()    

Теперь яЕсть две проблемы:

Первый

Как сохранить вывод этого кода в CSV-файл.

Второй :

Приведенный выше код дает нам количество писем за 30 дней. Мне нужно, чтобы мне было нужно количество писем, которые я получил до 12.00 в месячном исчислении и после 12 вечера в месячном, и сохранил их в формате csv.

ВЫХОД Мне нужно для 2-й задачи :

Amazon total orders between 2018-09-01 and 2018-10-01 before 12:00 PM : 11

Amazon total orders between 2018-10-01 and 2018-11-01 before 12:00 PM : 15

Amazon total orders between 2018-11-01 and 2018-12-01 before 12:00 PM : 7

Amazon total orders between 2018-12-01 and 2019-01-01 before 12:00 PM : 19

Amazon total orders between 2018-09-01 and 2018-10-01 after 12:00 PM : 3

Amazon total orders between 2018-10-01 and 2018-11-01 after 12:00 PM : 6

Amazon total orders between 2018-11-01 and 2018-12-01 after 12:00 PM : 88

Amazon total orders between 2018-12-01 and 2019-01-01 after 12:00 PM : 26

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Аналогично тому, что уже было предложено, но в этом случае вы рассчитываете приращение ровно один месяц вместо 30 дней (см. Использование relativedelta вместо timedelta):

from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
from dateutil.relativedelta import relativedelta
from datetime import datetime

SCOPES = 'https://www.googleapis.com/auth/gmail.readonly'

def main():

    store = file.Storage('token.json')
    creds = store.get()
    if not creds or creds.invalid:
        flow = client.flow_from_clientsecrets('credentials.json', SCOPES)
        creds = tools.run_flow(flow, store)
    service = build('gmail', 'v1', http=creds.authorize(Http()))

    log_results = []

    start_date = datetime(2016, 1, 1)
    end_date = datetime.today()
    increment = relativedelta(months=1)
    target_date = start_date + increment

    while target_date <= end_date:

        timestamp_after = int(start_date.timestamp())  # timestamp of start day
        timestamp_before = int(target_date.timestamp())  # timestamp of start day + 30 days

        query = f'from:(auto-confirm@amazon.in) subject:(your amazon.in order of ) after:{timestamp_after} before:{timestamp_before}'
        results = service.users().messages().list(userId='me', q=query, labelIds=['INBOX']).execute()

        messages = results.get('messages', [])
        orders = len(messages)
        start_date_str = start_date.strftime('%Y-%m-%d')
        target_date_str = target_date.strftime('%Y-%m-%d')
        print(f"\nAmazon total orders between {start_date.strftime('%Y-%m-%d')} and {target_date.strftime('%Y-%m-%d')}: {orders}")

        log_results.append(dict(start=start_date_str, end=target_date_str, orders=orders))

        # update interval
        start_date += increment
        target_date += increment

    return log_results



if __name__ == '__main__':
    log_results = main()
    # Write to csv
    import pandas as pd
    df = pd.DataFrame(log_results)
    df.to_csv('orders.csv')
0 голосов
/ 22 января 2019

Вам просто нужно циклически просмотреть даты с нужным интервалом.

Приведенный ниже код извлекает сообщения пользователя за определенный период времени, например количество сообщений за месяц.

Вам потребуется помощь для автоматизации подсчета сообщений за каждые 30 дней.

Например, этот код получает сообщения с 1 января 2016 года по 30 января 2016 года.

Таким образом, с 1 января 2016 года по 1 января 2019 года вам нужно будет автоматизировать его с регулярным интервалом в 30 дней.

from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
import time
from dateutil.relativedelta import relativedelta
from datetime import datetime

SCOPES = 'https://www.googleapis.com/auth/gmail.readonly'    
def main():
    store = file.Storage('token.json')
    creds = store.get() 
    if not creds or creds.invalid:
        flow = client.flow_from_clientsecrets('credentials.json', SCOPES)
        creds = tools.run_flow(flow, store)
    service = build('gmail', 'v1', http=creds.authorize(Http()))
    end_date = datetime(2019, 1, 1)
    interval = relativedelta(months=1)
    current = datetime(2016, 1, 1)              # init to the start date 
    while current < end_date + interval:
         after = current.timestamp()
         before = (current + interval).timestamp()

         query = 'from:(auto-confirm@amazon.in) subject:(your amazon.in order of ) after:{} before:{}'.format(after, before)
         results = service.users().messages().list(userId='me', q=query, labelIds = ['INBOX']).execute()

         messages = results.get('messages', [])
         print("\namazon total orders in {}: {}".format(current.strftime('%B %Y'), len(messages)))
         current += interval    

if __name__ == '__main__':
    main()  
...