第一款和第二款软件已经失效了,大家不要在使用了。虽然第二款软件更新到了V3.0版本,但是查到发现警告比较多,所以就更不推荐使用了。第二款软件V3.0版本查毒链接:
所以如果想用刷票软件的话,就推荐12306Bypass分流抢票了,还是老牌的抢票软件功力强大一些,诸位谨记。
另外,再推荐一款12306订票助手,这款之前老四也用过,也是老牌软件,基于.NET编写,今年软件也进行了更新:
- 增加查询休息时间随机化功能
- 增加选项允许默认启用短信提醒
- 搞死若干Bug
- 别忘记官网和官方手机APP以及电话订票
- 刷票不要太快
老四也提供了一份软件原版下载,文末自助获取,祝大家都能顺利买票回家过年。
----------------丑逼分割线----------------
声明::本文采用了新的自媒体文章排版标准,主要是标点符号及中英文的排版改进等,不出意外的话以后老四以后都会遵守,尽量改掉以前的坏习惯。
一年一度的春运大戏又要上演了,每年的抢票都是最让人头疼的,好在的是12306的技术在一直进步着,虽然缓慢,但是比让人看不到希望强,而且今年12306的官方还要上线「候补购票」的功能,也算是为广大人民群众提供了一种新的购票遍历措施。简单的说一下什么是「候补购票」,就是说在春运期间,我们可以先在12306官方购票平台登记个人信息,提前支付自己要购买的车票,然后就会被列为「候补乘客」,当售票期间存有退票、余票时,系统会按照支付的顺序自动为「候补乘客」分配车票,emmmmm~~~~~赤裸裸的「官方抢票软件」嘛!孜孜~
2019年的春运从1月21日(腊月十六)开始,到2019年3月1日(正月廿五)结束,春运抢票第一天从1月23日开始,请收藏好下面的的抢票时间点:
12月23日,可以购买春运第一天(2019年1月21日)的火车票。
2019年1月5日,可以购买2019年年二十九(2月3日)的火车票。
2019年1月6日,可以购买2019年除夕(2月4日)的火车票。
2019年1月7日,可以购买2019年春节(2月5日)的火车票。
2019年1月12日,可以购买2019年正月初六(2月10日)的火车票。
2019年1月30日,可以购买春运最后一天2019年3月1日的火车票。
说回抢票软件,老四普及一点可能大多数人不相信的认知。老四看到大多数人无论是春运还是平时购票,都喜欢用各种平台的抢票系统,多花那么几十块钱托管抢票,例如某程、某哪儿、某行、某猪等平台,然后拉帮结伙的在群里让人们帮助抢票。这些抢票平台有用吗?有用,用它们的确能买到火车票。但是老四也负责任的告诉你,这类平台在平时帮你购票或许还蛮好用,但是在春运期间简直就是鸡肋,如果你死心眼的只指望着它,都有可能回不去家。
有人说为什么?拿钱怎么可以不做事呢?其实不是人家不做事,只不过是随着12306的升级,官方的购票接口早就已经对第三方这些抢票购票平台有所限制了,至于那些国内的浏览器制作的抢票插件(说的就是某60、某豹、某狗等)您就当做当做是日常转发杨超越好了~~
关于抢票,老四再次负责任的说,开启售票的那一刻,如果你网速、手速够快,一定要优先使用12306官方手机客户端抢票,但是我们大多数都是抢不到的,「出来就没」一直以来是12306的调性。这个时候但愿你要有一台电脑,登陆12306官方网站进行选票购买,但同样也是没票,这个时候注意了我们使用订票帮手帮我们刷票,设置好自动提交并将音量调到最大声音以便收听抢票提示音,如图所示:
这是官方刷票最及时的入口点,这里会最先保证你能刷到余票和退票,像老四这种就做办公室工作的人群完全可以几乎时刻监听余票报警,然后购票,人工智能嘛!哈哈!当然,如果您不是像老四这样的行业,没有电脑等环境因素限制,可能就需要下面老四分享软件辅助你购票了,继续往下读吧。
前面说到各大第三方购票平台在春运期间是极其不靠谱的,原因就是这样,12306官方平台是先保证自己的平台的访问和下单需求达到所需之后才会将余票和退票信息开放给第三方,这是老四亲测过的,你可以不信,但是你可以自己亲自尝试,反正第三方平台抢不到票也不多要你的钱,但是老四对这些第三平台吹牛逼、拉人头的行径嗤之以鼻。就在去年,老四就是凭借「钢铁般的意志」使用官方平台的「订票帮手」成功买票回家的。
好了,接下来介绍一下这几款抢票软件,这几款抢票软件区别与第三方购票平台,说白了就是为这些无法时刻盯在电脑面前的人群准备的,技术思路就是实现「订票帮手」的自动化,让你无需一直盯着,负责帮你完成抢票,你只需要负责接收到通知之后完成付款就可以了,毕竟官方的「订票帮手」总是存在登陆信息失效,刷新时间长了自动停止等技术问题。
第一款:开源12306抢票辅助工具
软件来自民间大佬「@173386248」使用Python编写,打开工具后先进行查票操作,双击想要购买的车次然后进行登录操作,登陆成功之后会进行抢票的窗口,然后设置接收抢票成功的邮箱即可。源码如下,成品文末自助下载:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 |
# -*- coding:utf-8 -*- import threading import requests import time from tkinter import * from tkinter.ttk import * from tkinter.messagebox import * class Application_ui(Frame): # 这个类仅实现界面生成功能,具体事件处理代码在子类Application中。 def __init__(self, master=None): Frame.__init__(self, master) self.master.title('12306查票系统') self.master.geometry('795x351') self.createWidgets() def createWidgets(self): self.top = self.winfo_toplevel() self.bum = self.winfo_toplevel() frame = Frame() frame.place(x=20, y=60, width=750, height=259) self.style = Style() self.style.configure('Label1.TLabel', anchor='w', font=('宋体', 9, 'bold')) self.Label1 = Label(self.top, text='出发地:', style='Label1.TLabel') self.Label1.place(relx=0.03, rely=0.068, relwidth=0.072, relheight=0.048) self.Text1Var = StringVar(value='') self.Text1 = Entry(self.top, textvariable=self.Text1Var, font=('宋体', 9)) self.Text1.place(relx=0.091, rely=0.046, relwidth=0.142, relheight=0.094) self.style.configure('Label1.TLabel', anchor='w', font=('宋体', 9, 'bold')) self.Label1 = Label(self.top, text='目的地:', style='Label1.TLabel') self.Label1.place(relx=0.262, rely=0.068, relwidth=0.072, relheight=0.048) self.Text2Var = StringVar(value='') self.Text2 = Entry(self.top, textvariable=self.Text2Var, font=('宋体', 9)) self.Text2.place(relx=0.322, rely=0.046, relwidth=0.142, relheight=0.094) self.style.configure('Command1.TButton', font=('宋体', 9, 'bold')) self.Command1 = Button(self.top, text='查 询', command=self.Command2, style='Command1.TButton') self.Command1.place(relx=0.785, rely=0.046, relwidth=0.172, relheight=0.094) self.style.configure('Label1.TLabel', anchor='w', font=('宋体', 9, 'bold')) self.Label2 = Label(self.top, text='出发日期:', style='Label2.TLabel') self.Label2.place(relx=0.493, rely=0.058, relwidth=0.092, relheight=0.048) self.number = StringVar() numberChosen = Combobox(self.top, textvariable=self.number) numberChosen.place(relx=0.574, rely=0.049, relwidth=0.142, relheight=0.074) numberChosen['values'] = (1, 2, 4, 42, 100) # 设置下拉列表的值 values = [] y = int(time.strftime("%Y", time.localtime())) m = int(time.strftime("%m", time.localtime())) d = int(time.strftime("%d", time.localtime())) i = 0 yy = y mm = m dd = d while i < 30: # 30天数据 if m in (1, 3, 5, 7, 8, 10, 12): if d + i > 31: dd = d + i - 31 mm = m + 1 if mm > 12: yy = y + 1 mm = mm - 12 else: dd = d + i elif m in (4, 6, 9, 11): if d + i > 30: dd = d + i - 30 mm = m + 1 if mm > 12: yy = y + 1 mm = mm - 12 else: dd = d + i else: if (m % 400 == 0) or ((m % 4 == 0) and (m % 100 != 0)): if d + i > 29: dd = d + i - 29 mm = m + 1 if mm > 12: yy = y + 1 mm = mm - 12 else: dd = d + i else: if d + i > 28: dd = d + i - 28 mm = m + 1 if mm > 12: yy = y + 1 mm = mm - 12 else: dd = d + i s = '%d-%02d-%02d' % (yy, mm, dd) values.append(s) i += 1 numberChosen['values'] = tuple(values) numberChosen.current(0) # 设置下拉列表默认显示的值,0为 numberChosen['values'] 的下标值 scrollBar = Scrollbar(frame) scrollBar.pack(side=RIGHT, fill=Y) self.tree = Treeview(frame, height=259, columns=("车次", "出发站名", "到达站名", "出发时间", "到达时间", "一等座", "二等座", "硬卧", "软卧", "硬座", "无座"), show="headings", yscrollcommand=scrollBar.set) scrollBar.configure(command=self.tree.yview) self.tree.column('车次', width=50, anchor='center') self.tree.column('出发站名', width=80, anchor='center') self.tree.column('到达站名', width=80, anchor='center') self.tree.column('出发时间', width=80, anchor='center') self.tree.column('到达时间', width=80, anchor='center') self.tree.column('一等座', width=60, anchor='center') self.tree.column('二等座', width=60, anchor='center') self.tree.column('硬卧', width=60, anchor='center') self.tree.column('软卧', width=60, anchor='center') self.tree.column('硬座', width=60, anchor='center') self.tree.column('无座', width=60, anchor='center') self.tree.heading('车次', text='车次') self.tree.heading('出发站名', text='出发站名') self.tree.heading('到达站名', text='到达站名') self.tree.heading('出发时间', text='出发时间') self.tree.heading('到达时间', text='到达时间') self.tree.heading('一等座', text='一等座') self.tree.heading('二等座', text='二等座') self.tree.heading('硬卧', text='硬卧') self.tree.heading('软卧', text='软卧') self.tree.heading('硬座', text='硬座') self.tree.heading('无座', text='无座') self.tree.pack() class Application(Application_ui): # 这个类实现具体的事件处理回调函数。界面生成代码在Application_ui中。 def __init__(self, master=None): Application_ui.__init__(self, master) header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36", } # 获取各个城市的编号 city_url = "https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9077" rep = requests.get(city_url, headers=header) self.areatocode = {} # 把内容以{城市名:对应的编号}存入字典 for i in rep.content.decode().split("@")[1:]: if i: tmp = i.split("|") self.areatocode[tmp[1]] = tmp[2] def Command2(self): """点击查询按钮触发的逻辑""" start1 = self.Text1.get() to1 = self.Text2.get() date = self.number.get() # 这里日期判断不够严格 自己可以附加 now_data = time.strftime('%Y.%m.%d', time.localtime(time.time())) if not start1: showerror(title='警告', message='出发地不能为空') elif start1 not in self.areatocode: showerror(title='警告', message='输入错误,没有找到该城市') elif not to1: showerror(title='警告', message='目的地不能为空') elif to1 not in self.areatocode: showerror(title='警告', message='输入错误,没有找到该城市') elif not date: showerror(title='警告', message='输入错误,没有找到该日期') elif int(date.replace('-', '')) < int(now_data.replace('.', '')): showerror(title='警告', message='日期不能小于当期日期') elif start1 and to1 and date: if self.Command1['text'] == '查 询': self.Command1['text'] = '正 在 查 询' # 每次点击查询按钮后将按钮设置为不可用 防止多次发送请求 self.Command1.config(state=DISABLED) # 启动一个线程防止程序在查询期间被卡主 出现未响应的情况 t = threading.Thread(target=self.Command1_Cmd, args=(start1, to1, date)) t.start() def Command1_Cmd(self, start1, to1, date): try: start = self.areatocode[start1] to = self.areatocode[to1] # 这里有学生和成人之分 默认直接写成成人了 student = "ADULT" url = "https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=" + date + "&leftTicketDTO.from_station=" + start + "&leftTicketDTO.to_station=" + to + "&purpose_codes=" + student rep = requests.get(url, headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"}) patrst01 = '"result":\[(.*?)\]' # 正则提取查票的结果 rst0 = re.compile(patrst01).findall(rep.content.decode()) checimap_pat = '"map":({.*?})' checimap = eval(re.compile(checimap_pat).findall(rep.content.decode())[0]) if rst0[0] == '': showinfo(title='警告', message='没有找到该车次的信息') rst01 = rst0[0] allcheci = rst01.split(",") # 点击查询按钮 先把内容清空 x = self.tree.get_children() for item in x: self.tree.delete(item) for i in range(0, len(allcheci)): thischeci = allcheci[i].split("|") code = thischeci[3] fromname = thischeci[6] fromname = checimap[fromname] # [7]---toname toname = thischeci[7] toname = checimap[toname] # [8]---stime stime = thischeci[8] # [9]---atime atime = thischeci[9] # [28]---一等座 yz = thischeci[31] if str(thischeci[31]) != '' else "-" # [29]---二等座 wz = thischeci[30] if str(thischeci[30]) != '' else "-" # [30]---硬座 ze = thischeci[29] if str(thischeci[29]) != '' else "-" # [31]---无座 zy = thischeci[26] if str(thischeci[26]) != '' else "-" # 硬卧 xx = thischeci[28] if str(thischeci[28]) != '' else "-" # 软卧 yy = thischeci[23] if str(thischeci[23]) != '' else "-" # 将数据回显到软件中 self.tree.insert('', i, values=( code, fromname, toname, stime, atime, str(yz), str(wz), str(xx), str(yy), str(ze), str(zy))) # 查询完毕将按钮变为正常 self.Command1.config(state=NORMAL) self.Command1['text'] = '查 询' except: self.Command1.config(state=NORMAL) self.Command1['text'] = '查 询' if __name__ == "__main__": top = Tk() top.resizable(width=False, height=False) Application(top).mainloop() try: top.destroy() except: pass |
第二款:开源12306刷票辅助软件,源码也是来自「@173386248」,使用易语言编写,然后经过吾爱大佬「@君莫笑WXH」私人修改和修复,教程无需多言,成品及源码文末自助获取下载。
第三款:盛名已久的超屌分流抢票软件12306Bypass,软件来自大神「Cheney.小风」,并且完全免费还支持云打码,简直业界的良心不能再良心,从2013年初版一直维护到现在,支持qq、邮件、微信等各种方式通知提醒,使用教程也是无需多言,云打码自动识别验证码,多线程秒单、稳定捡漏,不管能不能抢到票,赞助作者20块钱都是理所应当的,鼓励一下这些坚持不懈的人们,因为有这群人在,世界也往往更好了一些。12306Bypass分流抢票最新版本1.13.10文末自助获取下载。
以上三款软件已经打包好分享出来,文末自助获取下载即可,没有账号的需要使用邮箱注册小站即可。顺便再说几点:
- 抢票软件涉及到提交订单时自动识别验证码,所以前两款软件说不定什么时候因为云打码失效而失效,毕竟都是作者个人维护的,有能力的请自己编译源码使用自己的云打码平台。
- 抢票软件从来都不保证帮你抢到票,即使你捐赠作者也不能保证,所以别百分之百的指望软件抢票。最直接的建议还是配合刷票辅助,然后尽量守在官方「订票助手」前刷票,这样几率很大。
- 现在个人信息很重要,即使老四分享了,保证了软件无毒不收录隐私,但是作为使用者也要有忧患意识,使用无论任何第三方的登录,使用之后都请修改一次密码,做到万无一失
最后祝出门在外的朋友,无论你是什么行业,在外混都不容易,一年辛苦到头,回家吃几顿热乎的饭,吹吹牛逼,享受几天,听父母唠叨唠叨,看看孩子等等,这些才是真正的生活。祝你们都能如愿抢到票,幸福安全到家!
更博不易,如果觉得文章对你有帮助并且有能力的老铁烦请捐赠盒烟钱,点我去赞助。或者扫描文章下面的微信/支付宝二维码打赏任意金额(点击"给你买杜蕾斯"),也可扫描小站放的支付宝领红包二维码,线下支付享受优惠的同时老四也可以获得对应赏金,老四这里抱拳谢谢诸位了。捐赠时请备注姓名或者昵称,因为您的署名会出现在赞赏列表页面,您的捐赠钱财也会被用于小站的服务器运维上面,再次抱拳感谢。
资源下载
隐藏内容:******,购买后可见!
下载价格:0 G币
您需要先登录后,才能购买资源
欢迎访问高老四博客(glorze.com),本站技术文章代码均为老四亲自编写或者借鉴整合,其余资源多为网络收集,如涉及版权问题请与站长联系。如非特殊说明,本站所有资源解压密码均为:glorze.com。
楼主可有测评
每一个都测试了,要不然不会发出来的 截图都是我自己的电脑测试的
You are welcome!