由于近期需要刷火车票,飞猪和智行刷没有vip略坑,自己尝试了一下。具体的思路:python requests库爬取12306余票结果,re模块正则找到想要的车次,通过twilio发送短信给自己的手机,python threading库实现多个车次的监控。

1. 环境:

linux,python 2.7,twilio
twilio : 支持python发送短信,https://www.twilio.com/ 免费注册,第一次尝试没有注册成功,百度结果是注册可能需要fq,用xxnet尝试注册仍然不行,后来无意间再试一次,没有fq也成功了,注册赠送$15,账号生成account_sid,auth_token和一个美国号码。

2. 实现:

2.1 初始化变量

url1="https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9098"
#获取12306站点代号查询结果,版本可能需要更新
html1=requests.get(url1).text
area=re.findall(ur"([\u4E00-\u9FA5]+)\|([A-Z]+)",html1)
area=dict(area)
#把站点代码映射存入一个dict
tag = '无'.decode('utf-8')
#查询结果标记
pool = []
#标记一个线程池
account_sid = '************************'
auth_token  = '**************************'
#twilio 提供的接口
twilioclient = Client(account_sid, auth_token)
#登录twilio

2.2 生成12306查询网址

#param是订单参数
def gerUrl(param):from_area=area[param['fs']]to_area=area[param['ts']]time=param['data']url=("https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={}""&leftTicketDTO.from_station={}""&leftTicketDTO.to_station={}""&purpose_codes=ADULT").format(time,from_area,to_area)return url

2.3 查询及结果处理

def work(param):print "mission start"print paramtageturl = gerUrl(param)while True :time.sleep(1)#到车票日期结束后,没有结果直接结束if  time.mktime(time.strptime(param['data'],"%Y-%m-%d"))-time.time() < 86400:returntry:html2=requests.get(tageturl)s=html2.json()["data"]["result"]except Exception as e:continuefor area_new in s:list=area_new.split("|")if list[3]==param['zNo'] : res = "%s 二等座:%s,无座:%s,%s"%(param['zNo'],list[30].encode('utf-8'),list[26].encode('utf-8'),datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))if list[30]!= tag :#sendmail(text)sendmsg(res)return

2.4 发送邮件及短信

def sendmsg(text):message = twilioclient.messages.create(to="+8601234567890", from_="+12345678901",body=text)print textprint ('Done.sent message success')def sendmail(text):host = 'smtp.163.com'  # 设置发件服务器地址port = 465  # 设置发件服务器端口号。注意,这里有SSL和非SSL两种形式,现在一般是SSL方式sender = 'xxx@163.com'  # 设置发件邮箱,一定要自己注册的邮箱pwd = 'xxx'  # 设置发件邮箱的授权码密码,根据163邮箱提示,登录第三方邮件客户端需要授权码receiver = 'xxxxx'# 设置邮件接收人,可以是QQ邮箱# 设置邮件正文,这里是支持HTML的msg = MIMEText(text.decode('utf-8'), 'plain','gbk') # 设置正文为符合邮件格式的HTML内容msg['subject'] = '火车票监控'.decode('utf-8')# 设置邮件标题msg['from'] = sender  # 设置发送人msg['to'] = receiver  # 设置接收人try:s = smtplib.SMTP_SSL(host, port)  # 注意!如果是使用SSL端口,这里就要改为SMTP_SSLs.login(sender, pwd)  # 登陆邮箱s.sendmail(sender, receiver, msg.as_string())# 发送邮件!print ('Done.sent email success')except smtplib.SMTPException:print ('Error.sent email fail')

2.5 多线程及主函数

def addtask(param):t=threading.Thread(target=work, args=(param,))t.setDaemon(True)t.start()pool.append(t)time.sleep(5)if __name__ == '__main__':param1 = {'fs':'合肥'.decode('utf-8'),'ts':'杭州'.decode('utf-8'),'zNo':'D2224','data':'2019-04-04'}param2 = {'fs':'杭州'.decode('utf-8'),'ts':'合肥'.decode('utf-8'),'zNo':'D2192','data':'2019-04-07'}addtask(param1)addtask(param2)flag = Truewhile flag:time.sleep(1)for t in pool:flag |= t.__dict__['_Thread__stopped']print "mission completed!"

3. 结果及完善


由于比较仓促,只实现了功能,还有地方没有完善也不想太折腾,比如param中日期、地点和车次不匹配的话,没有提醒功能(这个比较容易实现,就是懒…),比如python实现登录后自动抢票等等,以后有时间完善吧。
好了,全部的代码也贴一遍。

