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 > )
- {
- 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[].context.Contains("签收") || info.state == )
- {
- 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[].time;
- DateTime endTime = details[details.Length - ].time;
- TimeSpan ts = starTime.Subtract(endTime);
- double ss = ts.TotalHours;
- kuaidiInfo.Days = ((int)ss / ).ToString() + "天" + ((int)ss % ).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[].time.ToString(), dd[].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[].time.ToString(), dd[].context);
- List<Kuaididetail> kdList = new List<Kuaididetail>();
- kdList.Add(kd);
- kuaidiInfo.Detail = kdList;
- }
- }
- }
- else
- {
- kuaidiInfo.Message = info.message.Split(':')[];
- }
- /////////////////////////////////////////////////////////////////////////////
- switch (type)
- {
- case :
- {
- JavaScriptSerializer jss = new JavaScriptSerializer();
- string json = jss.Serialize(kuaidiInfo); //序列化成JSON
- return Content(json);
- }
- case :
- return View(kuaidiInfo);
- case :
- CreateXmlFromBy(kuaidiInfo);
- return null;
- case :
- 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":"","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格式:
文本格式:
- // :: 到达:山东烟台莱山区公司大学分部 由 图片 签收 // :: 到达:山东烟台莱山区公司大学分部 指定:王师傅() 派送 // :: 到达:山东烟台莱山区公司大学分部 上级站点:山东烟台莱山区公司 发往: // :: 到达:山东烟台分拨中心 发往:山东烟台莱山区公司 // :: 到达:山东烟台分拨中心 上级站点:山东济南分拨中心 // :: 到达:山东济南分拨中心 发往:山东烟台分拨中心 // :: 到达:山东济南分拨中心 上级站点:江西南昌分拨中心 // :: 到达:江西南昌分拨中心 发往:山东济南分拨中心 // :: 到达:江西南昌分拨中心 // :: 到达:江西南昌青山湖区罗家集公司 已收件
C#快递跟踪(基于快递100深度定制)的更多相关文章
- 网易云基于 Kubernetes 的深度定制化实践
本文由 网易云发布. 2017 年,Kubernetes 超越 Mesos 和 Docker Swarm成为最受欢迎的容器编排技术.网易云从 2015 下半年开始向 Kubernetes 社区贡献代 ...
- solr特点三: 基于Solr实现排序定制化参考
排序实现有N种形式,最低成本.最快响应时间是目标 一份索引,支持N种排序策略并且在线互不干扰是要考虑的每一种实现,处理的场景是不同的,不要千篇一律 020排序,从索引到效果,有不少坑,这篇文章没有细说 ...
- 语义分割:基于openCV和深度学习(二)
语义分割:基于openCV和深度学习(二) Semantic segmentation in images with OpenCV 开始吧-打开segment.py归档并插入以下代码: Semanti ...
- 从Theano到Lasagne:基于Python的深度学习的框架和库
从Theano到Lasagne:基于Python的深度学习的框架和库 摘要:最近,深度神经网络以“Deep Dreams”形式在网站中如雨后春笋般出现,或是像谷歌研究原创论文中描述的那样:Incept ...
- (转) 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-01-FAQ
特别棒的一篇文章,仍不住转一下,留着以后需要时阅读 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-01-FAQ
- 基于网络的服装定制MTM系统研究 - 硕士论文 - 道客巴巴
国内的mtm系统_百度搜索 基于网络的服装定制MTM系统研究 - 硕士论文 - 道客巴巴 PDF文档(共76页) - 下载需1800积分 天津工业大学 硕士学位论文基于网络的服装定制MTM系统研究 姓 ...
- 基于TensorFlow的深度学习系列教程 2——常量Constant
前面介绍过了Tensorflow的基本概念,比如如何使用tensorboard查看计算图.本篇则着重介绍和整理下Constant相关的内容. 基于TensorFlow的深度学习系列教程 1--Hell ...
- 基于 Keras 用深度学习预测时间序列
目录 基于 Keras 用深度学习预测时间序列 问题描述 多层感知机回归 多层感知机回归结合"窗口法" 改进方向 扩展阅读 本文主要参考了 Jason Brownlee 的博文 T ...
- 基于pythpn的深度学习 - 记录
[基于pythpn的深度学习] 环境: windows/linux-ubuntu Tensorflow (基于anaconda) *安装 (python3.5以上不支持) ...
随机推荐
- 【Bible for kids】 儿童圣经 App
[Bible for kids] 儿童圣经App 除了<The Bible>这个由YouVersion团队开发的全球下载量和安装数目第一的圣经类.安装量已逾1亿8千万的App之外,YouV ...
- 【Android进阶】SlidingMenu实现侧滑栏效果的实现
public class MainActivity extends Activity { @Override protected void onCreate(final Bundle savedIns ...
- Java中关于OOM的场景及解决方法(转)
http://developer.51cto.com/art/201112/305696.htm 1.OOM for Heap=>例如:java.lang.OutOfMemoryError: J ...
- ZOJ1463:Brackets Sequence(间隙DP)
Let us define a regular brackets sequence in the following way: 1. Empty sequence is a regular seque ...
- 采用curl库
Windows通过使用curl库: 到http://curl.haxx.se/下了个curl的源代码下来,源代码是用VC6编译的,我在VS2005下又一次进行编译.竟然仅仅有一个警告. cUrl的实现 ...
- 跨域 Iframe 通信解决方案(兼容 IE 系列浏览器。)
实现思路: 1.postMessage(IE8+, Firefox 3.1+, Opera 9+, Safari, and Chrome) 2.利用window.navigator共享信息,使支持IE ...
- 用于主题检测的临时日志(18506589-369d-4505-a204-3678db17eae5 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)
这是一个未删除的临时日志.请手动删除它.(252f1b1e-5ce3-42a8-95da-bc0acbd4f637 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)
- DeviceIoControl的使用说明
应用程序和驱动程序的通信过程是:应用程序使用CreateFile函数打开设备,然后用DeviceIoControl与驱动程序进行通信,包含读和写两种操作.还能够用ReadFile读数据用WriteFi ...
- linux+win7双系统重装win7修复grub的办法(转)
本人是debian+win7的双系统, 下面介绍下重装win7的整个过程以及遇到的一些小问题,在查阅相关博客和朋友的帮助下成功修复, 记录下以便以后有不时之需, 也希望能帮助到遇到同样问题的朋友! 首 ...
- 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 ...