Ejemplo n.º 1
0
 protected override void OnShown(EventArgs e)
 {
     base.OnShown(e);
     PWLoading.Show(this, "正在获取相关数据,请稍后...", new Action(() =>
     {
         if (RequestSubmitOrder())
         {
             // 获取页面信息
             RequestPackage request = new RequestPackage();
             request.RequestURL     = "/otn/confirmPassenger/initDc";
             request.RefererURL     = "/otn/leftTicket/init";
             request.Params.Add("_json_att=", string.Empty);
             request.Method = "post";
             ArrayList list = HttpContext.GetHtmlData(request);
             if (IsInit = (list.Count == 3))
             {
                 GetValidateCode();
                 string html_text = list[1].ToString();
                 // 获取 Token
                 SubmitToken = StringExt.FindJsValue(html_text, "globalRepeatSubmitToken");
                 // 获取 ticketInfoForPassengerForm
                 string ticketInfoForPassenger = StringExt.FindJsValue(html_text, "ticketInfoForPassengerForm");
                 TicketInfo = JsonConvert.DeserializeObject <TicketInfoForPassengerForm>(ticketInfoForPassenger);
                 if (this.InvokeRequired)
                 {
                     this.Invoke(new Action(() =>
                     {
                         this.LoadData();
                         this.UpdatePassengers();
                     }));
                 }
                 else
                 {
                     this.LoadData();
                     this.UpdatePassengers();
                 }
             }
             else
             {
                 Log.Log.Write(list);
             }
         }
     }));
 }
