private void button2_Click(object sender, RoutedEventArgs e) { List<TicketModel> tickets = new List<TicketModel>(); QueryModel query = new QueryModel(); query.orderRequest_from_station_telecode = (_ctlListForm.SelectedItem as City).Code; query.orderRequest_to_station_telecode = (_ctlListTo.SelectedItem as City).Code; //query.orderRequest_train_date = _ctlDate.SelectedDate.Value.ToString("yyyy-MM-dd"); _12306Proxy proxy = new _12306Proxy(_client); for (int day = 0; day < 10; day++) { query.orderRequest_train_date = DateTime.Now.AddDays(day).ToString("yyyy-MM-dd"); tickets.AddRange(proxy.Query(query)); } ListCollectionView GroupedCustomers = new ListCollectionView(tickets); GroupedCustomers.GroupDescriptions.Add(new PropertyGroupDescription("StartDate")); _ctlDataGrid.ItemsSource = GroupedCustomers; }
private void Run() { int tryCount = -1; bool isFinished = false; string orderNo = null; string message = null; ConfirmModel confirmModel =null; int step = 1; // 1提交订单 2排队领号 _12306Proxy proxy = new _12306Proxy(_client); QueryModel _query = new QueryModel(); _query.trainClass = "QB#D#Z#T#K#QT#";// string.Empty; _query.from_station_telecode_name = _selectedTrain.Start; _query.to_station_telecode_name = _selectedTrain.Arrive; _query.orderRequest_from_station_telecode = _selectedTrain.StartCode; _query.orderRequest_to_station_telecode = _selectedTrain.ArriveCode; _query.orderRequest_train_no = _selectedTrain.No; //query.orderRequest_train_date = _ctlDate.SelectedDate.Value.ToString("yyyy-MM-dd"); _query.orderRequest_train_date = DateTime.Now.AddDays(_day).ToString("yyyy-MM-dd"); while (_isRunning) { if (step == 1) { #region 查票 预定 Thread.Sleep(1000); tryCount++; List<TicketModel> tickets = proxy.Query2(_query, out message); if (tickets == null || tickets.Count == 0) { _isRunning = false; break; } else { foreach (TicketModel t in tickets) { if (_selectedSeat.seat == "4" && t.Num_RW) { // 软卧 confirmModel = proxy.Submit2(_query, t, _randCode, out message); if (confirmModel == null) { this.Dispatcher.Invoke(new Action<string, int>(OrderLog), message, tryCount); _isRunning = false; break; } else { confirmModel.randCode = _randCode; if (proxy.Confirm2(confirmModel, _selectedPassenger, _selectedSeat, out message)) { step = 2; // 前往排队领号 this.Dispatcher.Invoke(new Action<string, int>(OrderLog), "提交成功,等待领号!", tryCount); break; } else { // 订购失败 this.Dispatcher.Invoke(new Action<string, int>(OrderLog), message, tryCount); } } } else if (_selectedSeat.seat == "3" && t.Num_YW) { // 硬卧 confirmModel = proxy.Submit2(_query, t, _randCode, out message); if (confirmModel == null) { this.Dispatcher.Invoke(new Action<string, int>(OrderLog), message, tryCount); _isRunning = false; break; } else { confirmModel.randCode = _randCode; if (proxy.Confirm2(confirmModel, _selectedPassenger, _selectedSeat, out message)) { step = 2; // 前往排队领号 this.Dispatcher.Invoke(new Action<string, int>(OrderLog), "提交成功,等待领号!", tryCount); break; } else { // 订购失败 this.Dispatcher.Invoke(new Action<string, int>(OrderLog), message, tryCount); } } } else if (_selectedSeat.seat == "1" && t.Num_YZ) { // 硬座 confirmModel = proxy.Submit2(_query, t, _randCode, out message); if (confirmModel == null) { this.Dispatcher.Invoke(new Action<string, int>(OrderLog), message, tryCount); _isRunning = false; break; } else { confirmModel.randCode = _randCode; if (proxy.Confirm2(confirmModel, _selectedPassenger, _selectedSeat, out message)) { step = 2; // 前往排队领号 this.Dispatcher.Invoke(new Action<string, int>(OrderLog), "提交成功,等待领号!", tryCount); break; } else { // 订购失败 this.Dispatcher.Invoke(new Action<string, int>(OrderLog), message, tryCount); } } } else { // 订购失败 this.Dispatcher.Invoke(new Action<string, int>(OrderLog), "暂无车票!", tryCount); } } } #endregion } else if (step == 2) { int waitCount = 0; Thread.Sleep(500); orderNo = proxy.GetOrderNo(out waitCount, out message); if (!string.IsNullOrEmpty(orderNo)) { step = 3; } else { if (waitCount == 0) { _isRunning = false; break; } } } else { proxy.GoPay(orderNo, confirmModel, _selectedPassenger, _selectedSeat); isFinished = true; _isRunning = false; } } // 订购完毕 if (isFinished) { this.Dispatcher.Invoke(new Action<string>(OrderSuccess), "订购成功!"); } else { // 订购失败 this.Dispatcher.Invoke(new Action<string>(OrderFailure), message); } }
public List<TicketModel> Query(QueryModel model) { List<TicketModel> tickets = new List<TicketModel>(); Dictionary<string, string> parameters = new Dictionary<string, string>(); parameters["method"] = model.method; parameters["orderRequest.train_date"] = model.orderRequest_train_date; parameters["orderRequest.from_station_telecode"] = model.orderRequest_from_station_telecode; parameters["orderRequest.to_station_telecode"] = model.orderRequest_to_station_telecode; parameters["orderRequest.train_no"] = model.orderRequest_train_no; parameters["trainPassType"] = model.trainPassType; parameters["trainClass"] = model.trainClass;// Uri.EscapeUriString(model.trainClass); parameters["includeStudent"] = model.includeStudent; parameters["orderRequest.start_time_str"] = Uri.EscapeUriString(model.orderRequest_start_time_str); parameters["seatTypeAndNum"] = model.seatTypeAndNum; string content = _client.Get( "https://dynamic.12306.cn/otsweb/order/querySingleAction.do", parameters, "https://dynamic.12306.cn/otsweb/loginAction.do?method=init"); content = content.Replace(" ", string.Empty); /* 0, <span id='id_24000000T90H' class='base_txtdiv' onmouseover=javascript:onStopHover('24000000T90H#BXP#CUW') onmouseout='onStopOut()'>T9</span>, <img src='/otsweb/images/tips/first.gif'>北京西<br>15:20, <img src='/otsweb/images/tips/last.gif'>重庆北<br>15:45, 24:25, --, --, --, --, --, <font color='darkgray'>无</font>, <font color='darkgray'>无</font>, --, <font color='darkgray'>无</font>, <font color='#008800'>有</font>, --, <input type='button' class='yuding_u' onmousemove=this.className='yuding_u_over' onmousedown=this.className='yuding_u_down' onmouseout=this.className='yuding_u' onclick=javascript:getSelected('T9#24:25#15:20#24000000T90H#BXP#CUW#15:45#北京西#重庆北#1*****31454*****00001*****00003*****0000#FB3A6C340D81A5FFA714F210095783F4466626E01A20491E5A0A1392') value='预订'></input> 1, <span id='id_240000K5070I' class='base_txtdiv' onmouseover=javascript:onStopHover('240000K5070I#BXP#CUW') onmouseout='onStopOut()'>K507</span>, <img src='/otsweb/images/tips/first.gif'>北京西<br>21:45, 重庆北<br>00:35, 26:50, --, --, --, --, --, <font color='darkgray'>无</font>, <font color='darkgray'>无</font>, --, <font color='#008800'>有</font>, <font color='#008800'>有</font>, --, <input type='button' class='yuding_u' onmousemove=this.className='yuding_u_over' onmousedown=this.className='yuding_u_down' onmouseout=this.className='yuding_u' onclick=javascript:getSelected('K507#26:50#21:45#240000K5070I#BXP#CUW#00:35#北京西#重庆北#1*****30734*****00001*****04163*****0000#62DF83B44914B925EEA1CE49D2B9200A4FFAA3C922F79D4436EEBE77') value='预订'></input> * */ string[] segments = content.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); for (int index = 1; index < segments.Length; index += 16) { TicketModel ticket = new TicketModel(); ticket.StartDate = model.orderRequest_train_date; ticket.TrainCode = ParseValue(segments[index + 0], "id='id_(?<value>[^']*)'"); ticket.TrainName = ParseValue(segments[index + 0], ">(?<value>[^<>]*)<"); ticket.StartCity = ParseValue(segments[index + 1], "(?<value>[^<>]*)<br"); ticket.StartTime = ParseValue(segments[index + 1], "<br/>(?<value>[^<>]*)'"); ticket.ArriveCity = ParseValue(segments[index + 2], "(?<value>[^<>]*)<br"); ticket.ArriveTime = ParseValue(segments[index + 2], "<br/>(?<value>[^<>]*)'"); ticket.TotalTime = segments[index + 3]; ticket.Num_SWZ = ParseNum(segments[index + 4]); ticket.Num_TDZ = ParseNum(segments[index + 5]); ticket.Num_YDZ = ParseNum(segments[index + 6]); ticket.Num_EDZ = ParseNum(segments[index + 7]); ticket.Num_GJRW = ParseNum(segments[index + 8]); ticket.Num_RW = ParseNum(segments[index + 9]); ticket.Num_YW = ParseNum(segments[index + 10]); ticket.Num_RZ = ParseNum(segments[index + 11]); ticket.Num_YZ = ParseNum(segments[index + 12]); ticket.Num_WZ = ParseNum(segments[index + 13]); ticket.Num_QT = ParseNum(segments[index + 14]); string ticketStr = ParseValue(segments[index + 15], "javascript:getSelected\\('(?<value>[^']*)'\\)"); string[] ticketInfos = ticketStr.Split(new string[] { "#" }, StringSplitOptions.RemoveEmptyEntries); if (ticketInfos.Length > 0) { /// <summary> /// 0-车号T9 /// </summary> ticket.station_train_code = ticketInfos[0]; /// <summary> /// 1-历史 /// </summary> ticket.lishi = ticketInfos[1]; /// <summary> /// 2-发车时间 /// </summary> ticket.train_start_time = ticketInfos[2]; /// <summary> /// 3-车号24000000T90H /// </summary> ticket.trainno4 = ticketInfos[3]; /// <summary> /// 4-发车地编号 /// </summary> ticket.from_station_telecode = ticketInfos[4]; /// <summary> /// 5-到达地编号 /// </summary> ticket.to_station_telecode = ticketInfos[5]; /// <summary> /// 6-到达时间 /// </summary> ticket.arrive_time = ticketInfos[6]; /// <summary> /// 7-出发地名称 /// </summary> ticket.from_station_name = ticketInfos[7]; /// <summary> /// 8-到达地名称 /// </summary> ticket.to_station_name = ticketInfos[8]; /// <summary> /// 9-验证码1 /// </summary> ticket.ypInfoDetail = ticketInfos[9]; /// <summary> /// 10-验证码2 /// </summary> ticket.mmStr = ticketInfos[10]; } tickets.Add(ticket); } return tickets; }
public ConfirmModel Submit2(QueryModel query, TicketModel ticket, string randCode, out string message) { Dictionary<string, string> parameters = new Dictionary<string, string>(); //车号 parameters["station_train_code"] = ticket.station_train_code; parameters["train_date"] = query.orderRequest_train_date; // 查询时填写的出发日期 parameters["seattype_num"] = "";// train.seattype_num; parameters["from_station_telecode"] = ticket.from_station_telecode; // 票上的起始站编号 parameters["to_station_telecode"] = ticket.to_station_telecode; // 票上的到达站编号 parameters["include_student"] = "00"; // train.include_student; parameters["from_station_telecode_name"] = Uri.EscapeUriString(query.from_station_telecode_name); // 查询时输入的起始时间 parameters["to_station_telecode_name"] = Uri.EscapeUriString(query.to_station_telecode_name); // 查询时输入的到达站名称 parameters["round_train_date"] = DateTime.Now.ToString("yyyy-MM-dd"); //查询时返程票的查询时间,默认当前时间加一天 parameters["round_start_time_str"] = Uri.EscapeUriString("00:00-24:00"); // 查询时的返程票查询时间范围 parameters["single_round_type"] = "1"; // 查询时的往返类型1单程,2往返 parameters["train_pass_type"] = query.trainPassType; // 查询时填写的列车经过类型,始发或经过 parameters["train_class_arr"] = query.trainClass; // 查询时填写的列车类型 动车,特快等 parameters["start_time_str"] = Uri.EscapeUriString(query.orderRequest_start_time_str); //查询时填写的时间范围 parameters["lishi"] = Uri.EscapeUriString(ticket.lishi); //票上的历时时间 parameters["train_start_time"] = Uri.EscapeUriString(ticket.train_start_time); // 票上的出发时间 parameters["trainno4"] = ticket.trainno4; // 票上的列车系统编号 parameters["arrive_time"] = Uri.EscapeUriString(ticket.arrive_time); //票上的到达时间 parameters["from_station_name"] = Uri.EscapeUriString(ticket.from_station_name); // 票上的出发站名称 parameters["to_station_name"] = Uri.EscapeUriString(ticket.to_station_name); // 票上的到达站名称 parameters["from_station_no"] = ticket.from_station_no; parameters["to_station_no"] = ticket.to_station_no; parameters["ypInfoDetail"] = ticket.ypInfoDetail; // 票的验证码 parameters["mmStr"] = ticket.mmStr; // 票的验证码2 parameters["localtionCode"] = ticket.locationCode; // 票的验证码2 //parameters["ypInfoDetail"] ="1*****31964*****00001*****02323*****0000"; //parameters["mmStr"] = "4344EE8C1729273E16C2FDAA443EB7A007F7604508B040E8687B0182"; try { string content = _client.Post( "https://dynamic.12306.cn/otsweb/order/querySingleAction.do?method=submutOrderRequest", parameters, "https://dynamic.12306.cn/otsweb/order/querySingleAction.do?method=init"); string token = string.Empty; string ticketStr = string.Empty; Regex tokenReg = new Regex("name=\"org.apache.struts.taglib.html.TOKEN\"[^<>]*value=\"(?<token>[^<>\"]*)"); MatchCollection tokenMatchs = tokenReg.Matches(content); if (tokenMatchs.Count > 0) { token = tokenMatchs[0].Groups[1].Value; } Regex ticketStrReg = new Regex("name=\"leftTicketStr\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)"); MatchCollection ticketStrMatchs = ticketStrReg.Matches(content); if (ticketStrMatchs.Count > 0) { ticketStr = ticketStrMatchs[0].Groups[1].Value; } ConfirmModel model = new ConfirmModel(token, ticketStr, randCode, "A"); MatchCollection messageMatchs = new Regex("var message = \"(?<message>[^<>\"]*)\";").Matches(content); if (messageMatchs.Count > 0) { message = messageMatchs[0].Groups[1].Value; } else { message = string.Empty; } Regex reg = new Regex("name=\"orderRequest.train_date\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)"); MatchCollection matchs = reg.Matches(content); if (matchs.Count > 0) { model.orderRequest_train_date = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.train_no\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_train_no = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.station_train_code\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_station_train_code = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.from_station_telecode\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_from_station_telecode = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.to_station_telecode\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_to_station_telecode = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.seat_type_code\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_seat_type_code = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.seat_detail_type_code\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_seat_detail_type_code = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.ticket_type_order_num\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_ticket_type_order_num = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.bed_level_order_num\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_bed_level_order_num = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.start_time\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_start_time = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.end_time\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_end_time = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.from_station_name\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_from_station_name = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.to_station_name\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_to_station_name = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.cancel_flag\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_cancel_flag = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.id_mode\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_id_mode = matchs[0].Groups[1].Value; } else { return null; } return model; } catch(Exception ex) { message = ex.Message; return null; } }
public ConfirmModel Submit(QueryModel query, TicketModel ticket, string randCode) { //TrainModel train = null; //foreach (TrainModel item in Trains.Data) //{ // if (item.station_train_code == ticket.TrainName) // { // train = item; // break; // } //} //if (train == null) //{ // return null; //} Dictionary<string, string> parameters = new Dictionary<string, string>(); //车号 parameters["station_train_code"] = ticket.station_train_code; parameters["train_date"] = query.orderRequest_train_date; // 查询时填写的出发日期 parameters["seattype_num"] = "";// train.seattype_num; parameters["from_station_telecode"] = ticket.from_station_telecode; // 票上的起始站编号 parameters["to_station_telecode"] = ticket.to_station_telecode; // 票上的到达站编号 parameters["include_student"] = "00"; // train.include_student; parameters["from_station_telecode_name"] = Uri.EscapeUriString(query.from_station_telecode_name); // 查询时输入的起始时间 parameters["to_station_telecode_name"] = Uri.EscapeUriString(query.to_station_telecode_name); // 查询时输入的到达站名称 parameters["round_train_date"] = DateTime.Now.ToString("yyyy-MM-dd"); //查询时返程票的查询时间,默认当前时间加一天 parameters["round_start_time_str"] = Uri.EscapeUriString("00:00-24:00"); // 查询时的返程票查询时间范围 parameters["single_round_type"] = "1"; // 查询时的往返类型1单程,2往返 parameters["train_pass_type"] = query.trainPassType; // 查询时填写的列车经过类型,始发或经过 parameters["train_class_arr"] = query.trainClass; // 查询时填写的列车类型 动车,特快等 parameters["start_time_str"] = Uri.EscapeUriString(query.orderRequest_start_time_str); //查询时填写的时间范围 parameters["lishi"] = Uri.EscapeUriString(ticket.lishi); //票上的历时时间 parameters["train_start_time"] = Uri.EscapeUriString(ticket.train_start_time); // 票上的出发时间 parameters["trainno4"] = ticket.trainno4; // 票上的列车系统编号 parameters["arrive_time"] = Uri.EscapeUriString(ticket.arrive_time); //票上的到达时间 parameters["from_station_name"] = Uri.EscapeUriString(ticket.from_station_name); // 票上的出发站名称 parameters["to_station_name"] = Uri.EscapeUriString(ticket.to_station_name); // 票上的到达站名称 parameters["ypInfoDetail"] = ticket.ypInfoDetail; // 票的验证码 parameters["mmStr"] = ticket.mmStr; // 票的验证码2 //parameters["ypInfoDetail"] ="1*****31964*****00001*****02323*****0000"; //parameters["mmStr"] = "4344EE8C1729273E16C2FDAA443EB7A007F7604508B040E8687B0182"; string content = _client.Post( "https://dynamic.12306.cn/otsweb/order/querySingleAction.do?method=submutOrderRequest", parameters, "https://dynamic.12306.cn/otsweb/order/querySingleAction.do?method=init"); //content = _client.Get( // "https://dynamic.12306.cn/otsweb/order/confirmPassengerAction.do?method=init", // "https://dynamic.12306.cn/otsweb/order/querySingleAction.do?method=init"); string token = string.Empty; string ticketStr = string.Empty; Regex tokenReg = new Regex("name=\"org.apache.struts.taglib.html.TOKEN\"[^<>]*value=\"(?<token>[^<>\"]*)"); MatchCollection tokenMatchs = tokenReg.Matches(content); if (tokenMatchs.Count > 0) { token = tokenMatchs[0].Groups[1].Value; } Regex ticketStrReg = new Regex("name=\"leftTicketStr\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)"); MatchCollection ticketStrMatchs = ticketStrReg.Matches(content); if (ticketStrMatchs.Count > 0) { ticketStr = ticketStrMatchs[0].Groups[1].Value; } ConfirmModel model = new ConfirmModel(token, ticketStr, randCode, "A"); /* <input type="hidden" name="orderRequest.train_date" value="2012-10-24" id="start_date"> <input type="hidden" name="orderRequest.train_no" value="24000000T90H" id="train_no"> <input type="hidden" name="orderRequest.station_train_code" value="T9" id="station_train_code"> <input type="hidden" name="orderRequest.from_station_telecode" value="BXP" id="from_station_telecode"> <input type="hidden" name="orderRequest.to_station_telecode" value="CUW" id="to_station_telecode"> <input type="hidden" name="orderRequest.seat_type_code" value="" id="seat_type_code"> <input type="hidden" name="orderRequest.seat_detail_type_code" value="" id="seat_detail_type_code"> <input type="hidden" name="orderRequest.ticket_type_order_num" value="" id="ticket_type_order_num"> <input type="hidden" name="orderRequest.bed_level_order_num" value="000000000000000000000000000000" id="bed_level_order_num"> <input type="hidden" name="orderRequest.start_time" value="15:20" id="orderRequest_start_time"> <input type="hidden" name="orderRequest.end_time" value="15:45" id="orderRequest_end_time"> <input type="hidden" name="orderRequest.from_station_name" value="北京西" id="orderRequest_from_station_name"> <input type="hidden" name="orderRequest.to_station_name" value="重庆北" id="orderRequest_to_station_name"> <input type="hidden" name="orderRequest.cancel_flag" value="1" id="cancel_flag"> <input type="hidden" name="orderRequest.id_mode" value="Y" id="orderRequest_id_mode"> */ Regex reg = new Regex("name=\"orderRequest.train_date\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)"); MatchCollection matchs = reg.Matches(content); if (matchs.Count > 0) { model.orderRequest_train_date = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.train_no\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_train_no = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.station_train_code\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_station_train_code = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.from_station_telecode\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_from_station_telecode = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.to_station_telecode\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_to_station_telecode = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.seat_type_code\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_seat_type_code = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.seat_detail_type_code\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_seat_detail_type_code = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.ticket_type_order_num\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_ticket_type_order_num = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.bed_level_order_num\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_bed_level_order_num = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.start_time\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_start_time = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.end_time\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_end_time = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.from_station_name\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_from_station_name = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.to_station_name\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_to_station_name = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.cancel_flag\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_cancel_flag = matchs[0].Groups[1].Value; } else { return null; } matchs = new Regex("name=\"orderRequest.id_mode\"[^<>]*value=\"(?<leftTicketStr>[^<>\"]*)").Matches(content); if (matchs.Count > 0) { model.orderRequest_id_mode = matchs[0].Groups[1].Value; } else { return null; } //https://dynamic.12306.cn/otsweb/order/confirmPassengerAction.do?method=getQueueCount&train_date=2012-11-03&station=T9&seat=3&from=BXP&to=CUW&ticket=1023103150406420000010231007083040500093 //https://dynamic.12306.cn/otsweb/order/confirmPassengerAction.do?method=init Dictionary<string, string> parameters2 = new Dictionary<string, string>(); parameters2["method"] = "getQueueCount"; parameters2["train_date"] = ticket.StartDate; parameters2["station"] = ticket.station_train_code; parameters2["seat"] = "3"; parameters2["from"] = ticket.from_station_telecode; parameters2["to"] = ticket.to_station_telecode; parameters2["ticket"] = model.leftTicketStr; content = _client.Get( "https://dynamic.12306.cn/otsweb/order/confirmPassengerAction.do", parameters2, "https://dynamic.12306.cn/otsweb/order/confirmPassengerAction.do?method=init"); return model; }
public List<TicketModel> Query2(QueryModel model, out string message) { message = string.Empty; List<TicketModel> tickets = new List<TicketModel>(); Dictionary<string, string> parameters = new Dictionary<string, string>(); parameters["method"] = model.method; parameters["orderRequest.train_date"] = model.orderRequest_train_date; parameters["orderRequest.from_station_telecode"] = model.orderRequest_from_station_telecode; parameters["orderRequest.to_station_telecode"] = model.orderRequest_to_station_telecode; parameters["orderRequest.train_no"] = model.orderRequest_train_no; parameters["trainPassType"] = model.trainPassType; parameters["trainClass"] = Uri.EscapeDataString(model.trainClass); parameters["includeStudent"] = model.includeStudent; parameters["seatTypeAndNum"] = model.seatTypeAndNum; parameters["orderRequest.start_time_str"] = Uri.EscapeDataString(model.orderRequest_start_time_str); string content = _client.Get2( "https://dynamic.12306.cn/otsweb/order/querySingleAction.do", parameters, "https://dynamic.12306.cn/otsweb/order/querySingleAction.do?method=init"); content = content.Replace(" ", string.Empty); string[] segments = content.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); for (int index = 1; index < segments.Length; index += 16) { TicketModel ticket = new TicketModel(); ticket.StartDate = model.orderRequest_train_date; ticket.TrainCode = ParseValue(segments[index + 0], "id='id_(?<value>[^']*)'"); ticket.TrainName = ParseValue(segments[index + 0], ">(?<value>[^<>]*)<"); ticket.StartCity = ParseValue(segments[index + 1], "(?<value>[^<>]*)<br"); ticket.StartTime = ParseValue(segments[index + 1], "<br/>(?<value>[^<>]*)'"); ticket.ArriveCity = ParseValue(segments[index + 2], "(?<value>[^<>]*)<br"); ticket.ArriveTime = ParseValue(segments[index + 2], "<br/>(?<value>[^<>]*)'"); ticket.TotalTime = segments[index + 3]; ticket.Num_SWZ = ParseNum(segments[index + 4]); ticket.Num_TDZ = ParseNum(segments[index + 5]); ticket.Num_YDZ = ParseNum(segments[index + 6]); ticket.Num_EDZ = ParseNum(segments[index + 7]); ticket.Num_GJRW = ParseNum(segments[index + 8]); ticket.Num_RW = ParseNum(segments[index + 9]); ticket.Num_YW = ParseNum(segments[index + 10]); ticket.Num_RZ = ParseNum(segments[index + 11]); ticket.Num_YZ = ParseNum(segments[index + 12]); ticket.Num_WZ = ParseNum(segments[index + 13]); ticket.Num_QT = ParseNum(segments[index + 14]); string ticketStr = ParseValue(segments[index + 15], "javascript:getSelected\\('(?<value>[^']*)'\\)"); if (!string.IsNullOrEmpty(ticketStr)) { string[] ticketInfos = ticketStr.Split(new string[] { "#" }, StringSplitOptions.RemoveEmptyEntries); if (ticketInfos.Length > 0) { /// <summary> /// 0-车号T9 /// </summary> ticket.station_train_code = ticketInfos[0]; /// <summary> /// 1-历史 /// </summary> ticket.lishi = ticketInfos[1]; /// <summary> /// 2-发车时间 /// </summary> ticket.train_start_time = ticketInfos[2]; /// <summary> /// 3-车号24000000T90H /// </summary> ticket.trainno4 = ticketInfos[3]; /// <summary> /// 4-发车地编号 /// </summary> ticket.from_station_telecode = ticketInfos[4]; /// <summary> /// 5-到达地编号 /// </summary> ticket.to_station_telecode = ticketInfos[5]; /// <summary> /// 6-到达时间 /// </summary> ticket.arrive_time = ticketInfos[6]; /// <summary> /// 7-出发地名称 /// </summary> ticket.from_station_name = ticketInfos[7]; /// <summary> /// 8-到达地名称 /// </summary> ticket.to_station_name = ticketInfos[8]; ticket.from_station_no = ticketInfos[9]; ticket.to_station_no = ticketInfos[10]; /// <summary> /// 9-验证码1 /// </summary> ticket.ypInfoDetail = ticketInfos[11]; /// <summary> /// 10-验证码2 /// </summary> ticket.mmStr = ticketInfos[12]; ticket.locationCode = ticketInfos[13]; } tickets.Add(ticket); } else { message = ParseValue(content, ">(?<value>[^<>]*)</a>"); return null; } } return tickets; }