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

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

  1. public SortedList Ht = new SortedList()
  2. {
  3. {"zhongyouwuliu", "中邮物流"},
  4. {"zhongtong", "中通速递"},
  5. {"zhongtiewuliu", "中铁快运"},
  6. {"zhaijisong", "宅急送"},
  7. {"yuntongkuaidi", "运通快递"},
  8. {"yuananda", "源安达"},
  9. {"yunda", "韵达快运"},
  10. {"yuefengwuliu", "越丰物流"},
  11. {"yuanzhijiecheng", "元智捷诚快递"},
  12. {"yuanweifeng", "源伟丰快递"},
  13. {"yuantong", "圆通速递"},
  14. {"yuanchengwuliu", "远成物流"},
  15. {"youshuwuliu", "优速物流"},
  16. {"yibangwuliu", "一邦速递"},
  17. {"yafengsudi", "亚风速递"},
  18. //........
  19. }

原始模型:

  1. public class Detail
  2. {
  3. public DateTime time;
  4. public string context;
  5. public DateTime ftime;
  6.  
  7. public Detail()
  8. {
  9. }
  10. }
  11.  
  12. public class Info
  13. {
  14. public string message;
  15. public string nu;
  16. public int ischeck;
  17. public string com;
  18. public string status;
  19. public string condition;
  20. public int state;
  21. public Detail[] data;
  22.  
  23. public Info()
  24. {
  25. }
  26. }

改良后模型:

  1. public class Kuaididetail
  2. {
  3. public string Time;
  4. public string Context;
  5. public Kuaididetail()
  6. {
  7. }
  8.  
  9. public Kuaididetail(string time,string context)
  10. {
  11. this.Time = time;
  12. this.Context = context;
  13. }
  14. }
  15.  
  16. public class KuaidiInfo
  17. {
  18. public string No; //快递单号
  19. public string Name; //快递公司名称
  20. public string ShortName; //快递公司简称
  21. public string Message; //状态信息,ok为有快递信息
  22. public string HtmlStatus; //html状态码 详见:http://yige.org/tags/ref_httpmessages.php
  23. public int State; /*快递单当前的状态 : 
  24. 0:在途,即货物处于运输过程中;
  25. 1:揽件,货物已由快递公司揽收并且产生了第一条跟踪信息;
  26. 2:疑难,货物寄送过程出了问题;
  27. 3:签收,收件人已签收;
  28. 4:退签,即货物由于用户拒签、超区等原因退回,而且发件人已经签收;
  29. 5:派件,即快递正在进行同城派件;
  30. 6:退回,货物正处于退回发件人的途中;*/
  31. public string Days; //快递在途时间
  32. public List<Kuaididetail> Detail; //快递详情
  33.  
  34. public KuaidiInfo()
  35. {
  36. }
  37. }

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

Demo图:

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

  1. $("#search_input").keyup(function () {
  2. var value = $("#search_input").val();
  3. $("#search_list").html("");
  4. $.ajax({
  5. type: "GET",
  6. url: "/KuaiDi/GetData",
  7. data: {no:value},
  8. dataType: 'json',
  9. timeout: 5000,
  10. cache: false,
  11. success: function (result) {
  12. var html = "";
  13. $.each(result, function (k, v) {
  14. html += "<li>"+v+"</li>";
  15. });
  16. $("#search_list").html(html);
  17. $("#search_list li").click(function (e) {
  18. e.stopPropagation();
  19. var _text = $(this).text();
  20. $("#search_input").val(_text);
  21. $("#search_list").hide();
  22. });
  23. },
  24. error: function () {
  25.  
  26. }
  27. });
  28. });

