铁路局12306余票查询的实现

时间:2022-02-03 22:50:59

离上次写的类似于铁道部12306城市选择框的实现过了都快一个月了,最近一直在忙,在学习sharepoint2013,虽然早就实现了12306的余票查询,但是一直没抽出时间来写,刚好这几天也快放假了,抽点时间写一下,不然都要拖到年后了啊。。。

先来看一下条件输入窗口:

铁路局12306余票查询的实现

这里的出发地和目的地是之前提到的城市选择框,加上一个DateTimePicker和一个Button,就做的简陋一点了哈,对界面挑剔的大牛可以绕道,不要伤害我幼小的心灵哟~

然后我们分析一下12306查询余票的过程:

最直接的就是用chrome的开发者选项(F12),我比较喜欢用这个而已,当然你用firefox的firebug也可以,或者用IE的开发者选项,追踪一下点击查询按钮的这个过程,看看具体调用了那些网站,传了哪些参数,有哪些cookies,这个过程我就不详细介绍了,大家有兴趣的可以自己去研究一下,我就贴几张图,这是我分析到的结果:

 

铁路局12306余票查询的实现

铁路局12306余票查询的实现

现在准备就绪,开工了。。

废话不多说,上代码!

private void btnSelect_Click(object sender, EventArgs e)
        {
            //判断是否选择出发地
            string fromStation = this.fromStationText.Text;
            if (fromStation == "")
            {
                MessageBox.Show("请选择出发地!");
            }
            else
            {
                //判断是否选择目的地
                string toStation = this.toStationText.Text;
                if (toStation == "")
                {
                    MessageBox.Show("请选择目的地!");
                }
                else
                {
                    //判断时间是否合理
                    this.startTime.Format = DateTimePickerFormat.Custom;
                    this.startTime.CustomFormat = "yyyy-MM-dd";
                    string nowDate = DateTime.Now.ToString("yyyy-MM-dd");
                    string startDate = this.startTime.Text;
                    if (startDate.CompareTo(nowDate) < 0)
                    {
                        MessageBox.Show("请选择合适的时间!");
                    }
                    else
                    {
                        //将城市转码
                        string fromStationCode = CityInfoHelper.codeSelect(fromStation);
                        string toStationCode = CityInfoHelper.codeSelect(toStation);
                        //获得查询结果
                        var datas = TicketDemo.GetTicketData.getTicketData(fromStationCode, toStationCode, startDate);
                        JToken[] TrainInfoArr = datas.ToArray();
                        int arrLength = TrainInfoArr.Length;
                        
                        string train_no = datas[0]["train_no"].ToString();
                    }
                }
            }
        }

  这是查询按钮的点击事件,没什么内容,对出发地,目的地,出发时间做一个合理判断,从数据库将城市的CODE读出,将fromStationCode, toStationCode, startDate传入查询函数,取得返回的DATA,这里返回的值,调试一下就可以看到他的格式,他的事json的格式,转换一下格式,读出就可以了。

接下来,核心代码来了,擦亮你的眼睛,看好咯:

public static JToken getTicketData(string fromStation,string toStation,string startDate)
        {
            //获取查询的车票信息
            string url = "https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=ADULT&queryDate=" + startDate + "&from_station=" + fromStation + "&to_station=" + toStation;
            System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(url);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();//请求连接,并返回数据
            System.IO.StreamReader myreader = new System.IO.StreamReader(response.GetResponseStream(), Encoding.UTF8);
            string responseText = myreader.ReadToEnd();
            myreader.Close();
            JObject joo = (JObject)JsonConvert.DeserializeObject(responseText);
            string  re = joo["data"].ToString();
            JObject da = (JObject)JsonConvert.DeserializeObject(re);
            var data = da["datas"];
            return data;
        }

代码很简单,相信大家也都看得懂,我也不做过多的解释了,就是做一个request和response,然后就可以取到我们想要的结果了哈!

 

到这里,关于余票查询的部门就介绍完毕了,至于要怎么展示,那就看大家自己的喜好了,有兴趣的朋友可以一步步的去执行看看,也欢迎大牛们给点指导意见,小弟感激不尽!

 

新手帖,非喜勿喷,大神可自动过滤~~~