梁平区高点击量网站建设哪家好,网站一般需要怎么推广,网站div的高度根据图片,做网站必须需要服务器嘛时隔一年多#xff0c;终于朋友的忽悠下吧抢票Demo的最后一步完善了#xff0c;与2014年1月9日成功生成车票。 Demo仅经过自己测试#xff0c;并未在高峰期进行测试#xff0c;代码质量很差#xff0c;因为赶工#xff0c;套用去年模板并未使用设计模式。 代码存在如下BU…时隔一年多终于朋友的忽悠下吧抢票Demo的最后一步完善了与2014年1月9日成功生成车票。 Demo仅经过自己测试并未在高峰期进行测试代码质量很差因为赶工套用去年模板并未使用设计模式。 代码存在如下BUG 1代码使用 。net 4.5的事件如果使用4.0或以下的同学请根据错误提示更改事件即可。已上传两个版(.net4.0 .net4.5)本。 2添加、刷新常用联系人功能缺失按钮已屏蔽。请在官网添加后重新登录软件即可刷新。 3验证码为手动输入不支持自动识别。未做原因如下1.本人太懒了2.验证码经常变化防止哪天变成公式计算中文识别等特殊情况。 时间仓促代码整体结构是去年的编写的代码很垃圾未使用任何设计模式仅从目的出发并未考虑任何效率、兼容性、安全性、可维护性等问题。高手请绕道勿喷谢谢。 如过有任何问题可以在评论中一起探讨。如对代码有问题可以一起讨论。 本文最后放出的Demo仅供学习请勿用于抢票操作。 什么都不说先上图 软件工作流程 1拉取登陆验证码 2登陆获取Cookie 3拉取常用联系人 4搜索车次前拉取城市地址供给2221个城市 5按时间获取车次信息并供给用户选择 6用户选择指定车次指定日期获取车次及车票信息 7根据用户选择座位号比多刚拉取的车票信息。如果没有车票则间隔6秒时间后重新刷票int m 6 * 100;。 8如果有票判断用户是否有勾选常用联系人如果未勾选则不进行抢票 9抢票第一步请求https://kyfw.12306.cn/otn/confirmPassenger/autoSubmitOrderReques页面获取Token 提交车次信息 Dictionarystring, string dic new Dictionarystring, string(); dic.Add(secretStr, train.Id); dic.Add(train_date, date); dic.Add(tour_flag, dc); dic.Add(purpose_codes, ADULT); dic.Add(query_from_station_name, From.Name); dic.Add(query_to_station_name, To.Name); dic.Add(, ); dic.Add(cancel_flag, 2); dic.Add(bed_level_order_num, 000000000000000000000000000000); dic.Add(passengerTicketStr, passengerTicketStr.ToString().TrimEnd(_)); dic.Add(oldPassengerStr, oldPassengerStr.ToString()); Referer https://kyfw.12306.cn/otn/leftTicket/init headers: new Dictionarystring, string() { { Origin, https://kyfw.12306.cn },{X-Requested-With, XMLHttpRequest} } PostData、Cookie、Referer、Headers这几个是重点必须要有否则失效。 返回Jsondata.data.result中保存Token如 Q6#BA6C4F23E49E84F96A07B8ECA37A9FF350DAD2E2F484AD96F61C2046#O007450669M0099501499019950025#1 为统一名称规定data.data.result使用#进行切割后命名Q#长Token#短Token#数字 10抢票第二步请求页面https://kyfw.12306.cn/otn/confirmPassenger/getQueueCountAsync获取车票数量 提交车次数据 dic.Clear(); dic.Add(train_date, (Convert.ToDateTime(date).ToString(ddd MMM dd yyy , DateTimeFormatInfo.InvariantInfo) DateTime.Now.ToString(HH:mm:ss).Replace(:, %3A) GMT%2B0800 (China Standard Time)).Replace( , )); dic.Add(train_no, train.TrainNo); dic.Add(stationTrainCode, train.StationTrainCode); dic.Add(seatType, seatType); dic.Add(fromStationTelecode, train.from_station_telecode); dic.Add(toStationTelecode, train.end_station_telecode); dic.Add(leftTicket, token.ShortToken); dic.Add(purpose_codes, ADULT); dic.Add(_json_att, ); //注train_date可以使用URl编码即可转码前内容Fri Oct 10 2014 09:59:42 GMT0800 (China Standard Time) Referer: https://kyfw.12306.cn/otn/leftTicket/init headers: new Dictionarystring, string() { {Origin, https://kyfw.12306.cn}, {X-Requested-With, XMLHttpRequest} }); 返回值data.data.ticket与短Token一致 11抢票第三步https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew.do?moduleloginrandsjrand拉取抢票验证码 Get页面仍然要带入Cookies、Referer但无需带入headers 12抢票第四步请求https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueueAsys生成车票 请求数据 dic.Clear(); dic.Add(passengerTicketStr, System.Web.HttpUtility.UrlEncode((passengerTicketStr.ToString().TrimEnd(_))).ToUpper()); dic.Add(oldPassengerStr, System.Web.HttpUtility.UrlEncode(oldPassengerStr.ToString()).ToUpper()); dic.Add(randCode, Code); dic.Add(purpose_codes, ADULT); dic.Add(key_check_isChange, token.LongToken); dic.Add(leftTicketStr, token.ShortToken); dic.Add(train_location, token.Q); dic.Add(_json_att, ); Referer: https://kyfw.12306.cn/otn/leftTicket/init headers: new Dictionarystring, string() { {Origin, https://kyfw.12306.cn}, {X-Requested-With, XMLHttpRequest} }); 注passengerTicketStr、oldPassengerStr均要UrlEncode 当data.data.submitStatus返回True时恭喜你已经抢票成功了等待出票。 总结思路 抢票与官方提供的页面自动提交抢票一次但由于省去验证提交的验证码是否正确环节固加快抢票速度。 扩展思路 可以使用将抢票端分离部署至多台计算机上并且开启多线程。 验证码统一传输至服务器端。 再有验证码客户端去服务端拉取验证码后由人工输入结果并返回。 可以加快抢票速度。 Demo .Net4.5 下载 Demo .New4.0 下载 Demo仅供学习请勿用于抢票操作。 很遗憾由于部分原因停止提供Demo的下载十分抱歉。转载于:https://www.cnblogs.com/comsokey/p/Train1230642014.html