C#快递跟踪(基于快递100深度定制)

本文主要介绍快递跟踪的相关信息。如根据快递单号预测所属快递公司,判断快递是否已被签收,以及改良官方model后可在不用申请授权的情况下实现json,html,xml及text等多种格式以及单行多行,降序升序等方式的输出。本文仅供大家学习使用,任何商业相关的调用请使用官方接口。

先定义SortList数组用于存放快递公司的简称和全称

  public SortedList Ht = new SortedList()
        {
            {"zhongyouwuliu", "中邮物流"},
            {"zhongtong", "中通速递"},
            {"zhongtiewuliu", "中铁快运"},
            {"zhaijisong", "宅急送"},
            {"yuntongkuaidi", "运通快递"},
            {"yuananda", "源安达"},
            {"yunda", "韵达快运"},
            {"yuefengwuliu", "越丰物流"},
            {"yuanzhijiecheng", "元智捷诚快递"},
            {"yuanweifeng", "源伟丰快递"},
            {"yuantong", "圆通速递"},
            {"yuanchengwuliu", "远成物流"},
            {"youshuwuliu", "优速物流"},
            {"yibangwuliu", "一邦速递"},
            {"yafengsudi", "亚风速递"},
          //........  
}    

原始模型:

   public class Detail
    {
        public DateTime time;
        public string context;
        public DateTime ftime;

        public Detail()
        {
        }
    }

    public class Info
    {
        public string message;
        public string nu;
        public int ischeck;
        public string com;
        public string status;
        public string condition;
        public int state;
        public Detail[] data;

        public Info()
        {
        }
    }

改良后模型:

  public class Kuaididetail
    {
        public string Time;
        public string Context;
        public Kuaididetail()
        {
        }

        public Kuaididetail(string time,string context)
        {
            this.Time = time;
            this.Context = context;
        }
    }

    public class KuaidiInfo
    {
        public string No;   //快递单号
        public string Name;  //快递公司名称
        public string ShortName; //快递公司简称
        public string Message;   //状态信息,ok为有快递信息
        public string HtmlStatus; //html状态码 详见:http://yige.org/tags/ref_httpmessages.php
        public int State;   /*快递单当前的状态 :  
                                0:在途,即货物处于运输过程中;
                                1:揽件,货物已由快递公司揽收并且产生了第一条跟踪信息;
                                2:疑难,货物寄送过程出了问题;
                                3:签收,收件人已签收;
                                4:退签,即货物由于用户拒签、超区等原因退回,而且发件人已经签收;
                                5:派件,即快递正在进行同城派件;
                                6:退回,货物正处于退回发件人的途中;*/
        public string Days;   //快递在途时间
        public List<Kuaididetail> Detail; //快递详情

        public KuaidiInfo()
        {
        }
    }

1.根据快递单号模糊搜索出快递公司名称

Demo图:

输入数字动态加载匹配度最高的快递公司名称:

  $("#search_input").keyup(function () {
            var value = $("#search_input").val();
            $("#search_list").html("");
            $.ajax({
                type: "GET",
                url: "/KuaiDi/GetData",
                data: {no:value},
                dataType: 'json',
                timeout: 5000,
                cache: false,
                success: function (result) {
                    var html = "";
                    $.each(result, function (k, v) {
                            html += "<li>"+v+"</li>";                  
                    });
                    $("#search_list").html(html);
                    $("#search_list li").click(function (e) {
                        e.stopPropagation();
                        var _text = $(this).text();
                        $("#search_input").val(_text);
                        $("#search_list").hide();
                    });
                },
                error: function () {

                }
            });
        });

json请求代码:

      public JsonResult GetData(string no)
        {
            List<string> list = new List<string>();
            try
            {
                string apiurl = "http://www.kuaidi100.com/autonumber/auto?num="+no;
                WebClient webClient = new WebClient();
                byte[] result = webClient.DownloadData(apiurl);
                string tip = Encoding.GetEncoding("utf-8").GetString(result);
                JavaScriptSerializer jss = new JavaScriptSerializer();
                var info = jss.Deserialize<List<KuaiduTip>>(tip);
                if (info.Count > 0)
                {
                    foreach (var item in info)
                    {
                        string temp =no + " " + (Ht.ContainsKey(item.comCode) ? Ht[item.comCode].ToString() : item.comCode);
                        list.Add(temp);
                    }
                }
            }
            catch (Exception)
            {

            }
            return Json(list, JsonRequestBehavior.AllowGet);            
        }

