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即授权码
python实现12306自动查余票,并且发送邮件通知python实现12306自动查余票,并且发送邮件通知

第三步. 固定时间间隔

固定时间间隔 点击该链接 查看具体操作

最后一步。附完整代码

# -*- 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)
'''