在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → c# 12306订票软件实例源码下载 (模拟登录网站)

c# 12306订票软件实例源码下载 (模拟登录网站)

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:2.03M
  • 下载次数:106
  • 浏览次数:2802
  • 发布时间:2014-12-21
  • 实例类别:C#语言基础
  • 发 布 人:junerain
  • 文件格式:.zip
  • 所需积分:3
 相关标签: 模拟 网站 登录

实例介绍

模拟登录网站,12306为例,网络下载的,借来参考一下。



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections.Specialized;
using System.Text.RegularExpressions;
using System.IO;
using com.adobe.serialization.json;
using System.Threading;
using TicketHelper.Core;
using System.Media;

namespace TicketHelper
{
    public partial class SubmitOrderRequestForm : Form
    {
        private TrainLeftTicketStatus _ItemData = null;
        private BindingList<Passenger> _BindingPassengers;
        private BindingList<SeatTypeItem> _BindingSeatTypes;
        private NameValueCollection _PostValues;
        private List<SeatTypeItem> _SeatTypes;
        private string _InitOperationName;
        private string _SubmitOperationName;
        private Func<string> _QuickGrab = null;
        private Func<string> _quickTicketSuccessFunc = null;

        private List<string> _Passengers = null;
        private List<string> _SeatTypeItems = null;
        public SubmitOrderRequestForm(
            TrainLeftTicketStatus itemData,
            List<string> passengers = null,
            List<string> seatTypeItems = null,
            Func<string> quickTicketSuccessFunc = null)
        {
            this._ItemData = itemData;
            this.InitializeComponent();
            this._Passengers = passengers;
            this._SeatTypeItems = seatTypeItems;
            this._quickTicketSuccessFunc = quickTicketSuccessFunc;
            if (_Passengers != null && _SeatTypeItems != null)
            {
                _QuickGrab = (rand) =>
                {
                    this.CheckOrder(rand);
                };
            }
        }

