日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

马后炮之12306抢票工具(四)--抢票Demo,2014年1月9日终结版

發(fā)布時間:2023/12/10 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 马后炮之12306抢票工具(四)--抢票Demo,2014年1月9日终结版 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

時隔一年多,終于朋友的忽悠下吧搶票Demo的最后一步完善了,與2014年1月9日成功生成車票。

Demo僅經(jīng)過自己測試,并未在高峰期進行測試,代碼質(zhì)量很差,因為趕工,套用去年模板并未使用設(shè)計模式。

代碼存在如下BUG:

1)代碼使用 。net 4.5的事件,如果使用4.0或以下的同學(xué),請根據(jù)錯誤提示,更改事件即可。已上傳兩個版(.net4.0 .net4.5)本。

2)添加、刷新常用聯(lián)系人功能缺失,按鈕已屏蔽。請在官網(wǎng)添加后,重新登錄軟件即可刷新。

3)驗證碼為手動輸入,不支持自動識別。未做原因如下:1.本人太懶了,2.驗證碼經(jīng)常變化,防止哪天變成公式計算,中文識別等特殊情況。

? ? ? 時間倉促,代碼整體結(jié)構(gòu)是去年的,編寫的代碼很垃圾,未使用任何設(shè)計模式,僅從目的出發(fā),并未考慮任何效率、兼容性、安全性、可維護性等問題。高手請繞道,勿噴,謝謝。

? ? ? 如過有任何問題,可以在評論中一起探討。如對代碼有問題,可以一起討論。

本文最后放出的Demo僅供學(xué)習(xí),請勿用于搶票操作。

?

什么都不說,先上圖:

軟件工作流程:

1)拉取登陸驗證碼

2)登陸,獲取Cookie

3)拉取常用聯(lián)系人

4)搜索車次前拉取城市地址,供給2221個城市

5)按時間獲取車次信息,并供給用戶選擇

6)用戶選擇指定車次,指定日期獲取車次及車票信息

7)根據(jù)用戶選擇座位號,比多剛拉取的車票信息。如果沒有車票則間隔6秒時間后重新刷票(int m = 6 * 100;)。

8)如果有票,判斷用戶是否有勾選常用聯(lián)系人,如果未勾選則不進行搶票

9)搶票第一步:請求https://kyfw.12306.cn/otn/confirmPassenger/autoSubmitOrderReques頁面獲取Token

  提交車次信息: 

  Dictionary<string, string> dic = new Dictionary<string, 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 Dictionary<string, string>() { { "Origin", "https://kyfw.12306.cn" },{"X-Requested-With", "XMLHttpRequest"} }

?  PostData、Cookie、Referer、Headers這幾個是重點,必須要有,否則失效。

  返回Json:data.data.result中保存Token,如:

    Q6#BA6C4F23E49E84F96A07B8ECA37A9FF350DAD2E2F484AD96F61C2046#O007450669M0099501499019950025#1

  為統(tǒng)一名稱,規(guī)定data.data.result使用#進行切割后命名:Q#長Token#短Token#數(shù)字

?

10)搶票第二步:請求頁面https://kyfw.12306.cn/otn/confirmPassenger/getQueueCountAsync獲取車票數(shù)量

  提交車次數(shù)據(jù):

  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編碼即可,轉(zhuǎn)碼前內(nèi)容:Fri Oct 10 2014 09:59:42 GMT+0800 ?(China Standard Time)

  Referer: "https://kyfw.12306.cn/otn/leftTicket/init"  

  headers:
  new Dictionary<string, string>()
  {
    {"Origin", "https://kyfw.12306.cn"},
    {"X-Requested-With", "XMLHttpRequest"}
  });

  返回值:data.data.ticket與短Token一致

11)搶票第三步:https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew.do?module=login&rand=sjrand&拉取搶票驗證碼:

  Get頁面,仍然要帶入Cookies、Referer,但無需帶入headers

?

12)搶票第四步:請求https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueueAsys,生成車票

  請求數(shù)據(jù):    

  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 Dictionary<string, string>()
  {
    {"Origin", "https://kyfw.12306.cn"},
    {"X-Requested-With", "XMLHttpRequest"}
  });

  注:passengerTicketStr、oldPassengerStr均要UrlEncode

?

 當data.data.submitStatus返回True時,恭喜你,已經(jīng)搶票成功了,等待出票。

?

總結(jié)思路:

搶票與官方提供的頁面自動提交搶票一次,但由于省去驗證提交的驗證碼是否正確環(huán)節(jié),固加快搶票速度。

?

?

?擴展思路:

可以使用將搶票端分離,部署至多臺計算機上,并且開啟多線程。

驗證碼統(tǒng)一傳輸至服務(wù)器端。

再有驗證碼客戶端去服務(wù)端拉取驗證碼后,由人工輸入結(jié)果并返回。

可以加快搶票速度。

?

?

Demo .Net4.5 下載

Demo .New4.0 下載

Demo僅供學(xué)習(xí),請勿用于搶票操作。

?很遺憾,由于部分原因,停止提供Demo的下載,十分抱歉。

轉(zhuǎn)載于:https://www.cnblogs.com/comsokey/p/Train1230642014.html

總結(jié)

以上是生活随笔為你收集整理的马后炮之12306抢票工具(四)--抢票Demo,2014年1月9日终结版的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。