#!/usr/bin/python
# encoding: utf-8
import sys
import threading
import re,requests
import smtplib
from email.mime.text import MIMEText
import time, datetime
from twilio.rest import Clienturl1="https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9098"
html1=requests.get(url1).text
area=re.findall(ur"([\u4E00-\u9FA5]+)\|([A-Z]+)",html1)
area=dict(area)
tag = '无'.decode('utf-8')
pool = []account_sid = '*********************'
auth_token  = '**********************'
twilioclient = Client(account_sid, auth_token)def gerUrl(param):from_area=area[param['fs']]to_area=area[param['ts']]time=param['data']url2=("https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={}""&leftTicketDTO.from_station={}""&leftTicketDTO.to_station={}""&purpose_codes=ADULT").format(time,from_area,to_area)return url2#table=PrettyTable(["车次","出发站","到达站","出发时间","到达时间","历时","特等座","一等座","二等座","软卧","硬卧","软座","硬座","无座"])def work(param):print "mission start"print paramtageturl = gerUrl(param)while True :time.sleep(1)if  time.mktime(time.strptime(param['data'],"%Y-%m-%d"))-time.time() < 86400:returntry:html2=requests.get(tageturl)s=html2.json()["data"]["result"]except Exception as e:continuefor area_new in s:list=area_new.split("|")if list[3]==param['zNo'] : res = "%s 二等座:%s,无座:%s,%s"%(param['zNo'],list[30].encode('utf-8'),list[26].encode('utf-8'),datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))if list[30]!= tag :#sendmail(text)sendmsg(res)returndef sendmsg(text):message = twilioclient.messages.create(to="+8601234567890", from_="+12345678901",body=text)print textprint ('Done.sent message success')def sendmail(text):host = 'smtp.163.com'  # 设置发件服务器地址port = 465  # 设置发件服务器端口号。注意,这里有SSL和非SSL两种形式,现在一般是SSL方式sender = 'xxxx@163.com'  # 设置发件邮箱,一定要自己注册的邮箱pwd = 'xxxxx'  # 设置发件邮箱的授权码密码,根据163邮箱提示,登录第三方邮件客户端需要授权码receiver = 'xxx'# 设置邮件接收人,可以是QQ邮箱# 设置邮件正文,这里是支持HTML的msg = MIMEText(text.decode('utf-8'), 'plain','gbk') # 设置正文为符合邮件格式的HTML内容msg['subject'] = '火车票监控'.decode('utf-8')# 设置邮件标题msg['from'] = sender  # 设置发送人msg['to'] = receiver  # 设置接收人try:s = smtplib.SMTP_SSL(host, port)  # 注意!如果是使用SSL端口,这里就要改为SMTP_SSLs.login(sender, pwd)  # 登陆邮箱s.sendmail(sender, receiver, msg.as_string())# 发送邮件!print ('Done.sent email success')except smtplib.SMTPException:print ('Error.sent email fail')def addtask(param):t=threading.Thread(target=work, args=(param,))t.setDaemon(True)t.start()pool.append(t)time.sleep(5)if __name__ == '__main__':param1 = {'fs':'合肥'.decode('utf-8'),'ts':'杭州'.decode('utf-8'),'zNo':'D2224','data':'2019-04-04'}param2 = {'fs':'杭州'.decode('utf-8'),'ts':'合肥'.decode('utf-8'),'zNo':'D2192','data':'2019-04-07'}addtask(param1)addtask(param2)flag = Truewhile flag:time.sleep(1)for t in pool:flag |= t.__dict__['_Thread__stopped']print "mission completed!"'''#这里查找别人的结果,指出各个字段的意思。。。。YUNXIN=list[1]no=list[3]from_area=list[6]to_area=list[7]star_time=list[8]over_time=list[9]pass_time=list[10]TDZ=list[32] or"--"YDZ=list[31] or"--"EDZ=list[30] or"--"RW=list[23] or "--"YW=list[28] or "--"RZ=list[27] or"--"YZ=list[29] or"--"WZ=list[26] or"--"table.add_row([no,t[from_area],t[to_area],star_time,over_time,pass_time,TDZ,YDZ,EDZ,RW,YW,RZ,YZ,WZ])
#print(table)'''

