惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
H
Help Net Security
量子位
The Cloudflare Blog
博客园 - Franky
博客园 - 聂微东
博客园 - 司徒正美
Last Week in AI
Last Week in AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
有赞技术团队
有赞技术团队
罗磊的独立博客
GbyAI
GbyAI
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
Martin Fowler
Martin Fowler
S
SegmentFault 最新的问题
美团技术团队
阮一峰的网络日志
阮一峰的网络日志
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
U
Unit 42
MongoDB | Blog
MongoDB | Blog

博客园 - guozili

分享12306抢票心得-最终篇 分享12306全自动验证码识别提交,春运抢票准备时 分享“12306 P2P平台”创业Idea 分享12306秒票杀手锏源码 分享12306秒票心得及杀手锏 分享基于EF+MVC+Bootstrap的通用后台管理系统及架构 分享基于EF+WCF的通用三层架构及解析 基于Silverlight的快速开发框架RapidSL新特性解析 分享基于silverlight的仿“百度文库”的文档控件 分享基于silverlight的一个“树形结构图”控件 基于 Silverlight的快速开发框架RapidSL新版改进源码 基于 Silverlight的快速开发框架RapidSL之MVVM解析 基于Silverlight的快速开发框架RapidSL之开源 分享基于silverlight的一个大文件上传控件 抢火车票利器:分享一个抓取火车票转让信息的小程序 基于 Silverlight的精简框架之版本升级及使用 基于 Silverlight的精简框架之版本和控件更新 Silverlight project demos for MSRA in 2009,to look forward to silverlight's furture 异步编程练习
分享12306抢票心得-终极秒杀思路篇
guozili · 2016-12-08 · via 博客园 - guozili

12306抢票的关键拼的就是整点出票的速度,快的几秒钟,慢的几分钟,本文提供终极抢票攻略,通过多线程扫描上万个CDN,来大幅度提升出票速度。

准备一:需要了解CDN和切站的机制,请参考:

准备二:需要熟悉12306最重要的查询接口和下单接口及传入的参数规范

12306 CDN研究机制一

  • 12306对kyfw.12306.cn用到了全站CDN缓存,至少上万的CDN IP
  • 对于90%的子页面使用了CDN缓存
  • 部分动态内容如个人中心,CDN将充当代理去12306实际服务器读写数据,请百度“cdn回源”

12306 CDN研究机制二

  • 官方网站的自动查询,每次都会命中同一台CDN
  • 拿到的都是CDN缓存数据,缓存时间2分钟
  • 所以运气好的话,整点放票较快就能刷出票,一般情况下要等几十秒才能看到出票
  • 参考下图:

12306 CDN研究机制三

  • 360抢票王每次查询使用不同的CDN,通过内置dll插件实现,每次查询映射不同的IP
  • 参考下图:

12306 频繁刷票容易被踢的猜测

  • 每次查询,都会AJAX Log一下,请参考上面截图
  • 如果登录状态下,cookie的token就被记录上传了
  • 所以登录状态下刷票容易被踢
  • 所以查询时动态修改hosts,切CDN,切站点,也容易被踢

12306 关于secretStr

  • 查询返回的每个车次结果,都会有个secretStr
  • 加密了此车次的所有相关信息,后续用于提交订单用
  • 此secretStr几分钟后会过期
  • 所以关键就是放票整点后能快速刷出这个secretStr
  • 参考下图:

12306 查询设计思路

  • 启用匿名查询,查询结果后返回的secretStr,交给登录的帐号做订单提交
  • 目前市面上的抢票神器或收费软件,都是采用了此机制:
    • 启用多个线程,主线程帐号登录;
    • 其他线程并发匿名作业:轮询请求不同的CDN查询票源;
    • 查到有票的secretStr,塞给主线程进行订单提交;
    • 集成收费打码API,自动化点触验证码,实现多开无人值守抢票

终极设计思路:

  • 做Winform及界面工作量太大,这里提供简单的定制方案和一些设计思路
  • 服务端:自己建个本地的IIS Web站点,去匿名轮询请求不同的CDN查询票源,返回secretStr
  • 客户端:浏览器登录状态,12306任何一个页面,控制台或插件植入js脚本,AJAX长轮询去请求服务端,请求到secretStr做订单提交

终极设计思路之服务端:

  • 自己建个本地的IIS Web站点或在公网上建,或商业化做云服务器分布式的查询
  • 此网站提供接口如:http://127.0.0.1/GetSecretStr...
  • 此接口的实现:启动多线程去上万个CDN去查询指定车次日期的票源
  • 查到secretStr,马上返回给客户端

  帮助:获取kyfw.12306.cn的CDN ip,可以去chinaz上去获取,大概有上千个

  帮助:实在不够,我能提供fishlee的一个IP列表,有上万个

终极设计思路之服务端的关键技术:

  • http://www.cnblogs.com/dudu/archive/2012/07/18/webrequest_dns.html
  • 这个技术,不用修改hosts,使用WebRequest能映射不同的IP
  • 参考下图:

终极设计思路之客户端:

  • 浏览器登录状态,控制台或插件植入js脚本
  • AJAX长轮询去请求服务端,请求到secretStr做订单提交
  • 到最后的订单提交页,用插件自动勾选人,座位,自己手动输入验证码提交
  • 参考下图:

测试结果:整点出票秒数,根据自己以前的N次经验

  • 3-10秒:此文思路,多线程在10秒内对1万个CDN进行查询
  • 5-20秒:某收费软件,采用了后台多线程查询CDN
  • 10-30秒:fishlee的NET订票助手,单线程,每隔1秒尝试不同CDN
  • 15-60秒:360抢票王,也是单线程,但CDN数量不够
  • 20-120秒:官方网站,CDN一般1分钟内不会变,缓存严重
    

最新更新!

  • 验证码问题 参考:http://bbs.fishlee.net/thread-10058-1-1.html
  • 现在没时间研究 工具 加入验证码输入功能,
  • 工具源代码在:https://github.com/guozili/12306
  • 基本思路可以实现下: console工具 要输入验证码时,发送验证码图片二进制(socket)到 verifycodeWPFInput.exe(实现一个WPF程序弹出来)去点击,然后返回验证码坐标给console