2.从快递100那里拿取数据

        /// <summary>
        /// 从快递100那里拿取数据
        /// </summary>
        /// <param name="name">快递公司简称</param>
        /// <param name="no">快递单号</param>
        /// <returns></returns>
        public Info GetInfo(string name, string no)
        {
            string apiurl = "http://www.kuaidi100.com/query?id=1&type=" + name + "&postid=" + no + "&valicode=11&temp=12";
            WebClient webClient = new WebClient();
            byte[] result = webClient.DownloadData(apiurl);
            string wuliu = Encoding.GetEncoding("utf-8").GetString(result);
            JavaScriptSerializer jss = new JavaScriptSerializer();
            Info info = jss.Deserialize<Info>(wuliu);
            return info;
        }

3.判断快递是否已被签收

    /// <summary>
        /// 判断快递是否已被签收
        /// </summary>
        /// <param name="name">快递公司简称</param>
        /// <param name="no">快递单号</param>
        /// <returns></returns>
        public bool IsSigned(string name, string no)
        {
            Info info = GetInfo(name, no);
            if (info.message == "ok")
            {
                Detail[] details = info.data;
                if (details[0].context.Contains("签收") || info.state == 3)
                {
                    return true;
                }
            }
            return false;
        }

4.快递接口调用(可实现json,html,xml及text等格式及单行多行,降序升序输出)

      //快递接口调用
        /// <summary>
        /// 
        /// </summary>
        /// <param name="name">快递公司简称</param>
        /// <param name="no">快递单号</param>
        /// <param name="type">0表示json,1表示html,2表示xml,3表示文本</param>
        /// <param name="muti">true表示显示多行,false表示只显示一行</param>
        /// <param name="isDesc">true表示降序,false表示升序</param>
        /// <returns></returns>
        public ActionResult Index(string name, string no,int type,bool muti,bool isDesc)
        {
            try
            {
                Info info = GetInfo(name,no);              
                string expressName = Ht[name].ToString();

                KuaidiInfo kuaidiInfo = new KuaidiInfo();
                kuaidiInfo.No = no;
                kuaidiInfo.Name = expressName;
                kuaidiInfo.ShortName = name;
                kuaidiInfo.State = info.state;
                kuaidiInfo.HtmlStatus = info.status;
                if (info.message == "ok")
                {
                    Detail[] details = info.data;
                    DateTime starTime = details[0].time;
                    DateTime endTime = details[details.Length - 1].time;
                    TimeSpan ts = starTime.Subtract(endTime);
                    double ss = ts.TotalHours;
                    kuaidiInfo.Days = ((int)ss / 24).ToString() + "" + ((int)ss % 24).ToString() + "小时";
                    kuaidiInfo.Message = "OK";
                    List<Detail> dd = details.ToList();
                    if (muti)
                    {
                        if (isDesc)
                        {
                            List<Kuaididetail> kdList = new List<Kuaididetail>();
                            foreach (Detail t in dd)
                            {
                                Kuaididetail kd = new Kuaididetail(t.time.ToString(), t.context);
                                kdList.Add(kd);
                            }
                            kuaidiInfo.Detail = kdList;
                        }
                        else
                        {
                            dd = dd.OrderBy(p => p.time).ToList();
                            List<Kuaididetail> kdList = new List<Kuaididetail>();
                            foreach (Detail t in dd)
                            {
                                Kuaididetail kd = new Kuaididetail(t.time.ToString(), t.context);
                                kdList.Add(kd);
                            }
                            kuaidiInfo.Detail = kdList;
                        }
                    }
                    else
                    {
                        if (isDesc)
                        {
                            Kuaididetail kd = new Kuaididetail(dd[0].time.ToString(), dd[0].context);
                            List<Kuaididetail> kdList = new List<Kuaididetail>();
                            kdList.Add(kd);
                            kuaidiInfo.Detail = kdList;
                        }
                        else
                        {
                            dd = dd.OrderBy(p => p.time).ToList();
                            Kuaididetail kd = new Kuaididetail(dd[0].time.ToString(), dd[0].context);
                            List<Kuaididetail> kdList = new List<Kuaididetail>();
                            kdList.Add(kd);
                            kuaidiInfo.Detail = kdList;
                        }
                    }
                }
                else
                {
                    kuaidiInfo.Message = info.message.Split('')[1];
                }

                /////////////////////////////////////////////////////////////////////////////

                switch (type)
                {
                    case 0:
                    {
                        JavaScriptSerializer jss = new JavaScriptSerializer();
                        string json = jss.Serialize(kuaidiInfo); //序列化成JSON
                        return Content(json);
                    }
                    case 1:
                        return View(kuaidiInfo);
                    case 2:
                        CreateXmlFromBy(kuaidiInfo);                         
                        return null;
                    case 3:
                        string result = String.Empty;
                        foreach (var item in kuaidiInfo.Detail)
                        {
                            result += item.Time + "\t" + item.Context + "\n";
                        }
                        return Content(result);
                    default:
                        return null;
                }
            }
            catch
            {
                return null;
            }
        }
    }