        private void SubmitOrderRequestForm_Load(object sender, EventArgs e)
        {
            this.Icon = Properties.Resources.App;
            lblStatus.Text = "正在初始化数据……";
            _PostValues = new NameValueCollection();

            _BindingPassengers = new BindingList<Passenger>();
            _PostValues = new NameValueCollection();
            _SeatTypes = new List<SeatTypeItem>();
            _BindingSeatTypes = new BindingList<SeatTypeItem>(_SeatTypes);

            ticketType.DisplayMember = "Key";
            ticketType.ValueMember = "Value";
            ticketType.DataSource = RunTimeData.TicketTypes;

            cardType.DisplayMember = "Key";
            cardType.ValueMember = "Value";
            cardType.DataSource = RunTimeData.IDCardTypes;

            dgColSeatType.ValueMember = "id";
            dgColSeatType.DisplayMember = "value";
            dgColSeatType.DataSource = _BindingSeatTypes;

            PrepareQuikPassgers();

            dgvPassengers.AutoGenerateColumns = false;
            dgvPassengers.DataSource = _BindingPassengers;
            byte[] buffer = TicketHelper.Properties.Resources.data;
            if (!SundayAPI.LoadLibFromBuffer(buffer, buffer.Length, "123"))
            {
                MessageBox.Show("初始化API失败!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            else
            {
                SubmitOrderRequest();
            }
            lblStatus.Text = "正在确认订票信息……";
        }
        private void SubmitOrderRequestForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (_InitOperationName != null)
            {
                HTTP.Cancel(_InitOperationName);
                _InitOperationName = null;
            }
            if (_SubmitOperationName != null)
            {
                HTTP.Cancel(_SubmitOperationName);
                _SubmitOperationName = null;
            }
        }

        private void btnSubmit_Click(object sender, EventArgs e)
        {
            if (btnSubmit.Text == "提交订单")
            {
                if (string.IsNullOrEmpty(txtValidateCode.Text))
                {
                    MessageBox.Show(this, "请输入验证码", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                if (_BindingPassengers.Count == 0)
                {
                    MessageBox.Show(this, "请设置乘客信息", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                if (dgvPassengers.RowCount > 5)
                {
                    MessageBox.Show(this, "对不起系统规定,一次订单人数不能超过5人", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                foreach (var item in _BindingPassengers)
                {
                    if (string.IsNullOrEmpty(item.SeatType) || string.IsNullOrEmpty(item.Name) || string.IsNullOrEmpty(item.IDCard))
                    {
                        MessageBox.Show(this, "乘客信息的“席别”、“姓名”和“身份证号码”必须填写", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        return;
                    }
                }
                this.btnSubmit.Text = "取消提交";
                this.CheckOrder(txtValidateCode.Text);
            }
            else
            {
                HTTP.Cancel(_SubmitOperationName);
                btnSubmit.Text = "提交订单";
            }
        }

        #region ------测试-----
        //org.apache.struts.taglib.html.TOKEN:c1153fe0d821b7c858535506b18b0684
        //leftTicketStr:10163531524045650051608405000910163500003028950050
        //textfield:中文或拼音首字母
        //checkbox0:0

        //orderRequest.train_date:2013-02-09
        //orderRequest.train_no:2400000Z6707
        //orderRequest.station_train_code:Z67
        //orderRequest.from_station_telecode:BXP
        //orderRequest.to_station_telecode:JJG
        //orderRequest.seat_type_code:
        //orderRequest.ticket_type_order_num:
        //orderRequest.bed_level_order_num:000000000000000000000000000000
        //orderRequest.start_time:20:06
        //orderRequest.end_time:06:25
        //orderRequest.from_station_name:北京西
        //orderRequest.to_station_name:九江
        //orderRequest.cancel_flag:1
        //orderRequest.id_mode:Y


        //passengerTickets:3,0,1,陈宝龙,1,423222199006296131,18801481223,Y
        //oldPassengers:陈宝龙,1,423222199006296131
        //passenger_1_seat:3
        //passenger_1_ticket:1
        //passenger_1_name:陈宝龙
        //passenger_1_cardtype:1
        //passenger_1_cardno:423222199006296131
        //passenger_1_mobileno:18801481223

        //checkbox9:Y
        //oldPassengers:
        //checkbox9:Y
        //oldPassengers:
        //checkbox9:Y
        //oldPassengers:
        //checkbox9:Y
        //oldPassengers:
        //checkbox9:Y
        //randCode:9FK4
        //orderRequest.reserve_flag:A

        #endregion

        /// <summary>
        /// 快速初始化相关信息
        /// </summary>
        private void PrepareQuikPassgers()
        {
            if (File.Exists(RunTimeData.SavedPassengersPath))
            {
                Passenger[] passengers = null;
                try
                {
                    passengers = JSON.decode<Passenger[]>(File.ReadAllText(RunTimeData.SavedPassengersPath, Encoding.Default));
                }
                catch
                {

                }
                if (passengers != null && passengers.Length > 0)
                {
                    EventHandler cbx_CheckedChanged = (_sender, _e) =>
                    {
                        var cbx = _sender as CheckBox;
                        if (cbx.Checked)
                        {
                            if (_BindingPassengers.Count >= 4)
                            {
                                MessageBox.Show(this, "对不起系统规定,一次订单人数不能超过5人", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                cbx.Checked = !cbx.Checked;
                                return;
                            }
                            if (_BindingPassengers.IndexOf(cbx.Tag as Passenger) == -1)
                            {
                                _BindingPassengers.Add(cbx.Tag as Passenger);
                                _BindingPassengers.ResetBindings();
                            }
                        }
                        else
                        {
                            if (_BindingPassengers.Remove(cbx.Tag as Passenger))
                            {
                                _BindingPassengers.ResetBindings();
                            }
                        }
                    };
                    Array.ForEach(passengers, (item) =>
                    {
                        if (item != null)
                        {
                            var cbx = new CheckBox()
                            {
                                Tag = item,
                                Text = item.Name,
                                Checked = false,
                                AutoSize = true
                            };
                            cbx.CheckedChanged  = new EventHandler(cbx_CheckedChanged);
                            flpSavedPassengers.Controls.Add(cbx);
                            if (_Passengers != null && _Passengers.Exists(pitem => pitem == item.Name))
                            {
                                cbx.Checked = true;
                            }
                        }
                    });
                }
            }
        }

        /// <summary>
        /// 正在确认订票信息
        /// </summary>
        private void SubmitOrderRequest()
        {
            btnSubmit.Enabled = false;
            flpSavedPassengers.Enabled = false;
            dgvPassengers.Enabled = false;

            listBox1.Items.Clear();
            listBox1.Items.Add("正在确认订票信息……");

            var paramStr = _ItemData.Status[15];
            paramStr = paramStr.Substring(paramStr.IndexOf("('")   2);
            paramStr = paramStr.Substring(0, paramStr.IndexOf("')"));
            var parameters = paramStr.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries);

            var query = new NameValueCollection();
            query["station_train_code"] = parameters[0];
            query["train_date"] = _ItemData.Date.ToString("yyyy-MM-dd");
            query["seattype_num"] = "";
            query["from_station_telecode"] = parameters[4];
            query["to_station_telecode"] = parameters[5];
            query["include_student"] = "00";
            query["from_station_telecode_name"] = parameters[7];
            query["to_station_telecode_name"] = parameters[8];
            query["round_train_date"] = DateTime.Today.ToString("yyyy-MM-dd");
            query["round_start_time_str"] = "00:00--24:00";
            query["single_round_type"] = "1";
            query["train_pass_type"] = "QB";
            query["train_class_arr"] = "QB#D#Z#T#K#QT#";
            query["start_time_str"] = "00:00--24:00";

            //- 具体车次的值 -->
            query["lishi"] = parameters[1];
            query["train_start_time"] = parameters[2];
            //query["trainno"] = parameters[3];
            query["trainno4"] = parameters[3];
            query["arrive_time"] = parameters[6];
            query["from_station_name"] = parameters[7];
            query["to_station_name"] = parameters[8];

            query["from_station_no"] = parameters[9];
            query["to_station_no"] = parameters[10];
            query["ypInfoDetail"] = parameters[11];
            query["mmStr"] = parameters[12];
            query["locationCode"] = parameters[13];


            _InitOperationName = string.Format("确认定票信息--{0}({1}->{2})({3})", query["station_train_code"], query["from_station_telecode"], query["to_station_telecode"], query["train_date"]);
            _SubmitOperationName = string.Format("提交订单--{0}({1}->{2})({3})", query["station_train_code"], query["from_station_telecode"], query["to_station_telecode"], query["train_date"]);

            HTTP.Request(new HttpRequest()
            {
                OperationName = _InitOperationName,
                Method = "POST",
                Url = Properties.Settings.Default.QuerySingleActionUrl   "?method=submutOrderRequest",
                Referer = Properties.Settings.Default.QuerySingleActionUrl   "?method=init",
                Body = HTTP.ToString(query),
                MaxRetryCount = -1,
                OnCancel = (req, reasion) =>
                {
                    _InitOperationName = null;
                    DetermineCall(() =>
                    {
                        //操作已取消..
                    });
                },
                OnHtml = (req, uri, html) =>
                {
                    var formBody = StringHelper.FindString(ref html, "<form name=\"save_passenger_single\"", "</form>");
                    if (formBody != null)
                    {
                        PrepareRequestData(ref formBody);
                        DetermineCall(() =>
                        {
                            lblStatus.Text = "";
                            flpSavedPassengers.Enabled = true;
                            dgvPassengers.Enabled = true;
                            LoadValidateCodePic(_QuickGrab);
                        });

                        #region---------------------查询到车次信息后-需休眠6秒 才允许提交------安全期--啊,--坑爹的铁道部---------------
                        int i = 7;
                        while (i-- > 0)
                        {
                            DetermineCall(() =>
                            {
                                lblStatus.Text = string.Format("现处于危险期,{0}秒允许提交,请稍候.........", i);
                                if (i == 0)
                                {
                                    lblStatus.Text = string.Format("现在已是安全期,赶紧提交吧,晚了就木有机会了........", i);
                                    btnSubmit.Enabled = true;
                                    if (this.txtValidateCode.Text.Trim().Length == 4)
                                    {
                                        btnSubmit_Click(null, null);
                                    }
                                }
                            });
                            Thread.Sleep(1000);
                        }
                        #endregion
                    }
                    else
                    {
                        var msg = req.GetErrorMessage(ref html);
                        DetermineCall(() =>
                        {
                            if (MessageBox.Show(this, "确认定票信息失败:\r\n"   msg   "\r\n是否重试?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                            {
                                throw new Exception("用户选择重试");
                            }
                            else
                            {
                                this.Close();
                            }
                        });
                    }
                }
            });

        }

        /// <summary>
        /// 准备请求订票数据信息
        /// </summary>
        /// <param name="formBody"></param>
        private void PrepareRequestData(ref string formBody)
        {
            _PostValues.Clear();
            _PostValues["org.apache.struts.taglib.html.TOKEN"] = Regex.Match(formBody, @"name=""org.apache.struts.taglib.html.TOKEN"" value=""(?<val>[^""] )""").Groups["val"].Value;
            _PostValues["leftTicketStr"] = Regex.Match(formBody, @"id=""left_ticket""\s value=""(?<val>[^""] )""").Groups["val"].Value;
            _PostValues["textfield"] = "中文或拼音首字母";

            ///订购车次信息
            foreach (Match m in Regex.Matches(formBody, @"<input type=""hidden"" name=""(?<key>orderRequest\.[^""] )"" value=""(?<val>[^""]*)"""))
            {
                _PostValues[m.Groups["key"].Value] = m.Groups["val"].Value;
            }

            _SeatTypes.Clear();
            var seatTypes = StringHelper.FindString(ref formBody, "<select name=\"passenger_1_seat\"", "</select>");
            if (seatTypes != null)
            {
                foreach (Match m in Regex.Matches(seatTypes, @"<option\s value=""(?<id>[^""]*)""[^>]*>(?<name>[^<] )</option>"))
                {
                    _SeatTypes.Add(new SeatTypeItem()
                    {
                        id = m.Groups["id"].Value,
                        value = m.Groups["name"].Value
                    });
                }
            }
            DetermineCall(() =>
            {
                if (_SeatTypeItems != null)
                    foreach (string _seat in _SeatTypeItems)
                    {
                        SeatTypeItem s_item = _SeatTypes.Find(item => item.value == _seat);
                        if (s_item != null)
                        {
                            for (int i = 0; i < _BindingPassengers.Count; i  )
                            {
                                _BindingPassengers[i].SeatType = s_item.id;
                            }
                            break;
                        }
                    }
                _BindingSeatTypes.ResetBindings();
            });
            DisplayConfirmMessages(ref formBody);
        }

        /// <summary>
        /// 组织Post权票数据
        /// </summary>
        /// <returns></returns>
        private StringBuilder PreparePostBody()
        {
            var postBody = new StringBuilder(1024);
            foreach (string key in _PostValues)
            {
                if (postBody.Length > 0)
                {
                    postBody.Append('&');
                }
                postBody.AppendFormat("{0}={1}", key, _PostValues[key]);
            }

            int passengerIndex = 1;

            foreach (var item in _BindingPassengers)
            {

                postBody.AppendFormat("&checkbox{0}={0}", passengerIndex - 1);
                postBody.AppendFormat("&passengerTickets={0},0,{1},{2},{3},{4},{5},N",
                   item.SeatType,
                    item.TicketType,
                    item.Name,
                    item.CardType,
                    item.IDCard,
                    item.Mobile);
                postBody.AppendFormat("&oldPassengers={0},{1},{2}",
                    item.Name,
                    item.CardType,
                    item.IDCard);

                postBody.AppendFormat("&passenger_{0}_seat={1}", passengerIndex, item.SeatType);
                postBody.AppendFormat("&passenger_{0}_ticket={1}", passengerIndex, item.TicketType);
                postBody.AppendFormat("&passenger_{0}_name={1}", passengerIndex, item.Name);
                postBody.AppendFormat("&passenger_{0}_cardtype={1}", passengerIndex, item.CardType);
                postBody.AppendFormat("&passenger_{0}_cardno={1}", passengerIndex, item.IDCard);
                postBody.AppendFormat("&passenger_{0}_mobileno={1}", passengerIndex, item.Mobile);
                postBody.Append("&checkbox9=Y");
                passengerIndex  ;
            }

            for (int i = passengerIndex; i <= 5; i  )
            {
                postBody.Append("&oldPassengers=");
                postBody.Append("&checkbox9=Y");
            }

            DetermineCall(() =>
            {
                postBody.AppendFormat("&randCode={0}", txtValidateCode.Text);
            });
            postBody.AppendFormat("&orderRequest.reserve_flag={0}", 'A');

            return postBody;
        }

        /// <summary>
        /// 显示当前订购余票信息
        /// </summary>
        /// <param name="formBody"></param>
        private void DisplayConfirmMessages(ref string formBody)
        {
            var confirmMsgBody = StringHelper.FindString(ref formBody, "<tr style=\"background-color: #F3F8FC\">", "</table>");
            if (confirmMsgBody != null)
            {
                var confirmItemList = new List<string>();
                foreach (Match m in Regex.Matches(confirmMsgBody, "<td[^>]*>(?<val>[^<] )</td>"))
                {
                    confirmItemList.Add(m.Groups["val"].Value);
                }
                DetermineCall(() =>
                {
                    listBox1.Items.Clear();
                    listBox1.Items.AddRange(confirmItemList.ToArray());
                });
            }
        }

        /// <summary>
        /// 检测订单
        /// </summary>
        private void CheckOrder(string rand)
        {
            lblStatus.Text = "正在检测订单……";
            HTTP.Request(new HttpRequest()
            {
                OperationName = _SubmitOperationName,
                Method = "POST",
                Url = Properties.Settings.Default.ConfirmPassengerActionUrl   "?method=checkOrderInfo&rand="   rand,
                Referer = Properties.Settings.Default.ConfirmPassengerActionUrl   "?method=init",
                Body = PreparePostBody().ToString(),
                MaxRetryCount = -1,
                OnRetry = (req, count) =>
                {
                    req.Body = PreparePostBody().ToString();
                    DetermineCall(() =>
                    {
                        lblStatus.Text = req.OperationName   string.Format(" 重试第 {0} 次", count);
                    });
                    Thread.Sleep(5000);
                    return true;
                },
                OnReset = (req) =>
                {
                    DetermineCall(() =>
                    {
                        btnSubmit.Text = "提交订单";
                    });
                },
                OnError = (req, error) =>
                {
                    //if(errorThrown.concat('登陆')){
                    //     alert("您离开页面的时间过长,请重新登录系统。");

                    //}else{
                    //    alert("服务器繁忙,请稍候再试!");	
                    //}
                    return true;
                },
                OnHtml = (req, uri, html) =>
                {
                    //{\"checkHuimd\":\"Y\",\"check608\":\"Y\",\"msg\":\"\",\"errMsg\":\"Y\"}
                    //checkHuimd :  为N时 -------- 由于您取消次数过多,今日将不能继续受理您的订票请求!
                    //check608 : 为N时 ---------- 本车为实名制列车,实行一日一车一证一票制!
                    //data.errMsg:为N时,表示发生错误 
                    var passengers = JSON.decode(html) as JavaScriptObject;
                    if (passengers["checkHuimd"] as string == "N")
                    {
                        DetermineCall(() =>
                        {
                            MessageBox.Show(this, passengers["msg"] as string, "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        });
                    }
                    else if (passengers["check608"] as string == "N")
                    {
                        DetermineCall(() =>
                        {
                            MessageBox.Show(this, "本车为实名制列车,实行一日一车一证一票制!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        });
                    }
                    else if (passengers["errMsg"] as string != "Y")
                    {
                        if ((passengers["errMsg"] as string).Contains("验证码输入错误"))
                        {
                            int i = 4;
                            while (i-- > 0)
                            {
                                DetermineCall(() =>
                                {
                                    lblStatus.Text = string.Format("检测订单失败,请勿关闭窗口,{0}秒后将重新提交,请稍候.........", i);
                                });
                                Thread.Sleep(1000);
                            }
                            CheckOrder(rand);
                        }
                        else if ((passengers["errMsg"] as string).Contains("输入的验证码不正确"))
                        {
                            DetermineCall(() =>
                            {
                                new SoundPlayer(Properties.Resources.chord).Play();
                                lblStatus.Text = "输入的验证码不正确,请重试.........";
                                txtValidateCode.Text = "";
                                LoadValidateCodePic();
                            });
                        }
                        else
                        {
                            DetermineCall(() =>
                            {
                                if (!string.IsNullOrEmpty(passengers["errMsg"] as string))
                                    MessageBox.Show(this, passengers["errMsg"] as string, "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                else
                                {
                                    MessageBox.Show(this, "铁道部在做怪,让你必需重新登陆了", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                }
                            });

                        }
                    }
                    else
                    {
                        DetermineCall(() =>
                        {
                            lblStatus.Text = "正在查询订单余票信息,请稍候.........";
                        });
                        Thread.Sleep(1000);
                        this.CheckTicket();
                    }
                }
            });
        }

        /// <summary>
        /// 查询余票
        /// </summary>
        private void CheckTicket()
        {
            lblStatus.Text = "正在查询订单余票信息……";
            HTTP.Request(new HttpRequest()
            {
                OperationName = _SubmitOperationName,
                Method = "GET",
                Url = Properties.Settings.Default.ConfirmPassengerActionUrl   "?method=getQueueCount"   PrepareGetTicketBody().ToString(),
                Referer = Properties.Settings.Default.ConfirmPassengerActionUrl   "?method=init",
                OnReset = (req) =>
                {
                    DetermineCall(() =>
                    {
                        lblStatus.Text = "";
                        btnSubmit.Text = "查询订单...";
                    });
                },
                OnHtml = (req, uri, html) =>
                {

                    ///{\"countT\":0,\"count\":0,\"ticket\":\"1*****32364*****00011*****00083*****0000\",\"op_1\":false,\"op_2\":true}
                    ///{\"countT\":0,\"count\":0,\"ticket\":\"6*****00124*****01543*****0026\",\"op_1\":false,\"op_2\":true}
                    ///op_2: 为真时 排队人数已经超过余票张数;
                    ///countT:  目前排队人数
                    ///ticket:余票分析
                    var passengers = JSON.decode(html) as JavaScriptObject;
                    DetermineCall(() =>
                    {
                        lblStatus.Text = string.Format("当前排队人数:{0},正在下单,请稍候.........", passengers["countT"] as string);
                    });
                    Thread.Sleep(2000);
                    this.SubmitOrder();
                }
            });
        }

        /// <summary>
        /// 提交定单
        /// </summary>
        private void SubmitOrder()
        {
            lblStatus.Text = "正在提交订单……";
            HTTP.Request(new HttpRequest()
            {
                OperationName = _SubmitOperationName,
                Method = "POST",
                Url = Properties.Settings.Default.ConfirmPassengerActionUrl   "?method=confirmSingleForQueue",
                Referer = Properties.Settings.Default.ConfirmPassengerActionUrl   "?method=init",
                Body = PreparePostBody().ToString(),
                MaxRetryCount = -1,
                OnRetry = (req, count) =>
                {
                    req.Body = PreparePostBody().ToString();
                    DetermineCall(() =>
                    {
                        lblStatus.Text = req.OperationName   string.Format(" 重试第 {0} 次", count);
                    });
                    Thread.Sleep(5000);
                    return false;
                },
                OnReset = (req) =>
                {
                    DetermineCall(() =>
                    {
                        lblStatus.Text = "";
                        btnSubmit.Text = "提交订单";
                    });
                },
                OnHtml = (req, uri, html) =>
                {
                    //{\"errMsg\":\"Y\"}
                    var data = JSON.decode(html) as JavaScriptObject;
                    if (data["errMsg"] as string != "Y")
                    {
                        DetermineCall(() =>
                        {
                            MessageBox.Show(this, data["errMsg"] as string, "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        });
                    }
                    else
                    {
                        DetermineCall(() =>
                        {
                            lblStatus.Text = "提交订单成功,正在查询定单信息……";
                        });
                        Thread.Sleep(1000);
                        this.QueryOrderInfo();
                    }
                }
            });
        }

        /// <summary>
        /// 订单成功,获取定单票据信息
        /// </summary>
        /// <returns></returns>
        private void QueryOrderInfo()
        {
            lblStatus.Text = "正在获取定单票据信息……";
            HTTP.Request(new HttpRequest()
            {
                OperationName = _SubmitOperationName,
                Method = "GET",
                Url = Properties.Settings.Default.OrderAction   "?method=queryOrderWaitTime&tourFlag=dc",
                Referer = Properties.Settings.Default.ConfirmPassengerActionUrl   "?method=init",
                OnError = (req, error) =>
                {
                    return false;
                },
                OnHtml = (req, uri, html) =>
                {
                    DetermineCall(() =>
                    {
                        lblStatus.Text = "正在获取定单票据信息,如果长时间无提示,可能你在排队中,请到网站里去查看订单...";
                    });
                    ///{"tourFlag":"dc","waitTime":-1,"waitCount":0,"orderId":"E248135025","requestId":5699307895415138286,"count":0}
                    var data = JSON.decode(html) as JavaScriptObject;
                    this.OrderInfoView(data["orderId"] as string);
                }
            });
        }

        /// <summary>
        /// 查看车票信息
        /// </summary>
        /// <param name="orderId"></param>
        private void OrderInfoView(string orderId)
        {
            ///https://dynamic.12306.cn/otsweb/order/confirmPassengerAction.do?method=payOrder&orderSequence_no=E425323274
            HTTP.Request(new HttpRequest()
              {
                  OperationName = _SubmitOperationName,
                  Method = "POST",
                  Url = Properties.Settings.Default.ConfirmPassengerActionUrl   "?method=payOrder&orderSequence_no="   orderId,
                  Referer = Properties.Settings.Default.ConfirmPassengerActionUrl   "?method=init",
                  OnHtml = (req, uri, html) =>
                  {
                      if (html.IndexOf("loseTime") != -1 && html.IndexOf("beginTime") != -1)
                      {
                          _SubmitOperationName = null;
                          DetermineCall(() =>
                          {
                              if (_quickTicketSuccessFunc == null)
                              {
                                  this.Hide();
                                  var form = new BookSuccessForm(ref html);
                                  form.ShowDialog();
                                  this.Close();
                              }
                              else
                              {
                                  _quickTicketSuccessFunc(html);
                                  this.Close();
                              }
                          });
                      }
                      #region --------------//-----------------------
                      //else
                      //{
                      //    var msg = req.GetErrorMessage(ref html);
                      //    if (msg.Contains("未处理的订单") || msg.Contains("没有足够的票"))
                      //    {
                      //        DetermineCall(() =>
                      //        {
                      //            MessageBox.Show(this, msg, "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                      //        });
                      //    }
                      //    else if (msg.IndexOf("验证码") != -1)
                      //    {
                      //        _SubmitOperationName = null;
                      //        DetermineCall(() =>
                      //        {
                      //            MessageBox.Show(this, "验证码不正确,请重新输入!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                      //        });
                      //        LoadValidateCodePic();
                      //    }
                      //    else
                      //    {
                      //        var formBody = StringHelper.FindString(ref html, "<form name=\"save_passenger_single\"", "</form>");
                      //        if (formBody != null)
                      //        {
                      //            PrepareRequestData(ref formBody);
                      //        }
                      //        throw new Exception("重试提交");
                      //        //else
                      //        //{
                      //        //    DetermineCall(() =>
                      //        //    {
                      //        //        MessageBox.Show(this, "提交订单失败:"   msg, "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                      //        //        lblStatus.Text = "提交订单失败:"   msg;
                      //        //        btnSubmit.Text = "提交订单";
                      //        //    });                                
                      //        //}
                      //    }
                      //}
                      #endregion
                  }
              });
        }

        private void LoadValidateCodePic(Func<string> Method = null)
        {
            DetermineCall(() =>
            {
                lblStatus.Text = "正在加载验证码图片……";
            });
            HTTP.Request(new HttpRequest()
            {
                Method = "GET",
                //Url = Properties.Settings.Default.ValidateCodeUrl   "?rand=randp",
                Url = Properties.Settings.Default.ValidateCodeUrl   "?module=login&rand=randp",
                Referer = Properties.Settings.Default.LogOnUrl,
                OperationName = "加载验证码图片",
                OnData = (req, uri, data) =>
                {
                    if (!uri.AbsoluteUri.Equals(req.Url, StringComparison.OrdinalIgnoreCase))
                    {
                        throw new Exception("地址被重新定向");
                    }
                    DetermineCall(() =>
                    {
                        if (pictureBoxValidateCode.Image != null)
                        {
                            pictureBoxValidateCode.Image = null;
                        }
                        Image Img;
                        string Code_1 = "";
                        string code = string.Empty;
                        byte[] buffer;
                        using (var stream = new MemoryStream(data, false))
                        {
                  
                            int count = 0;
                            do
                            {
                                buffer = DownloadImage(stream);
                                if (buffer != null)
                                {
                                    codeBuilder.Length = 0;
                                    if (SundayAPI.GetCodeFromBuffer(1, buffer, buffer.Length, codeBuilder))
                                    {
                                        code = codeBuilder.ToString();
                                        Code_1 = code;
                                    }
                                }
                                else
                                {
                                    break;
                                    // LoadValidateCodePic(Method);
                                }
                                count  ;
                            } while (count < 10 && code.Length != 4);
                   
                        }
                        if (buffer == null)
                        {
                            LoadValidateCodePic(Method);

                        }
                        else
                        {
                            Img = Image.FromStream(new MemoryStream(buffer, false));
                            txtValidateCode.Text = Code_1;
                            pictureBoxValidateCode.Image = Img;
                            lblStatus.Text = "请选择编辑核对乘客信息后提交订单。";
                            txtValidateCode.Focus();
                            if (Method != null && !string.IsNullOrEmpty(txtValidateCode.Text))
                                Method(txtValidateCode.Text);
                        }
                    });
                }
            });
        }
        byte[] m_buffer = new byte[4096];
        StringBuilder codeBuilder = new StringBuilder(8, 8);
        private byte[] DownloadImage(Stream stream)
        {
            int offset = 0;
            int count = 0;
            do
            {
                count = stream.Read(m_buffer, offset, m_buffer.Length - offset);
                if (count > 0)
                {
                    offset  = count;
                }

            } while (count > 0);
            if (offset > 0)
            {
                byte[] ret = new byte[offset];
                Array.Copy(m_buffer, ret, offset);
                return ret;
            }
            return null;
        }
        private StringBuilder PrepareGetTicketBody()
        {
            //&train_date=2013-02-09&train_no=2400000Z6707&station=Z67&seat=3&from=BXP&to=JJG&ticket=10163531504045650050608405000910163500003028950053
            //&train_date=2013-02-11&train_no=2400000Z6707&station=Z67&seat=3&from=BXP&to=JJG&ticket=10163531824045650052608405000810163503213028950289
            var postBody = new StringBuilder(1024);
            postBody.AppendFormat("&train_date={0}", _PostValues["orderRequest.train_date"]);
            postBody.AppendFormat("&train_no={0}", _PostValues["orderRequest.train_no"]);
            postBody.AppendFormat("&station={0}", _PostValues["orderRequest.station_train_code"]);
            postBody.AppendFormat("&seat={0}", _BindingPassengers[0].SeatType);
            postBody.AppendFormat("&from={0}", _PostValues["orderRequest.from_station_telecode"]);
            postBody.AppendFormat("&to={0}", _PostValues["orderRequest.to_station_telecode"]);
            postBody.AppendFormat("&ticket={0}", _PostValues["leftTicketStr"]);
            return postBody;
        }

        private void DetermineCall(MethodInvoker method)
        {
            if (InvokeRequired)
            {
                Invoke(method);
            }
            else
            {
                method();
            }
        }

        private void pictureBoxValidateCode_MouseClick(object sender, MouseEventArgs e)
        {
            LoadValidateCodePic();
        }

        private void txtValidateCode_TextChanged(object sender, EventArgs e)
        {
            if (this.btnSubmit.Enabled)
            {
                if (this.txtValidateCode.Text.Trim().Length == 4&&this.chkOder.Checked)
                {
                    btnSubmit_Click(null, null);
                }
            }
        }
    }
}


标签: 模拟 网站 登录

实例下载地址

c# 12306订票软件实例源码下载 (模拟登录网站)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警