python实现12306自动查余票,并且发送邮件通知
第一步. 查余票
第二步.发送邮件(这里用的qq邮箱)
# !/usr/bin/python3
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
my_sender = '118*****[email protected]' # 发件人邮箱账号
my_pass = '*********' # 发件人邮箱密码,可以
my_user = '118*****[email protected]' # 收件人邮箱账号,我这边发送给自己
def mail():
ret = True
try:
#msg = MIMEText('填写邮件内容', 'plain', 'utf-8')
msg = MIMEText('这是我用python给你发的邮件', 'plain', 'utf-8')
msg['From'] = formataddr(["From_xd", my_sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号
msg['To'] = formataddr(["FK", my_user]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
msg['Subject'] = "xd发送邮件测试" # 邮件的主题,也可以说是标题
server = smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件人邮箱中的SMTP服务器,端口是25
server.login(my_sender, my_pass) # 括号中对应的是发件人邮箱账号、邮箱密码
server.sendmail(my_sender, [my_user, ], msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
server.quit() # 关闭连接
except Exception: # 如果 try 中的语句没有执行,则会执行下面的 ret=False
ret = False
return ret
ret = mail()
if ret:
print("邮件发送成功")
else:
print("邮件发送失败")
my_pass即授权码
第三步. 固定时间间隔
最后一步。附完整代码
# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
import time
import json
import urllib.request
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
#我这里是郑州到扬州
def getList():
#这里的网址需要自己去爬取
req = urllib.request.Request('https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date=2019-02-22&leftTicketDTO.from_station=ZZF&leftTicketDTO.to_station=YLH&purpose_codes=ADULT')
req.add_header( 'User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36')
html = urllib.request.urlopen(req).read()
dict = json.loads(html)
result = dict['data']['result']
return result
# return html
my_sender = '118*****[email protected]' # 发件人邮箱账号
my_pass = '*******' # 发件人邮箱密码
my_user = '118*****[email protected]' # 收件人邮箱账号,我这边发送给自己
def mail_yw():
ret = True
try:
# msg = MIMEText('填写邮件内容', 'plain', 'utf-8')
msg = MIMEText('亲,出现余票了哦', 'plain', 'utf-8')
msg['From'] = formataddr(["From_xxd", my_sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号
msg['To'] = formataddr(["FK", my_user]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
msg['Subject'] = "硬卧自制订票系统" # 邮件的主题,也可以说是标题
server = smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件人邮箱中的SMTP服务器,端口是25
server.login(my_sender, my_pass) # 括号中对应的是发件人邮箱账号、邮箱密码
server.sendmail(my_sender, [my_user, ], msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
server.quit() # 关闭连接
except Exception: # 如果 try 中的语句没有执行,则会执行下面的 ret=False
ret = False
return ret
def mail_yz():
ret = True
try:
# msg = MIMEText('填写邮件内容', 'plain', 'utf-8')
msg = MIMEText('亲,出现余票了哦', 'plain', 'utf-8')
msg['From'] = formataddr(["From_xxd", my_sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号
msg['To'] = formataddr(["FK", my_user]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
msg['Subject'] = "硬座自制订票系统" # 邮件的主题,也可以说是标题
server = smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件人邮箱中的SMTP服务器,端口是25
server.login(my_sender, my_pass) # 括号中对应的是发件人邮箱账号、邮箱密码
server.sendmail(my_sender, [my_user, ], msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
server.quit() # 关闭连接
except Exception: # 如果 try 中的语句没有执行,则会执行下面的 ret=False
ret = False
return ret
'''
ret = mail()
if ret:
print("邮件发送成功")
else:
print("邮件发送失败")
'''
'''
'''
def sleeptime(hour,min,sec):
return hour*3600 + min*60 + sec;
second = sleeptime(0,0,20);
while 1==1:
time.sleep(second);
c=0
k=0
print("********")
for i in getList():
if k == 0:
k=1
continue
for n in i.split('|'):
if c== 3:
print("[%s]车次:%s" % (c, n));
if c == 28:
print("[%s]硬卧:%s" % (c, n));
if n!="无":
ret = mail_yw()
if ret:
print("邮件发送成功")
else:
print("邮件发送失败")
if c == 29:
print("[%s]硬座:%s" % (c, n));
if n!="无":
ret = mail_yz()
if ret:
print("邮件发送成功")
else:
print("邮件发送失败")
c+=1
c=0
print("********")
#print (getList())
# if c == 23:
# print("[%s]软卧:%s"%(c,n));
# if c == 26:
# print("[%s]无座:%s"%(c,n));
'''
c=0
for i in getList():
for n in i.split('|'):
print('[%s]%s'%(c,n))
c+=1
c=0
#break
'''
'''
for i in getList():
print(i)
'''