5.将数据导出到xml并显示在页面

  public void CreateXmlFromBy(KuaidiInfo info)
        {
            var m =info.Detail.Select(p => new XElement("Data", new XElement("Time", p.Time), new XElement("Context", p.Context)));
            XElement x = new XElement("xml",new XElement("No",info.No),new XElement("Name",info.Name),new XElement("Message",info.Message),new XElement("HtmlStatus",info.HtmlStatus),new XElement("State",info.State),new XElement("Days",info.Days),m);
            Response.Charset = "utf-8";//格式
            Response.ContentType = "text/xml";//类型
            Response.Write(x);
        }

6.输出Demo演示

json格式:

{"No":"1900916254100","Name":"韵达快运","ShortName":"yunda","Message":"OK","HtmlStatus":"200","State":3,"Days":"2天19小时","Detail":[{"Time":"2014/10/27 16:33:31","Context":"到达:山东烟台莱山区公司大学分部 由 图片 签收"},{"Time":"2014/10/27 16:27:24","Context":"到达:山东烟台莱山区公司大学分部 指定:王师傅(15165747011) 派送"},{"Time":"2014/10/27 10:37:09","Context":"到达:山东烟台莱山区公司大学分部 上级站点:山东烟台莱山区公司 发往:"},{"Time":"2014/10/27 8:42:04","Context":"到达:山东烟台分拨中心 发往:山东烟台莱山区公司"},{"Time":"2014/10/27 8:40:26","Context":"到达:山东烟台分拨中心 上级站点:山东济南分拨中心"},{"Time":"2014/10/26 18:30:31","Context":"到达:山东济南分拨中心 发往:山东烟台分拨中心"},{"Time":"2014/10/26 18:28:53","Context":"到达:山东济南分拨中心 上级站点:江西南昌分拨中心"},{"Time":"2014/10/25 1:16:43","Context":"到达:江西南昌分拨中心 发往:山东济南分拨中心"},{"Time":"2014/10/25 1:13:51","Context":"到达:江西南昌分拨中心"},{"Time":"2014/10/24 20:38:26","Context":"到达:江西南昌青山湖区罗家集公司 已收件"}]}

html格式:

XML格式:

文本格式:

2014/10/27 16:33:31    到达:山东烟台莱山区公司大学分部 由 图片 签收 2014/10/27 16:27:24    到达:山东烟台莱山区公司大学分部 指定:王师傅(15165747011) 派送 2014/10/27 10:37:09    到达:山东烟台莱山区公司大学分部 上级站点:山东烟台莱山区公司 发往: 2014/10/27 8:42:04    到达:山东烟台分拨中心 发往:山东烟台莱山区公司 2014/10/27 8:40:26    到达:山东烟台分拨中心 上级站点:山东济南分拨中心 2014/10/26 18:30:31    到达:山东济南分拨中心 发往:山东烟台分拨中心 2014/10/26 18:28:53    到达:山东济南分拨中心 上级站点:江西南昌分拨中心 2014/10/25 1:16:43    到达:江西南昌分拨中心 发往:山东济南分拨中心 2014/10/25 1:13:51    到达:江西南昌分拨中心 2014/10/24 20:38:26    到达:江西南昌青山湖区罗家集公司 已收件

 

posted @ 2015-01-22 18:43  徐航  阅读(2539)  评论(0编辑  收藏  举报