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以上不支持) ...
随机推荐
- 【Web探索之旅】第一部分:什么是Web?
内容简介 1.Web探索之旅:开宗明义 2.第一部分第一课:什么是Web? 3.第一部分第二课:Web,服务和云 4.第一部分第三课:Web的诞生史 Web探索之旅:开宗明义 大家好. 我们这个系列课 ...
- 这两个成员函数inline重新virtual种类
inlineType表示在编译时扩展功能,随着在函数调用的函数体而出替换函数调用:和vitual它是c++多态的必要条件,但为了表现出多态性,您将需要等到执行,要知道什么是真正的函数调用.从表面上看这 ...
- 详谈socket请求Web服务器过程(转)
最开始我们需要明白一件事情,因为这是这篇文章的前提: HTTP协议只是一个应用层协议,它底层是通过TCP进行传输数据的.因此,浏览器访问Web服务器的过程必须先有“连接建立”的发生. 而有人或许会问: ...
- 学习vi和vim编辑(3):一个简单的文本编辑器(2)
然后文章,继续评论vi编辑简单的文本编辑命令. 本文主要是删除的文字.复制,运动命令. 删除文本: 正如上一篇文章中讲过的,对于删除命令("d")也具有"(command ...
- Nova创建虚拟机的底层代码分析
作为个人学习笔记分享.有不论什么问题欢迎交流! 在openstack中创建虚拟机的底层实现是nova使用了libvirt,代码在nova/virt/libvirt/driver.py. #image_ ...
- iOS发展- 文件共享(使用iTunes导入文件, 并显示现有文件)
到今天实现功能, 由iTunes导入文件的应用程序, 并在此文档进行编辑的应用. 就像我们平时经常使用 PDF阅读这样的事情, 们能够自己导入我们的电子书. 源代码下载:https://github. ...
- ecshop广告调用方法
在简单地概括ecshop广告调用该方法,已发表在博客上,在这里,我们总结了以下 :就是官方默认的方法.先加入广告位,然后加入模板的广告位区域,再在将两者相应上. 1.后台 > 广告管理 > ...
- 对于超大型SQL SERVER数据库执行DBCC操作
原文:对于超大型SQL SERVER数据库执行DBCC操作 对于数据库维护,主要使用DBCC CHECKDB来实现,以下是对大型数据库的使用说明,小型数据库一般直接使用就可以了: 1.2008(200 ...
- SQL开发中容易忽视的一些小地方(六)
原文:SQL开发中容易忽视的一些小地方(六) 本文主旨:条件列上的索引对数据库delete操作的影响. 事由:今天在博客园北京俱乐部MSN群中和网友讨论了关于索引对delete的影响问题,事后感觉非常 ...
- FPGA图案--数字表示(代码+波形)
在数字逻辑系统,仅仅存在高低.所以用它只代表一个整数数字.并且有3代表性的种类.这是:原码表示(符号加绝对值值).反码表示(加-minus标志)而补码(符号加补).这三个在FPGA中都有着广泛的应用. ...