如何提取 csv 并将其组合到 python 中的数据帧中,并使用 gmail 的 oauth 身份验证?

How extract csv's and combine to dataframe in python with oauth autentification from gmail?

提问人:Ilya Dubrov 提问时间:11/10/2023 最后编辑:Ilya Dubrov 更新时间:11/10/2023 访问量:34

问:

我是一家小型移动营销公司的初级分析师。我最近接到了一个艰巨的任务:编写一个函数,从我们的一个工作 gmail 帐户中提取一段时间内从邮件中提取 csv(并将它们组合到一个数据帧中)。上一个函数使用 imaptools 库接收 csv,这需要密码。但是,出于安全原因,密码必须定期更新,这很不方便。

我在我的 Google 帐户上创建了一个应用程序,连接了 gmail API,创建了一个 Oauth 客户端 ID 并通过报告帐户登录,收到了一个令牌。但是,我在编写函数时遇到了很大的问题。这是我写的一段代码。msg_ids 变量返回所需 ID 的正确列表。但下一步该怎么做呢?

from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build


CLIENT_ID = 'default.com'
CLIENT_SECRET = 'credentials.json'

creds = Credentials.from_authorized_user_file('token.json')

service = build('gmail', 'v1', credentials=creds)

results = service.users().messages().list(userId='default.com', q='has:attachment filename:csv').execute()
messages = results.get('messages', [])
msg_ids = [msg['id'] for msg in messages]

Chat GPT 为我提供了以下一段代码,但它不起作用

def get_messages(service, start_date, end_date):
    start_datetime = datetime.strptime(start_date, '%Y-%m-%d').isoformat() + 'Z'
    end_datetime = datetime.strptime(end_date, '%Y-%m-%d').isoformat() + 'Z'
    query = f'after:{start_datetime} before:{end_datetime}'
    messages = service.users().messages().list(userId='me', q=query).execute()
    return messages.get('messages', [])

def get_attachments(service, message_id):
    message = service.users().messages().get(userId='me', id=message_id).execute()
    parts = message['payload']['parts']
    attachments = []
    for part in parts:
        if 'filename' in part:
            file_data = service.users().messages().attachments().get(userId='me', messageId=message_id, id=part['body']['attachmentId']).execute()
            file_data = file_data['data']
            file_data = base64.urlsafe_b64decode(file_data.encode('UTF-8'))
            filename = part['filename']
            attachments.append((filename, file_data))
    return attachments

def create_dataframe(attachments):
    df = pd.DataFrame()
    for filename, data in attachments:
        if filename.endswith('.csv'):
            temp_df = pd.read_csv(io.BytesIO(data))
            df = df.append(temp_df, ignore_index=True)
    return df

注意:我期望有一个函数,可以从 gmail 中提取任意日期范围的 csvs 并将它们组合到一个数据帧中。

python json 解析 oauth-2.0

评论

0赞 Dean Van Greunen 11/10/2023
将行更改为get_messagesquery = f'has:attachment filename:csv after:{start_datetime} before:{end_datetime}'query = f'after:{start_datetime} before:{end_datetime}'
1赞 Ilya Dubrov 11/10/2023
感谢帮助,但仍然不起作用:(

答: 暂无答案