python实现火车票监控相关推荐

  1. 判断火车票座位python代码_12306 火车票监控Python代码,12306python, import u

    12306 火车票监控Python代码,12306python, import uimport urllib.request as request import http.cookiejar as c ...

  2. 实例代码分享Python实现Linux监控

    本文通过实例代码给大家介绍了Python实现Linux监控的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下. 工作原理:基于/proc 文件系统 Linux 系统为管理员提供了非常好的方 ...

  3. python实现网络监控_使用python进行服务器监控

    使用python进行服务器监控 Linux服务器中,一切皆为文件.也就是说服务器运行的各种信息,其实是可以从某些文件中查询得到: Linux系统中,有一个/proc的虚拟文件系统 Linux 系统为管 ...

  4. python监控错误语句,基于Python的关键字监控及告警

    基于Python的关键字监控及告警 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  基于Python的关键字监控及告警.txt ] (友情提示:右键点上行txt文档 ...

  5. Python:通过远程监控用户输入来获取淘宝账号和密码的实验(二)

    从今天早上产生了写个获取淘宝账号及密码的想法后,到现在,全天都在看书.调试程序,12小时内写了三篇相关博客,如下: <Python:通过获取淘宝账号和密码的实验,来看登陆方式选择的重要性> ...

  6. python写mysql脚本_使用python写一个监控mysql的脚本,在zabbix web上加上模板

    使用python写一个监控mysql的脚本,在zabbix web上加上模板: ##先使用MySQLdb的接口关联数据库. [root@cml python]# cat check_Mysql_cus ...

  7. python判断火车票座位_Python抢票程序优化,可以选择车次和座次

    Python抢票程序优化,可以选择车次和座次 阅读文本大概需要 5 分钟. pk 哥在元旦前写了一篇关于自动化抢票的程序 用Python抢火车票加邮件通知,同时建了一个火车票助力群,本来只是写着玩玩, ...

  8. python 监控内存_使用python写一个监控不同机器的使用内存情况并使用flask出图

    使用python写一个监控不同机器的使用内存情况并使用flask出图 基于是自己想要扩展前一篇博客的内容所以直接就把代码传上去了能做出的效果是可以像zabbix那样监控多台主机上的使用内存情况: 出来 ...

  9. 使用Python编写Prometheus监控metrics接口

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 要使用python编写Prometheus监控,需要你先开启Prometheus集群.可以参考https://blog.csdn.net/luanpe ...

最新文章

  1. 实易智能DNS单台设备QPS高达28万
  2. java课设电子门禁_Door门禁系统.doc
  3. redis value多大会影响性能_选择合适Redis数据结构,减少80%的内存占用
  4. 我用自己创造的深度学习框架进入腾讯,爽!
  5. mysql高级查询教程_MYSQL高级查询
  6. 有关数据库事务的一些理解-原生的Java的JDBC事务
  7. SSHnbsp;整合-nbsp;6nbsp;-nbsp;service_serviceImp…
  8. Flutter实战一Flutter聊天应用(十)
  9. java设置随机数教程
  10. PDF文件编辑方法:PDF怎么插入图片背景
  11. mic in和line in
  12. Ubuntu 14.04 引导修复(Boot Repair)(双系统修复一)
  13. 计算机有网络却不能上网,电脑有网络,但是浏览器不能上网怎么办
  14. 南京信息工程大学计算机与科学专业,南京信息工程大学王牌专业有哪些及专业排名...
  15. vue中加载maptalks图标(markers)点击事件InfoWindow添加按钮点击事件
  16. ZenBrush(禅宗画笔)反编译后二次开发(电子签名_毛笔带笔锋的效果)
  17. mysql 3306无法访问_Mysql 3306端口无法被远程机器访问
  18. 网页回拨(客服)的弊端
  19. 盒子装载图片时出现的盒子比图片实际偏高的问题
  20. 《FLUENT 14.0超级学习手册》——第1章 流体力学与计算流体力学基础1.1 流体力学基础...

热门文章

  1. IMOLD.V13.SP3.forSolidWorks2011-2016
  2. 第二天:非线性规划(nonlinear programming)
  3. 带以太网和 CAN 的低压模块-德国KLARIC 新款KLARI-FUSE3|新能源静态电压电流数据采集模块
  4. 【北邮国院大三上】互联网协议_Internet Protocol_PART B
  5. CSDN博客大事日记1
  6. C语言的预处理器无法先展开宏再拼接符号?可以!
  7. MSP432学习01--新建keil空工程
  8. Arcgis水文分析模块小流域划分流程
  9. studio中 Connection reset
  10. protege连接mysql_Protege4.0使用说明+问题整理.doc