Python: Как я могу найти URL внутри HTML, читая Gmail? - PullRequest
1 голос
/ 07 марта 2020

Я пытаюсь автоматизировать скрипт для загрузки pdf, которые я обычно получаю. Если приложен pdf, у меня есть нужная программа (я полагаю).

Моя проблема в том, что (я думаю) я получаю HTML, встроенный в электронное письмо, с URL-адресом внутри HTML. Например:

spam_message

Это из папки спама, но это может помочь нам понять проблему ...

У меня есть следующий код: mail.py

import pickle,os.path,base64,time
from datetime import datetime

from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

def get_credentials(token_path,credentials_path,scopes):
    creds = None
    if os.path.exists(token_path):
        with open(token_path, 'rb') as token:
            creds = pickle.load(token)

    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(credentials_path, scopes)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open(token_path, 'wb') as token:
            pickle.dump(creds, token)
    return creds

def get_labels(service):
    return service.users()\
                  .messages()\
                  .list(userId='me',labelIds = labels)\
                  .execute()\
                  .get('labels',[])

def get_all_messages_id(service,labels=["INBOX"]):
    return service.users()\
                  .messages()\
                  .list(userId='me',labelIds = labels)\
                  .execute()\
                  .get("messages")

def get_message(message_id,service):
    return service.users()\
                  .messages()\
                  .get(userId='me', id=message_id)\
                  .execute()

def get_subject_of_message(message):
    for header in message.get("payload").get("headers"):
        for k,v in header.items():
            if v=='Subject': return header.get("value")

Затем, если я использую ...

 >>> service = mail.login("token.pickle","credentials.json")
 >>> message_id = mail.get_all_messages_id(service)[0]
 >>> mail.get_message(message_id.get("id"),service)

Я могу увидеть "Оригинальный Xiaomi Mi Band 4 ..." в Режим str (message_id в порядке), но я не могу увидеть его URL.

Вместо этого я вижу очень большую и некрасивую строку

enter image description here

Я думаю, что тег "text / html" блокирует меня, но я не знаю, как мне продолжить. Если у меня есть его в формате HTML с его тегами, я могу использовать BeautifulSoup для его анализа. Но у меня есть эта уродливая строка ...

Кто-нибудь нашел эту проблему раньше?

Спасибо за вашу помощь

PS: Если кто-то хочет знать, как я сгенерировал token.pickle и учетные данные. json чтобы повторить, вы можете увидеть, как API Google делает c, я следовал их инструкциям, и это так просто.

1 Ответ

2 голосов
/ 10 марта 2020

Эта уродливая строка имеет кодировку base64 content,

, все что вам нужно сделать - это декодировать и проанализировать ее.

Попробуйте что-то вроде этого:

str(base64.urlsafe_b64decode(encoded_string_here), "utf-8")

Ссылка

...