json请求代码:

  1. public JsonResult GetData(string no)
  2. {
  3. List<string> list = new List<string>();
  4. try
  5. {
  6. string apiurl = "http://www.kuaidi100.com/autonumber/auto?num="+no;
  7. WebClient webClient = new WebClient();
  8. byte[] result = webClient.DownloadData(apiurl);
  9. string tip = Encoding.GetEncoding("utf-8").GetString(result);
  10. JavaScriptSerializer jss = new JavaScriptSerializer();
  11. var info = jss.Deserialize<List<KuaiduTip>>(tip);
  12. if (info.Count > )
  13. {
  14. foreach (var item in info)
  15. {
  16. string temp =no + " " + (Ht.ContainsKey(item.comCode) ? Ht[item.comCode].ToString() : item.comCode);
  17. list.Add(temp);
  18. }
  19. }
  20. }
  21. catch (Exception)
  22. {
  23.  
  24. }
  25. return Json(list, JsonRequestBehavior.AllowGet);
  26. }

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

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

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

  1. /// <summary>
  2. /// 判断快递是否已被签收
  3. /// </summary>
  4. /// <param name="name">快递公司简称</param>
  5. /// <param name="no">快递单号</param>
  6. /// <returns></returns>
  7. public bool IsSigned(string name, string no)
  8. {
  9. Info info = GetInfo(name, no);
  10. if (info.message == "ok")
  11. {
  12. Detail[] details = info.data;
  13. if (details[].context.Contains("签收") || info.state == )
  14. {
  15. return true;
  16. }
  17. }
  18. return false;
  19. }

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

  1. //快递接口调用
  2. /// <summary>
  3. ///
  4. /// </summary>
  5. /// <param name="name">快递公司简称</param>
  6. /// <param name="no">快递单号</param>
  7. /// <param name="type">0表示json,1表示html,2表示xml,3表示文本</param>
  8. /// <param name="muti">true表示显示多行,false表示只显示一行</param>
  9. /// <param name="isDesc">true表示降序,false表示升序</param>
  10. /// <returns></returns>
  11. public ActionResult Index(string name, string no,int type,bool muti,bool isDesc)
  12. {
  13. try
  14. {
  15. Info info = GetInfo(name,no);
  16. string expressName = Ht[name].ToString();
  17.  
  18. KuaidiInfo kuaidiInfo = new KuaidiInfo();
  19. kuaidiInfo.No = no;
  20. kuaidiInfo.Name = expressName;
  21. kuaidiInfo.ShortName = name;
  22. kuaidiInfo.State = info.state;
  23. kuaidiInfo.HtmlStatus = info.status;
  24. if (info.message == "ok")
  25. {
  26. Detail[] details = info.data;
  27. DateTime starTime = details[].time;
  28. DateTime endTime = details[details.Length - ].time;
  29. TimeSpan ts = starTime.Subtract(endTime);
  30. double ss = ts.TotalHours;
  31. kuaidiInfo.Days = ((int)ss / ).ToString() + "天" + ((int)ss % ).ToString() + "小时";
  32. kuaidiInfo.Message = "OK";
  33. List<Detail> dd = details.ToList();
  34. if (muti)
  35. {
  36. if (isDesc)
  37. {
  38. List<Kuaididetail> kdList = new List<Kuaididetail>();
  39. foreach (Detail t in dd)
  40. {
  41. Kuaididetail kd = new Kuaididetail(t.time.ToString(), t.context);
  42. kdList.Add(kd);
  43. }
  44. kuaidiInfo.Detail = kdList;
  45. }
  46. else
  47. {
  48. dd = dd.OrderBy(p => p.time).ToList();
  49. List<Kuaididetail> kdList = new List<Kuaididetail>();
  50. foreach (Detail t in dd)
  51. {
  52. Kuaididetail kd = new Kuaididetail(t.time.ToString(), t.context);
  53. kdList.Add(kd);
  54. }
  55. kuaidiInfo.Detail = kdList;
  56. }
  57. }
  58. else
  59. {
  60. if (isDesc)
  61. {
  62. Kuaididetail kd = new Kuaididetail(dd[].time.ToString(), dd[].context);
  63. List<Kuaididetail> kdList = new List<Kuaididetail>();
  64. kdList.Add(kd);
  65. kuaidiInfo.Detail = kdList;
  66. }
  67. else
  68. {
  69. dd = dd.OrderBy(p => p.time).ToList();
  70. Kuaididetail kd = new Kuaididetail(dd[].time.ToString(), dd[].context);
  71. List<Kuaididetail> kdList = new List<Kuaididetail>();
  72. kdList.Add(kd);
  73. kuaidiInfo.Detail = kdList;
  74. }
  75. }
  76. }
  77. else
  78. {
  79. kuaidiInfo.Message = info.message.Split(':')[];
  80. }
  81.  
  82. /////////////////////////////////////////////////////////////////////////////
  83.  
  84. switch (type)
  85. {
  86. case :
  87. {
  88. JavaScriptSerializer jss = new JavaScriptSerializer();
  89. string json = jss.Serialize(kuaidiInfo); //序列化成JSON
  90. return Content(json);
  91. }
  92. case :
  93. return View(kuaidiInfo);
  94. case :
  95. CreateXmlFromBy(kuaidiInfo);
  96. return null;
  97. case :
  98. string result = String.Empty;
  99. foreach (var item in kuaidiInfo.Detail)
  100. {
  101. result += item.Time + "\t" + item.Context + "\n";
  102. }
  103. return Content(result);
  104. default:
  105. return null;
  106. }
  107. }
  108. catch
  109. {
  110. return null;
  111. }
  112. }
  113. }

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

  1. public void CreateXmlFromBy(KuaidiInfo info)
  2. {
  3. var m =info.Detail.Select(p => new XElement("Data", new XElement("Time", p.Time), new XElement("Context", p.Context)));
  4. 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);
  5. Response.Charset = "utf-8";//格式
  6. Response.ContentType = "text/xml";//类型
  7. Response.Write(x);
  8. }

