/// <summary> /// 是否有票 /// </summary> /// <param name="ticket"></param> /// <returns></returns> private bool CheckTicket(QueryTicket ticket) { return(true); //var dic = PramHelper.GetProperties(ticket); //var parmStr = PramHelper.GetParamSrc(dic); //return parmStr.Contains("有"); }
/// <summary> /// 获取排队数 /// </summary> /// <param name="selectedTrain"></param> /// <param name="buySeat"></param> /// <param name="info"></param> /// <returns></returns> private bool GetQueueCount(QueryTicket selectedTrain, string buySeat, InitInfo info) { try { string url = "https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount"; DateTime dt; DateTime.TryParse(_date, out dt); string trainDate = UrlEncode(dt.ToString("ddd MMM dd yyyy ", CultureInfo.CreateSpecificCulture("en-GB")) + "00:00:00 GMT+0800 (CST)"); string fromStationTelecode = _fromStation.Code; string toStationTelecode = _toStation.Code; string stationTrainCode = selectedTrain.Station_Train_Code; string trainNo = selectedTrain.Train_No; string data = string.Format( "train_date={0}&train_no={1}&stationTrainCode={2}&seatType={3}&fromStationTelecode={4}&toStationTelecode={5}&leftTicket={6}&purpose_codes={7}&train_location={8}&_json_att=&REPEAT_SUBMIT_TOKEN={9}", trainDate, trainNo, stationTrainCode, buySeat, fromStationTelecode, toStationTelecode, info.LeftTicketInfo, info.PurposeCodes, info.Location, info.SubmitToken); HttpJsonEntity <Dictionary <string, string> > contentEntity = HttpHelper.Post(_agent, url, data, _cookie); LogHelper.Info(selectedTrain.Station_Train_Code + " GetQueueCount成功"); return(contentEntity.status.ToUpper().Equals("TRUE") && contentEntity.httpstatus.Equals(200)); } catch (Exception ex) { LogHelper.Error("GetQueueCount", ex); return(false); } }
private bool BuyTicket(string secretStr, List <Passenger> selectedPassengers, string buySeat, QueryTicket selectedTrain, out string msg) { string url = " https://kyfw.12306.cn/otn/login/checkUser"; string data = "_json_att="; msg = "购票失败!"; HttpJsonEntity <Dictionary <string, string> > contentEntity = HttpHelper.Post(_agent, url, data, _cookie); if (contentEntity.status.ToUpper().Equals("TRUE") && contentEntity.httpstatus.Equals(200)) { if (SubmitOrderRequest(secretStr, out msg)) { FormatLogInfo("预提交订单成功!"); InitInfo info = GetInitInfo(); FormatLogInfo("获取页面信息成功!"); if (info != null) { Thread.Sleep(1000); string randCode, passengerTicketStr, oldPassengerStr; if (CheckOrderInfo(selectedPassengers, buySeat, info, out randCode, out passengerTicketStr, out oldPassengerStr)) { FormatLogInfo("核查订单成功!"); Thread.Sleep(1000); if (GetQueueCount(selectedTrain, buySeat, info)) { FormatLogInfo("获取排队人数成功!"); Thread.Sleep(1000); if (ConfirmSingleForQueue(passengerTicketStr, oldPassengerStr, randCode, info, out msg)) { Thread.Sleep(1000); FormatLogInfo("开始排队!"); if (QueryOrderWaitTime(info, out msg)) { EmailHelper.Send("*****@*****.**", "", selectedTrain.Station_Train_Code); MessageBox.Show("订票成功,请及时查询及支付订单!"); return(true); } FormatLogInfo(msg); } } } } } } else { MessageBox.Show("状态异常,需重新登录"); } return(false); }
private void buyTimer_Tick(object sender, EventArgs e) { //第一次执行后修改为8秒 if (buyTimer.Interval == 1000) { buyTimer.Interval = 8000; } foreach (string trian in select_train_lb.Items) { j++; QueryTicket selectedTrain = tickets.FirstOrDefault(x => x.Station_Train_Code.Equals(trian)); if (selectedTrain == null || string.IsNullOrEmpty(selectedTrain.SecretStr)) { QueryTickets(); Thread.Sleep(1000); continue; } string secretStr = selectedTrain.SecretStr; string logMsg = "第" + j + "次购票:" + selectedTrain.Station_Train_Code; FormatLogInfo(logMsg); bool ticket = CheckTicket(selectedTrain); var buySeat = string.Empty;//座位号 var seats = GetCheckSeatTypes(); buySeat = seats.FirstOrDefault()?.SeatCode; if (!ticket || string.IsNullOrEmpty(buySeat)) { logMsg = selectedTrain.Station_Train_Code + "无票"; FormatLogInfo(logMsg); QueryTickets(); Thread.Sleep(1000); continue; } var selectedPassengers = GetPassaPassengers(); //出发地 var stationFrom = tb_stationFrom.Text; //结束地 var stationTo = tb_stationTo.Text; //行程日期 string msg = string.Empty; var train_date = dtpicker.Text; if (BuyTicket(secretStr, selectedPassengers, stationFrom, stationTo, train_date, buySeat, out msg, selectedTrain.IsWait)) { if (buyTimer != null) { buyTimer.Stop(); } } FormatLogInfo(msg); //Task task = new Task(StratRunButTicket); //task.Start(); } }
private void dgv_tickets_CellDoubleClick(object sender, DataGridViewCellEventArgs e) { try { if (dgv_tickets.CurrentRow == null) { return; } if (dgv_tickets.SelectedRows.Count > 1 || isAutoBuy) { return; } string secretStr = dgv_tickets.CurrentRow.Cells["SecretStr"].Value.ToString(); LogHelper.Info("车次secretStr:" + secretStr); QueryTicket selectedTrain = tickets.FirstOrDefault(x => x.SecretStr.Equals(secretStr)); if (CheckIsNoTicket(selectedTrain)) { MessageBox.Show("此车次无票!"); return; } IEnumerable <string> arrySeats = leftSeat.Keys.ToList().Intersect(GetSeatType()); if (!arrySeats.Any()) { MessageBox.Show("无此座位,请重新选择"); return; } string buySeat = arrySeats.FirstOrDefault(); List <Passenger> selectedPassengers = GetPassaPassengers(); if (selectedPassengers.Count == 0) { MessageBox.Show("未选择乘客!"); return; } string msg; if (BuyTicket(secretStr, selectedPassengers, buySeat, selectedTrain, out msg)) { LogHelper.Info("订票成功!"); } else { MessageBox.Show(msg); } } catch (Exception exception) { MessageBox.Show("系统异常,请重试!"); LogHelper.Error("error:", exception); } }
private void buyTimer_Tick(object sender, EventArgs e) { foreach (string trian in _lsTrainCode) { j++; QueryTicket selectedTrain = tickets.FirstOrDefault(x => x.Station_Train_Code.Equals(trian)); if (selectedTrain == null || string.IsNullOrEmpty(selectedTrain.SecretStr)) { QueryTickets(queryUrl); Thread.Sleep(1000); continue; } string secretStr = selectedTrain.SecretStr; string logMsg = "第" + j + "次购票:" + selectedTrain.Station_Train_Code; LogHelper.Info(logMsg); FormatLogInfo(logMsg); bool noTicket = CheckIsNoTicket(selectedTrain); bool noSeat = false; IEnumerable <string> arrySeats = leftSeat.Keys.ToList().Intersect(GetSeatType()); string buySeat = arrySeats.FirstOrDefault(); if (!arrySeats.Any()) { noSeat = true; } if (noTicket || noSeat) { logMsg = selectedTrain.Station_Train_Code + "无票"; LogHelper.Info(logMsg); FormatLogInfo(logMsg); QueryTickets(queryUrl); Thread.Sleep(1000); continue; } List <Passenger> selectedPassengers = GetPassaPassengers(); string msg = ""; if (BuyTicket(secretStr, selectedPassengers, buySeat, selectedTrain, out msg)) { buyTimer.Stop(); } } }
/// <summary> /// 是否有票 /// </summary> /// <param name="ticket"></param> /// <returns></returns> private bool CheckIsNoTicket(QueryTicket ticket) { leftSeat = new Dictionary <string, string>(); bool result = true; var t = ticket.GetType(); //由于我们只在Property设置了Attibute,所以先获取Property var properties = t.GetProperties(); foreach (var property in properties) { if (!property.IsDefined(typeof(SeatAttribute), false)) { continue; } var propertyValue = property.GetValue(ticket) as string; if (propertyValue != null && (!propertyValue.Equals(defaultTicket) && !propertyValue.Equals("无"))) { result = false; SeatAttribute attribute = (SeatAttribute)property.GetCustomAttributes(typeof(SeatAttribute), true).FirstOrDefault(); leftSeat.Add(attribute.Code, attribute.Name); } } return(result); }
private bool BuyTicket(string secretStr, List <Passenger> selectedPassengers, string buySeat, QueryTicket selectedTrain, out string msg) { if (SubmitOrderRequest(secretStr, out msg)) { FormatLogInfo("预提交订单成功!"); InitInfo info = GetInitInfo(); FormatLogInfo("获取页面信息成功!"); if (info != null) { Thread.Sleep(500); string randCode, passengerTicketStr, oldPassengerStr; if (CheckOrderInfo(selectedPassengers, buySeat, info, out randCode, out passengerTicketStr, out oldPassengerStr)) { FormatLogInfo("核查订单成功!"); Thread.Sleep(500); if (GetQueueCount(selectedTrain, buySeat, info)) { FormatLogInfo("获取排队人数成功!"); Thread.Sleep(500); if (ConfirmSingleForQueue(passengerTicketStr, oldPassengerStr, randCode, info, out msg)) { Thread.Sleep(500); FormatLogInfo("开始排队!"); if (QueryOrderWaitTime(info, out msg)) { EmailHelper.Send("*****@*****.**", "", selectedTrain.Station_Train_Code); MessageBox.Show("订票成功,请及时查询及支付订单!"); return(true); } FormatLogInfo(msg); } } } } } return(false); }
private bool QueryTickets(string queryUrl) { string content = HttpHelper.StringGet(_agent, queryUrl, _cookie); try { //转json QueryJsonEntity contentEntity = JsonConvert.DeserializeObject <QueryJsonEntity>(content); Dictionary <string, string> trainDictionary = JsonConvert.DeserializeObject <Dictionary <string, string> >(contentEntity.data.map.ToString()); tickets = new List <QueryTicket>(); if (contentEntity.data.result.Count > 0) { List <string> ticketsContent = contentEntity.data.result; foreach (var s in ticketsContent) { QueryTicket ticket = new QueryTicket(); string[] item = s.Split('|'); ticket.SecretStr = item[0]; ticket.Remark = item[1]; ticket.Train_No = item[2]; ticket.Station_Train_Code = item[3]; ticket.From_Station_Name = trainDictionary[item[6]]; ticket.To_Station_Name = trainDictionary[item[7]]; ticket.Start_Time = item[8]; ticket.Arrive_Time = item[9]; ticket.LastedTime = item[10]; ticket.Gr_Num = ScreenInfo(item[21]); ticket.Qt_Num = ScreenInfo(item[22]); ticket.Rw_Num = ScreenInfo(item[23]); ticket.Rz_Num = ScreenInfo(item[25]); ticket.Wz_Num = ScreenInfo(item[26]); ticket.Yw_Num = ScreenInfo(item[28]); ticket.Yz_Num = ScreenInfo(item[29]); ticket.Ze_Num = ScreenInfo(item[30]); ticket.Zy_Num = ScreenInfo(item[31]); ticket.Swz_Num = ScreenInfo(item[32]); ticket.Dw_Num = ScreenInfo(item[33]); tickets.Add(ticket); } dgv_tickets.AutoGenerateColumns = false; dgv_tickets.DataSource = tickets; dgv_tickets.DoubleBuffered(true); dgv_tickets.Rows[0].Selected = false; FormatLogInfo("余票查询成功!"); } else { LogHelper.Info("查询结果为空"); return(true); } } catch (Exception ex) { LogHelper.Error(content, ex); return(false); } return(true); }