我鄙视一切商业性质的抢票工具。这些公司取代了火车站门口兜售的个体,成为了新时代的垄断黄牛。
一道面试题:让你实现一套自动抢票系统,你会怎么设计?前端
大致来讲,有这样几个功能须要实现:node
1. 模拟网络请求。12306没有提供过API,因此要能经过程序自动购票,只能去模拟(伪造)请求。请求的来源能够是12306网页版,也能够从12306的APP里抓包分析。面试
只是拿到请求地址,最多能够查询余票,并不能成功购票,必须以帐号登陆才能得到购票权限。若是一次登陆就能够,那解决途径有不少,直接在手动登陆后把cookie取出给程序使用都行。编程
仅仅这种程度,几乎全部会写一些爬虫的人都能解决。咱们爬虫课程里的实例都比这个要复杂。安全
但12306在高峰时常常会退出登陆状态,须要不定时地从新登陆。这就遇到了自动购票最大的阻碍:服务器
2. 验证码。12306的验证码相信你们都体会过,正常人类都能被拦住,简单的程序显然是没法搞定的。给三种解决思路:微信
a. 人工干预。程序遇到验证码后,由人去点击正确的验证码,保证程序顺利进行。这里能够用 selenium 实现,也能够经过程序将验证码单独取出供点击。cookie
b. 打码平台。打码平台是一种神奇的存在,它会将你须要识别的验证码分配到一个个打码人员的客户端里,他们帮你选择正确的结果。固然这是要付费的,不过因为高度规模化,这个成本被降到很低。网络
这是上一种方法的增强版,只是不用你本身盯着程序运行,而是由其余人帮你解决。机器学习
c. 图像识别。12306的图片验证码尽管奇葩,但也不是没法识别,甚至一些机器学习的通用识别服务均可以达到必定的识别率。知乎上就有很多人给出过识别的参考方法和效果:
如何评价 12306 的图片型验证码?而一些抢票工具更是把验证码识别功能做为VIP功能来收费。
3. 定时刷新。解决了前两个问题,购票的流程已经打通。只要在程序里加上定时功能就能够自动购票了。这里能够选择一直运行程序,定时发送请求,也能够经过 Linux 的 cronjob、Windows 的计划任务等实现定时运行。
不过到这一步为止,只能说你实现了一个自动“购”票的脚本,离“抢”票还有很远的距离。即便你把请求间隔调整得很低,在春运出票高峰也很难有效果。若是想要进一步提高效果,还得考虑:
4. 多帐号、分布式请求。在你本身的电脑上用本身的帐号不停刷票,一来是速度是有瓶颈的,再快大约也须要几秒钟才能完成一次购票尝试,二来这极可能致使你的帐号、IP被封禁。因此,你必须有足够多的帐号和机器,能够在极短期内发起大量的购票请求,才能把购票成功率提升到一个有竞争力的水平。从技术角度来讲,这不算困难,各类随开随用的云服务弹性计算就是知足你此类需求的。
以上几点,基本就是一个抢票系统须要考虑的主要问题,接下来就是要在实践中优化你的程序,提高性能和稳定性,考虑诸如时间间隔、服务器的选择,以及购票条件的设定、通知发送等细节。
看到这里也许有人要说了:
代码在哪里下载?怎么用?
整这么复杂干吗,XXX软件早就实现实现了。
对此我要说的是,以上仅仅是对一个技术问题的分析讨论,我没有也无心开发一款实用的抢票软件。因此今天这里不会有任何代码下载,也不会推荐任何软件。
我鄙视一切商业性质的抢票工具。
咱们谈论的技术自己不存在善恶。但使用技术的人/公司却有立场,做为大企业更应该承担相应的社会责任。
当我在此文开头设定那道“面试题”的时候,我想除了黄牛党,真的会有公司这么问吗?通常正常公司也是问“若是你设计12306网站,如何防刷票?”吧。
可现现在,有多少体面的大公司,推出抢票工具或在本身的APP里增长抢票功能,以此推广或牟利。
在这里,我我的建议不要使用这些工具。这并非仅仅是为了立场而反对,而是这里自己就有不少不安全因素。
1. 不少工具打着免费刷票的旗号,但等你真的用了就发现,不付费几乎是买不到票的。甚至有时候你没发现,就已经付了费,买了VIP/加速包。
2. 你觉得花了钱,就真的能够买到票吗?并非。即便按照他们明面上的说法,也只是给你分配更多的资源,提升你抢到的几率。但实际上怎样,不得而知。反正抢不到最多退款呗。听过“包生男孩”的偏方吗:收你一万,包生男孩,不灵退款。这些软件即便什么额外功能都不提供,仅仅是替你转发购票请求,也能够赚到钱。
已经有网友验证过,某些工具里显示的“已抢票XXXX次”,其实只是前端页面写的代码,并非后台的真实数据,断了网也会自动增长。固然咱们不能以此推断说他必定没有去刷,但客观事实就是,他刷没刷,刷的频率如何,你并不知道。
就算真的没有忽悠你,确实付了钱增长为你抢票的资源,但你能够想象一下:本来你们都是各自去抢,拼网速手速和运气。后来有人付了钱,经过更好的渠道抢到了票。因而你们都开始付钱。付费渠道虽然更快,但资源也不是无限的,若是用户增长到必定程度,必然要有个优先级。若是你是刷票公司,你会让谁先买?想象一下银行里,你们都成了VIP客户,VIP窗口和普通窗口,哪一个办业务更快?你以为刷票公司是会单纯增长VIP资源,仍是会关掉绝大多数普通窗口,而后再开辟新的SVIP窗口、SSVIP……。
3. 使用抢票软件,你必须提供帐号、密码、身份证信息用于登陆和购票,有些还会要求你支付预付款。对于这些置社会公平于不顾的公司,你却很信任他们的隐私保护?想一想我刚刚技术分析中提到的,提升抢票成功率须要大量的帐号,你以为他们的帐号是从哪里来的呢?
4. 一些更没节操的黑产从业者也在这场抢票混战中虎视眈眈,一不当心下载了带木马的抢票软件,或者是被人用软件合成的火车票骗了钱,这也都不是什么新鲜事。
在现有铁路运力没法充分应对春运客流的客观条件限制下,为了能保证绝大多数人都有相对公平的机会,火车票价并不会像飞机票同样随市场需求水涨船高。可这些公司倒好,把这个空间做为本身大捞一票的机会,颇有商业头脑是吧。说到底,大家无非是取代上个时代的黄牛罢了。并且比起各地零散的黄牛,掌握着技术、渠道和大量用户数据的大公司更强势。久而久之地恶性循环,或许再过两年的春节,不经过这些APP加价购票,就无法正常买到车票了。
好在12306也并无像你们觉得的那么烂,这几年的稳定性已经提高很多,今年听说增长了应对刷票的“慢速排队机制”:购票的时候,若是有用户疑似使用机器或外挂抢票,将会被列入慢速排队队列,让符合规定的用户在正常速度中排队。但愿真的能有效果。
其实你们都很无奈,抢不到票回不了家,否则谁愿意去给刷票软件奉上金钱和隐私。这也是没办法的办法。
一些前人总结的购票技巧,但愿能增长买到票的几率:
1. 算好预售期,从出票就开始抢。
这个是最基本的了。不过今年的时间点已通过去。若是你没遇上,或者抢了但没抢到,也别放弃,还有机会。
2. 把握捡漏的时间点。火车票通常都不会在开票的时候所有放出,再加上不断有人退票,因此即便如今显示无票了,也仍是可能会有新票放出。几个重要的时间点:
3. 曲线乘车。好比尝试买到目的地的下一站/上一站(需补票),或者分段成两个不一样车次购买。
4. 电话购票,这个渠道常被人遗忘。当你们都在互联网抢票的时候,也能够尝试下,或许有惊喜。购票电话:95105105。并且一个小技巧是,这个电话是区分铁路局的,能够加拨区号,去特定的铁路局进行购票。
然而,这些也只能多增长一些买到票的可能性而已。黄牛、刷票软件的存在,本质上是特定时间内的供求不平衡带来的矛盾。若是这一点不能解决,即便防范了全部黄牛和刷票,也无法让全部人都买到票。这场道高一尺魔高一丈的比拼还会不断持续下去。
希望状况在不久以后能够逐步改善。此刻我也只能祝你们都能顺利买到票,开开心心回家过个年。
PS:若是以为路程太长,能够看看咱们的教程,在微信里也能够直接写Python哦 :-)
Crossin的编程教室 - 在线练习════
其余文章及回答: