最近币安的公告页面(链接)升级,无法通过爬虫的方式获取最新公告,包括非小号和MyToken也捕捉不到币安的公告,自己尝试了各种方法也没成功。
币安的公告经常会发出一些活动或者上币之类,比如某种币一旦有类似消息,很快会爆拉超过10个点,第一时间获得公告就至关重要。
后来突发其想,币安公告页面提供关注并邮件订阅功能,如下图,点击关注,需要登陆自己的币安账户,登陆成功之后右上角会显示自己的邮箱前缀,再点击关注新文章,这样有公告时会第一时间收到邮件,币安建议关注两个组:“最新公告”和“币币交易”。
接下来的问题就是如何用Python收到邮件,在网了寻找了很多,发现太多已经失效不能用了。
后来在这里https://www.liaoxuefeng.com/wiki/1016959663602400/1017800447489504找到一篇还能运行的。感谢这篇文章的作者廖雪峰,这篇文章阅读量87万多了,我直接在他的代码上更改的。
我要做的就是监控最新的邮件,然后用关键字binance去筛选收件人,如果是币安的邮件,就发钉钉提醒我。
测试了几个邮箱结果:
网易,经常出现登陆不上的情况 b'-ERR Unable to log on’,最后放弃
Gmail:首先需要开启'允许安全性较低的应用'https://myaccount.google.com/lesssecureapps。其次登陆后会的邮件提示'登录尝试已被阻止',这个要同意,证明是本人。安全性要求非常高,最后还是放弃了。
搜狐:发现其邮件索引是倒序,并且还有一个欢迎的新邮件,没调试好
QQ邮箱最好用,最先就选择了它。
使用的库是poplib
# 邮箱QQ 需要开启POP服务,并申请授权码,比使用密码更安全
pop3_server ='pop.qq.com'
username ='XXX@qq.com'
password ='XXX' # 授权码
# 连接到POP3服务器:
server = poplib.POP3(pop3_server)
# 身份认证:
server.user(username)
server.pass_(password)
# list()返回所有邮件的编号:
resp, mails, octets = server.list()
# 可以查看返回的列表类似[b'1 82923', b'2 2184', ...]
num =3 # 监控几个邮件
text_or_not =1 # 是否需要查看正文,这个设置个开关,有时候正文内容太多,显示不方便
notice_List = []# 内容列表
Subject_List = []# 主题列表
From_List = []# 发件人列表
# 最新一封邮件, 注意索引号从1开始, 最大的是最新的邮件
i =0
index =len(mails)
while i < num:# 获取多个邮件
resp, lines, octets = server.retr(index - i)
# 可以获得整个邮件的原始文本:
msg_content =b'\r\n'.join(lines).decode('utf-8')#
# 解析出邮件:这个是库的内容,把邮件内容解析为Message对象
msg = Parser().parsestr(msg_content)
handle_info(msg)
Subject_List.append(Subject)
From_List.append(From)
i = i +1
print('邮件主题', Subject_List)
print('发件人是', From_List)
通过以上程序就可以获得主题和发件人,接下来根据需要筛选就行了。
这里出现一个小插曲值得提下,原来处理邮件的函数名叫print_info(), 但我在输入 print(content)时,因为Pycharm在输入print回车会带出来print_info(content),导致耽误大半天时间找不出问题。所以print_info这种名字不能用,改成handle_info了
另外时间间隔我测试几天后,发现设置成至少设置成14秒,否则QQ邮箱会当成攻击关闭链接,不过延时还是不小。
while True:
try:
resp, mails, octets = server.list()
index =len(mails)
resp, lines, octets = server.retr(index)
msg_content =b'\r\n'.join(lines).decode('utf-8')
msg = Parser().parsestr(msg_content)
handle_info(msg)
# 新邮件提醒
if 1:
if Subjectnot in Subject_List:
content ='新邮件' +'\n' + Subject
print(content)
print('邮件正文', text_content)
send_msg1 = send_dingding_msg1(content)
print(send_msg1)
# break
# 币安新邮件提醒
if 1:
if 'binance' in Fromand (Subjectnot in Subject_List):
print('币安新公告', Subject)
content ='币安新公告' +'\n' + Subject
print('邮件正文', text_content)
send_msg1 = send_dingding_msg1(content)
print(send_msg1)
time.sleep(14)
except Exception as err:
time.sleep(2)
print('查询错误', err)
完整代码放在了Github上了:https://github.com/Yang-Weixiang/Python/blob/master/Mail/Fetch-Email-and-Binance-Latest-Announcements
网友评论