Python: 如何在 HTML 阅读 Gmail 中搜索 url?
Python: How can I search a url inside HTML reading Gmail?
我正在尝试自动化脚本来下载我通常收到的 pdf。如果附加了 pdf,我有正确的程序(我想)。
我的问题是当(我认为)我收到电子邮件中嵌入的 HTML,HTML 内有 URL。例如:
这来自垃圾邮件文件夹,但它可以帮助我们了解问题...
我有以下代码: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)
我能在 str 模式下看到 "Original Xiaomi Mi Band 4 ..."(message_id 没问题),但我看不到它的 URL。
相反,我可以看到一个又大又丑的字符串
我认为 "text/html" 标签阻止了我,但我不知道如何继续。如果我有它的 HTML 格式和它的标签,我可以使用 BeautifulSoup 来分析它。但是我有这个丑陋的字符串...
有没有人早点发现这个问题?
感谢您的帮助
PS:如果有人想知道我是如何生成token.pickle和credentials.json来重复的,可以看Google的API 医生,我已经按照他们的指示操作了,非常简单。
那个丑陋的字符串是base64编码的内容,
你所要做的就是解码和解析它。
尝试这样的事情:
str(base64.urlsafe_b64decode(encoded_string_here), "utf-8")
参考
我正在尝试自动化脚本来下载我通常收到的 pdf。如果附加了 pdf,我有正确的程序(我想)。
我的问题是当(我认为)我收到电子邮件中嵌入的 HTML,HTML 内有 URL。例如:
这来自垃圾邮件文件夹,但它可以帮助我们了解问题...
我有以下代码: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)
我能在 str 模式下看到 "Original Xiaomi Mi Band 4 ..."(message_id 没问题),但我看不到它的 URL。
相反,我可以看到一个又大又丑的字符串
我认为 "text/html" 标签阻止了我,但我不知道如何继续。如果我有它的 HTML 格式和它的标签,我可以使用 BeautifulSoup 来分析它。但是我有这个丑陋的字符串...
有没有人早点发现这个问题?
感谢您的帮助
PS:如果有人想知道我是如何生成token.pickle和credentials.json来重复的,可以看Google的API 医生,我已经按照他们的指示操作了,非常简单。
那个丑陋的字符串是base64编码的内容,
你所要做的就是解码和解析它。
尝试这样的事情:
str(base64.urlsafe_b64decode(encoded_string_here), "utf-8")