Ejemplo n.º 2
0
        public Task Execute(IJobExecutionContext context)
        {
            var jobData = context.JobDetail.JobDataMap;//获取Job中的参数

            var taskStr = jobData.GetString("ticketTask");

            var taskRunNum = jobData.GetInt("taskRunNum");

            jobData["taskRunNum"] = ++taskRunNum;

            var input = JsonConvert.DeserializeObject <TicketTaskDto>(taskStr);

            return(Task.Run(() =>
            {
                var currentModel = ticketTaskRepository.Get(input.Id);
                if (currentModel.Status == 3)
                {
                    context.Scheduler.DeleteJob(new JobKey(input.UserName));
                    LogHelper.Info($"任务{input.UserName}手动停止");
                }
                else
                {
                    LogHelper.Info($"任务{input.UserName}的第{taskRunNum}次执行");
                    try
                    {
                        var cookieContainer = CacheHelper.GetCache <IList <RestResponseCookie> >(input.UserName + "_loginStatus");

                        if (cookieContainer == null)
                        {
                            throw new Exception("登录状态失效");
                        }

                        foreach (var trainCode in input.TrainCodes)
                        {
                            TicketDto orderTicket = new TicketDto();

                            #region Query
                            var client = new RestClient($"https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={input.LeftDate}&leftTicketDTO.from_station={input.LeftStation.Code}&leftTicketDTO.to_station={input.ArriveStation.Code}&purpose_codes=ADULT");
                            var request = new RestRequest(Method.GET);
                            request.AddHeader("cache-control", "no-cache");
                            request.AddHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0");

                            IList <RestResponseCookie> cookies = new List <RestResponseCookie>();

                            foreach (var item in cookieContainer)
                            {
                                cookies.Add(new RestResponseCookie()
                                {
                                    Name = item.Name,
                                    Value = item.Value
                                });
                            }

                            cookies.Add(new RestResponseCookie()
                            {
                                Name = "_jc_save_fromDate",
                                Value = input.LeftDate
                            });

                            cookies.Add(new RestResponseCookie()
                            {
                                Name = "_jc_save_fromStation",
                                Value = UnicodeHelper.String2Unicode(input.LeftStation.Name).Replace("\\", "%") + "%2C" + orderTicket.From_station_telecode
                            });

                            cookies.Add(new RestResponseCookie()
                            {
                                Name = "_jc_save_toDate",
                                Value = input.LeftDate
                            });

                            cookies.Add(new RestResponseCookie()
                            {
                                Name = "_jc_save_toStation",
                                Value = UnicodeHelper.String2Unicode(input.ArriveStation.Name).Replace("\\", "%") + "%2C" + input.ArriveStation.Code
                            });

                            cookies.Add(new RestResponseCookie()
                            {
                                Name = "_jc_save_wfdc_flag",
                                Value = "dc"
                            });

                            foreach (var item in cookies)
                            {
                                request.AddParameter(item.Name, item.Value, ParameterType.Cookie);
                            }

                            IRestResponse response = client.Execute(request);

                            TicketsQueryResponse ticketsResponse = null;

                            try
                            {
                                ticketsResponse = JsonConvert.DeserializeObject <TicketsQueryResponse>(response.Content);
                            }
                            catch (Exception)
                            {
                            }


                            if (ticketsResponse == null)
                            {
                                throw new Exception("https://kyfw.12306.cn/otn/leftTicket/query 接口异常" + response.Content);
                            }

                            foreach (var item in ticketsResponse.Data.Result)
                            {
                                var props = item.Split('|');
                                TicketDto ticket = new TicketDto()
                                {
                                    SecretStr = props[0],
                                    ButtonTextInfo = props[1],
                                    Train_no = props[2],
                                    Station_train_code = props[3],
                                    Start_station_telecode = props[4],
                                    End_station_telecode = props[5],
                                    From_station_telecode = props[6],
                                    To_station_telecode = props[7],
                                    Start_time = props[8],
                                    Arrive_time = props[9],
                                    Lishi = props[10],
                                    CanWebBuy = props[11],
                                    Yp_info = props[12],
                                    Start_train_data = props[13],
                                    Train_seat_feature = props[14],
                                    Location_code = props[15],
                                    From_station_no = props[16],
                                    To_station_no = props[17],
                                    Is_support_card = props[18],
                                    Controlled_train_flag = props[19],
                                    Gg_num = !string.IsNullOrEmpty(props[20]) ? props[20] : "--",
                                    Gr_num = !string.IsNullOrEmpty(props[21]) ? props[21] : "--",
                                    Qt_num = !string.IsNullOrEmpty(props[22]) ? props[22] : "--",
                                    Rw_num = !string.IsNullOrEmpty(props[23]) ? props[23] : "--",
                                    Rz_num = !string.IsNullOrEmpty(props[24]) ? props[24] : "--",
                                    Tz_num = !string.IsNullOrEmpty(props[25]) ? props[25] : "--",
                                    Wz_num = !string.IsNullOrEmpty(props[26]) ? props[26] : "--",
                                    Yb_num = !string.IsNullOrEmpty(props[27]) ? props[27] : "--",
                                    Yw_num = !string.IsNullOrEmpty(props[28]) ? props[28] : "--",
                                    Yz_num = !string.IsNullOrEmpty(props[29]) ? props[29] : "--",
                                    Ze_num = !string.IsNullOrEmpty(props[30]) ? props[30] : "--",
                                    Zy_num = !string.IsNullOrEmpty(props[31]) ? props[31] : "--",
                                    Swz_num = !string.IsNullOrEmpty(props[32]) ? props[32] : "--",
                                    Srrb_num = !string.IsNullOrEmpty(props[33]) ? props[33] : "--",
                                    Yp_ex = props[34],
                                    Seat_types = props[35],
                                    Exchange_train_flag = props[36],
                                    Houbu_train_flag = props[37],
                                    From_station_name = ticketsResponse.Data.Map.GetValue(props[6]).ToString(),
                                    To_station_name = ticketsResponse.Data.Map.GetValue(props[7]).ToString()
                                };

                                if (props.Length > 38)
                                {
                                    ticket.Houbu_seat_limit = props[38];
                                }

                                if (ticket.Station_train_code == trainCode)
                                {
                                    orderTicket = ticket;
                                }
                            }
                            #endregion


                            if (orderTicket.CanWebBuy == "Y")
                            {
                                #region submitOrderRequest
                                var client_1 = new RestClient("https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest");
                                var request_1 = new RestRequest(Method.POST);
                                request_1.AddHeader("cache-control", "no-cache");
                                request_1.AddHeader("Content-Type", "application/x-www-form-urlencoded");
                                request_1.AddHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0");



                                foreach (var item in cookies)
                                {
                                    request_1.AddParameter(item.Name, item.Value, ParameterType.Cookie);
                                }

                                request_1.AddParameter("application/x-www-form-urlencoded",
                                                       "secretStr=" +
                                                       orderTicket.SecretStr +
                                                       "&train_date=" + input.LeftDate + "&back_train_date=" + input.LeftDate + "&tour_flag=dc&purpose_codes=ADULT" +
                                                       "&query_from_station_name=" + orderTicket.From_station_name + "&query_to_station_name=" + orderTicket.From_station_name,
                                                       ParameterType.RequestBody);
                                IRestResponse response_1 = client_1.Execute(request_1);

                                CommonResponse <object> submitOrderRequestResponse = null;
                                try
                                {
                                    submitOrderRequestResponse = JsonConvert.DeserializeObject <CommonResponse <object> >(response_1.Content);
                                }
                                catch (Exception)
                                {
                                }

                                if (submitOrderRequestResponse == null)
                                {
                                    throw new Exception("https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest 接口异常" + response_1.Content);
                                }
                                if (!submitOrderRequestResponse.Status)
                                {
                                    if (submitOrderRequestResponse.Messages[0].ToString().IndexOf("您还有未处理的订单") > -1)
                                    {
                                        EmailHelper.Send(currentModel.NoticeEmail, "订票成功", "订票成功,登录你的12306完成支付");
                                        var model = ticketTaskRepository.Get(input.Id);
                                        model.Status = 1;
                                        ticketTaskRepository.Update(model);
                                        context.Scheduler.Shutdown();
                                        LogHelper.Info("任务执行完成");
                                        break;
                                    }
                                    else
                                    {
                                        LogHelper.Info($"任务{input.UserName}submitOrderRequest提交失败" + response_1.Content);
                                        continue;
                                    }
                                }
                                #endregion

                                #region https://kyfw.12306.cn/otn/confirmPassenger/initDc

                                var client_2 = new RestClient("https://kyfw.12306.cn/otn/confirmPassenger/initDc");

                                var request_2 = new RestRequest(Method.POST);
                                request_2.AddHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0");

                                if (cookies != null && cookies.Count > 0)
                                {
                                    foreach (var item in cookies)
                                    {
                                        request_2.AddParameter(item.Name, item.Value, ParameterType.Cookie);
                                    }
                                }

                                IRestResponse response_2 = client_2.Execute(request_2);

                                int init_seatTypes_index = response_2.Content.IndexOf("init_seatTypes");

                                int init_seatTypes_lastIndex = response_2.Content.IndexOf("defaultTicketTypes");

                                int FormIndex = response_2.Content.IndexOf("ticketInfoForPassengerForm");

                                int FormLastIndex = response_2.Content.LastIndexOf("orderRequestDTO");

                                int limit_ticket_num_index = response_2.Content.LastIndexOf("init_limit_ticket_num");

                                int SubmitTokenIndex = response_2.Content.IndexOf("globalRepeatSubmitToken");

                                int global_lang_index = response_2.Content.IndexOf("global_lang");

                                if (init_seatTypes_lastIndex < 0 || init_seatTypes_index < 0 || FormIndex < 0 || FormLastIndex < 0 || limit_ticket_num_index < 0 || SubmitTokenIndex < 0 || global_lang_index < 0)
                                {
                                    throw new Exception("api https://kyfw.12306.cn/otn/confirmPassenger/initDc 接口异常" + response_1.Content + response_2.Content);
                                }

                                string init_seatTypesTemp = response_2.Content.Substring(init_seatTypes_index, init_seatTypes_lastIndex - init_seatTypes_index);

                                string init_seatTypesStr = init_seatTypesTemp.Substring(init_seatTypesTemp.IndexOf("=") + 1,
                                                                                        init_seatTypesTemp.LastIndexOf("]") - init_seatTypesTemp.IndexOf("="));

                                List <Init_seatType> init_SeatTypes = JsonConvert.DeserializeObject <List <Init_seatType> >(init_seatTypesStr);

                                StringBuilder passengerForm = new StringBuilder();

                                passengerForm.Append(response_2.Content.Substring(FormIndex, FormLastIndex - FormIndex));

                                string passengerFormStr = passengerForm.ToString();

                                TicketInfoForPassengerForm ticketInfoForPassengerForm = JsonConvert.DeserializeObject <TicketInfoForPassengerForm>
                                                                                            (passengerFormStr.Substring(passengerFormStr.IndexOf("=") + 1,
                                                                                                                        passengerFormStr.LastIndexOf("}") - passengerFormStr.IndexOf("=")));

                                string OrderRequestDTOStr = response_2.Content.Substring(FormLastIndex, limit_ticket_num_index - FormLastIndex);

                                OrderQuestDto orderQuestDTO = JsonConvert.DeserializeObject <OrderQuestDto>(
                                    OrderRequestDTOStr.Substring(OrderRequestDTOStr.IndexOf("=") + 1,
                                                                 OrderRequestDTOStr.LastIndexOf("}") - OrderRequestDTOStr.IndexOf("=")));

                                #endregion

                                #region GetPassengerDto

                                var client_3 = new RestClient("https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs");
                                var request_3 = new RestRequest(Method.POST);
                                request_3.AddHeader("cache-control", "no-cache");
                                request_3.AddHeader("Host", "kyfw.12306.cn");
                                request_3.AddHeader("Origin", "https://kyfw.12306.cn");
                                request_3.AddHeader("Referer", "https://kyfw.12306.cn/otn/confirmPassenger/initDc");
                                request_3.AddHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0");

                                if (cookies != null && cookies.Count > 0)
                                {
                                    foreach (var item in cookies)
                                    {
                                        request_3.AddParameter(item.Name, item.Value, ParameterType.Cookie);
                                    }
                                }
                                IRestResponse response_3 = client_3.Execute(request_3);

                                CommonResponse <PassengerData> passengerDTOResponse = null;

                                try
                                {
                                    passengerDTOResponse = JsonConvert.DeserializeObject <CommonResponse <PassengerData> >(response_3.Content);
                                }
                                catch (Exception)
                                {
                                }

                                if (passengerDTOResponse == null || !passengerDTOResponse.Data.IsExist)
                                {
                                    throw new Exception("https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs 接口异常" + response_3.Content);
                                }

                                #endregion

                                #region checkOrderInfo
                                var client_4 = new RestClient("https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo");
                                var request_4 = new RestRequest(Method.POST);
                                request_4.AddHeader("Cache-Control", "no-cache");
                                request_4.AddHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
                                request_4.AddHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0");

                                if (cookies != null && cookies.Count > 0)
                                {
                                    foreach (var item in cookies)
                                    {
                                        request_4.AddParameter(item.Name, item.Value, ParameterType.Cookie);
                                    }
                                }

                                request_4.AddParameter("application/x-www-form-urlencoded; charset=UTF-8",
                                                       $"cancel_flag=2&bed_level_order_num=000000000000000000000000000000&passengerTicketStr={input.SeatType},0,1,{passengerDTOResponse.Data.Normal_passengers[0].Passenger_name},1,{passengerDTOResponse.Data.Normal_passengers[0].Passenger_id_no},{passengerDTOResponse.Data.Normal_passengers[0].Mobile_no},N&oldPassengerStr={passengerDTOResponse.Data.Normal_passengers[0].Passenger_name},1,{passengerDTOResponse.Data.Normal_passengers[0].Passenger_id_no},1_&tour_flag=dc&randCode=&whatsSelect=1", ParameterType.RequestBody);

                                IRestResponse response_4 = client_4.Execute(request_4);

                                CommonResponse <CheckOrderResponseData> checkOrderResponse = null;

                                try
                                {
                                    checkOrderResponse = JsonConvert.DeserializeObject <CommonResponse <CheckOrderResponseData> >(response_4.Content);
                                }
                                catch (Exception)
                                {
                                }

                                if (checkOrderResponse == null)
                                {
                                    throw new Exception("https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo 接口异常" + response_4.Content);
                                }
                                #endregion

                                #region getQueueCount
                                var client_5 = new RestClient("https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount");
                                var request_5 = new RestRequest(Method.POST);
                                request_5.AddHeader("Cache-Control", "no-cache");
                                request_5.AddHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
                                request_5.AddHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0");
                                if (cookies != null && cookies.Count > 0)
                                {
                                    foreach (var item in cookies)
                                    {
                                        request_5.AddParameter(item.Name, item.Value, ParameterType.Cookie);
                                    }
                                }

                                string dateStr = input.LeftDateJs.Replace(":", "%3A").Replace("+", "%2B");

                                //  "Tue%20Apr%2030%202019%2000%3A00%3A00%20GMT%2B0800%20(%E4%B8%AD%E5%9B%BD%E6%A0%87%E5%87%86%E6%97%B6%E9%97%B4)"
                                request_5.AddParameter("application/x-www-form-urlencoded; charset=UTF-8 ",
                                                       "train_date=" + dateStr +
                                                       "&train_no=" + orderTicket.Train_no +
                                                       "&stationTrainCode=" + orderTicket.Station_train_code +
                                                       "&seatType=" + input.SeatType +
                                                       "&fromStationTelecode=" + orderTicket.From_station_telecode
                                                       + "&toStationTelecode=" + orderTicket.To_station_telecode +
                                                       "&leftTicket=" + ticketInfoForPassengerForm.QueryLeftTicketRequestDTO.YpInfoDetail +
                                                       "&purpose_codes=00&train_location=" + ticketInfoForPassengerForm.Train_location + "&undefined=", ParameterType.RequestBody);


                                IRestResponse response_5 = client_5.Execute(request_5);


                                CommonResponse <QueueCountResponseData> queueCountResponseData = null;
                                try
                                {
                                    queueCountResponseData = JsonConvert.DeserializeObject <CommonResponse <QueueCountResponseData> >(response_5.Content);
                                }
                                catch (Exception)
                                {
                                }

                                if (queueCountResponseData == null)
                                {
                                    throw new Exception("https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount 接口异常" + response_5.Content);
                                }

                                #endregion

                                #region confirmSingleForQueue
                                var client_6 = new RestClient("https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue");
                                var request_6 = new RestRequest(Method.POST);
                                request_6.AddHeader("Accept", "application/json");
                                request_6.AddHeader("Cache-Control", "no-cache");
                                request_6.AddHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
                                request_6.AddHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0");

                                if (cookies.Count > 0)
                                {
                                    foreach (var item in cookies)
                                    {
                                        request_6.AddParameter(item.Name, item.Value, ParameterType.Cookie);
                                    }
                                }

                                string passengerTicketStrEncode = Uri.EscapeDataString($"{input.SeatType},0,1,{passengerDTOResponse.Data.Normal_passengers[0].Passenger_name},1,{passengerDTOResponse.Data.Normal_passengers[0].Passenger_id_no},{passengerDTOResponse.Data.Normal_passengers[0].Mobile_no},N");
                                string oldPassengerStrEncode = Uri.EscapeDataString($"{passengerDTOResponse.Data.Normal_passengers[0].Passenger_name},1,{passengerDTOResponse.Data.Normal_passengers[0].Passenger_id_no},1_");

                                var submitForm = $"passengerTicketStr={input.SeatType},0,1,{passengerDTOResponse.Data.Normal_passengers[0].Passenger_name},1,{passengerDTOResponse.Data.Normal_passengers[0].Passenger_id_no},{passengerDTOResponse.Data.Normal_passengers[0].Mobile_no},N" +
                                                 $"&oldPassengerStr={passengerDTOResponse.Data.Normal_passengers[0].Passenger_name},1,{passengerDTOResponse.Data.Normal_passengers[0].Passenger_id_no},1_" +
                                                 $"&randCode=&purpose_codes=00&" +
                                                 $"key_check_isChange={ticketInfoForPassengerForm.Key_check_isChange}" +
                                                 $"&leftTicketStr={ticketInfoForPassengerForm.LeftTicketStr}&train_location={ticketInfoForPassengerForm.Train_location}" +
                                                 $"&choose_seats=&seatDetailType=000&whatsSelect=1&roomType=00&dwAll=N";

                                request_6.AddParameter("application/x-www-form-urlencoded; charset=UTF-8 ",
                                                       $"passengerTicketStr={input.SeatType},0,1,{passengerDTOResponse.Data.Normal_passengers[0].Passenger_name},1,{passengerDTOResponse.Data.Normal_passengers[0].Passenger_id_no},{passengerDTOResponse.Data.Normal_passengers[0].Mobile_no},N" +
                                                       $"&oldPassengerStr={passengerDTOResponse.Data.Normal_passengers[0].Passenger_name},1,{passengerDTOResponse.Data.Normal_passengers[0].Passenger_id_no},1_" +
                                                       $"&randCode=&purpose_codes=00&" +
                                                       $"key_check_isChange={ticketInfoForPassengerForm.Key_check_isChange}" +
                                                       $"&leftTicketStr={ticketInfoForPassengerForm.LeftTicketStr}&train_location={ticketInfoForPassengerForm.Train_location}" +
                                                       $"&choose_seats=&seatDetailType=000&whatsSelect=1&roomType=00&dwAll=N", ParameterType.RequestBody);

                                IRestResponse response_6 = client_6.Execute(request_6);
                                try
                                {
                                    CommonResponse <ConfirmSingleResponseData> confirmSingleForQueueResponse = JsonConvert.DeserializeObject <CommonResponse <ConfirmSingleResponseData> >(response_6.Content);

                                    if (confirmSingleForQueueResponse.Data.SubmitStatus)
                                    {
                                        EmailHelper.Send(currentModel.NoticeEmail, "订票成功", "订票成功,登录你的12306完成支付");
                                        var model = ticketTaskRepository.Get(input.Id);
                                        model.Status = 1;
                                        ticketTaskRepository.Update(model);
                                        context.Scheduler.DeleteJob(new JobKey(input.UserName));
                                        LogHelper.Info("任务执行完成");
                                        break;
                                    }
                                }
                                catch (Exception)
                                {
                                    try
                                    {
                                        CommonResponse <string> submitStatus = JsonConvert.DeserializeObject <CommonResponse <string> >(response_6.Content);
                                    }
                                    catch (Exception)
                                    {
                                        throw new Exception("https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue 接口异常" + response_6.Content + submitForm);
                                    }
                                }

                                #endregion
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        //var model = ticketTaskRepository.Get(input.Id);
                        //model.Status = 2;
                        //ticketTaskRepository.Update(model);
                        //context.Scheduler.Shutdown();
                        LogHelper.Error($"任务{input.UserName}执行异常 异常信息: " + ex.Message);
                    }
                }
            }));
        }