6.输出Demo演示

json格式:

  1. {"No":"","Name":"韵达快运","ShortName":"yunda","Message":"OK","HtmlStatus":"","State":,"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格式:

文本格式:

  1. // :: 到达:山东烟台莱山区公司大学分部 由 图片 签收 // :: 到达:山东烟台莱山区公司大学分部 指定:王师傅() 派送 // :: 到达:山东烟台莱山区公司大学分部 上级站点:山东烟台莱山区公司 发往: // :: 到达:山东烟台分拨中心 发往:山东烟台莱山区公司 // :: 到达:山东烟台分拨中心 上级站点:山东济南分拨中心 // :: 到达:山东济南分拨中心 发往:山东烟台分拨中心 // :: 到达:山东济南分拨中心 上级站点:江西南昌分拨中心 // :: 到达:江西南昌分拨中心 发往:山东济南分拨中心 // :: 到达:江西南昌分拨中心 // :: 到达:江西南昌青山湖区罗家集公司 已收件

C#快递跟踪(基于快递100深度定制)的更多相关文章

  1. 网易云基于 Kubernetes 的深度定制化实践

    本文由  网易云发布. 2017 年,Kubernetes 超越 Mesos 和 Docker Swarm成为最受欢迎的容器编排技术.网易云从 2015 下半年开始向 Kubernetes 社区贡献代 ...

  2. solr特点三: 基于Solr实现排序定制化参考

    排序实现有N种形式,最低成本.最快响应时间是目标 一份索引,支持N种排序策略并且在线互不干扰是要考虑的每一种实现,处理的场景是不同的,不要千篇一律 020排序,从索引到效果,有不少坑,这篇文章没有细说 ...

  3. 语义分割:基于openCV和深度学习(二)

    语义分割:基于openCV和深度学习(二) Semantic segmentation in images with OpenCV 开始吧-打开segment.py归档并插入以下代码: Semanti ...

  4. 从Theano到Lasagne:基于Python的深度学习的框架和库

    从Theano到Lasagne:基于Python的深度学习的框架和库 摘要:最近,深度神经网络以“Deep Dreams”形式在网站中如雨后春笋般出现,或是像谷歌研究原创论文中描述的那样:Incept ...

  5. (转) 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-01-FAQ

    特别棒的一篇文章,仍不住转一下,留着以后需要时阅读 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-01-FAQ

  6. 基于网络的服装定制MTM系统研究 - 硕士论文 - 道客巴巴

    国内的mtm系统_百度搜索 基于网络的服装定制MTM系统研究 - 硕士论文 - 道客巴巴 PDF文档(共76页) - 下载需1800积分 天津工业大学 硕士学位论文基于网络的服装定制MTM系统研究 姓 ...

  7. 基于TensorFlow的深度学习系列教程 2——常量Constant

    前面介绍过了Tensorflow的基本概念,比如如何使用tensorboard查看计算图.本篇则着重介绍和整理下Constant相关的内容. 基于TensorFlow的深度学习系列教程 1--Hell ...

  8. 基于 Keras 用深度学习预测时间序列

    目录 基于 Keras 用深度学习预测时间序列 问题描述 多层感知机回归 多层感知机回归结合"窗口法" 改进方向 扩展阅读 本文主要参考了 Jason Brownlee 的博文 T ...

  9. 基于pythpn的深度学习 - 记录

    [基于pythpn的深度学习] 环境:    windows/linux-ubuntu    Tensorflow (基于anaconda)        *安装 (python3.5以上不支持)   ...

随机推荐

  1. 【Bible for kids】 儿童圣经 App

    [Bible for kids] 儿童圣经App 除了<The Bible>这个由YouVersion团队开发的全球下载量和安装数目第一的圣经类.安装量已逾1亿8千万的App之外,YouV ...

  2. 【Android进阶】SlidingMenu实现侧滑栏效果的实现

    public class MainActivity extends Activity { @Override protected void onCreate(final Bundle savedIns ...

  3. Java中关于OOM的场景及解决方法(转)

    http://developer.51cto.com/art/201112/305696.htm 1.OOM for Heap=>例如:java.lang.OutOfMemoryError: J ...

  4. ZOJ1463:Brackets Sequence(间隙DP)

    Let us define a regular brackets sequence in the following way: 1. Empty sequence is a regular seque ...

  5. 采用curl库

    Windows通过使用curl库: 到http://curl.haxx.se/下了个curl的源代码下来,源代码是用VC6编译的,我在VS2005下又一次进行编译.竟然仅仅有一个警告. cUrl的实现 ...

  6. 跨域 Iframe 通信解决方案(兼容 IE 系列浏览器。)

    实现思路: 1.postMessage(IE8+, Firefox 3.1+, Opera 9+, Safari, and Chrome) 2.利用window.navigator共享信息,使支持IE ...

  7. 用于主题检测的临时日志(18506589-369d-4505-a204-3678db17eae5 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)

    这是一个未删除的临时日志.请手动删除它.(252f1b1e-5ce3-42a8-95da-bc0acbd4f637 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)

  8. DeviceIoControl的使用说明

    应用程序和驱动程序的通信过程是:应用程序使用CreateFile函数打开设备,然后用DeviceIoControl与驱动程序进行通信,包含读和写两种操作.还能够用ReadFile读数据用WriteFi ...

  9. linux+win7双系统重装win7修复grub的办法(转)

    本人是debian+win7的双系统, 下面介绍下重装win7的整个过程以及遇到的一些小问题,在查阅相关博客和朋友的帮助下成功修复, 记录下以便以后有不时之需, 也希望能帮助到遇到同样问题的朋友! 首 ...

  10. HDOJ 3480 Division

    斜率优化DP. ... 对数组排序后.dp[i][j]表示对前j个物品分i段的最少代价,dp[i][j]= min{ dp[i-1][k]+(a[k+1]-a[j])^2 }复杂度m*n^2     ...