예제 #1
0
        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;
            
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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("&nbsp;", 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;
        }
예제 #4
0
        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;
            }
        }
예제 #5
0
        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;
        }
예제 #6
0
        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("&nbsp;", 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;
        }