本文主要介绍快递跟踪的相关信息。如根据快递单号预测所属快递公司,判断快递是否已被签收,以及改良官方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深度定制)的更多相关文章

  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. 文件翻译002片:Process Monitor帮助文档(Part 2)

    [筛选亮点] Process Monitor提供了一些方式来配置筛选器和高亮显示.         筛选器的包括与排除 您能够在筛选器中指定事件的属性,这样就能够令Process Monitor仅显示 ...

  2. 【rman,1】经典案例增量备份

    一.备份策略: 1.星期天晚上      -level 0 backup performed(全备份) 2.星期一晚上      -level 2 backup performed 3.星期二晚上   ...

  3. java提高篇(五)-----使用序列化实现对象的拷贝

          我们知道在Java中存在这个接口Cloneable,实现该接口的类都会具备被拷贝的能力,同时拷贝是在内存中进行,在性能方面比我们直接通过new生成对象来的快,特别是在大对象的生成上,使得性 ...

  4. hdu 4876 ZCC loves cards(暴力)

    题目链接:hdu 4876 ZCC loves cards 题目大意:给出n,k,l,表示有n张牌,每张牌有值.选取当中k张排列成圈,然后在该圈上进行游戏,每次选取m(1≤m≤k)张连续的牌,取牌上值 ...

  5. Deploy Oracle 10.2.0.5 on Red Hat Enterprise Linux 6.4

    一.Linux系统安装和配置 1.安装系统时选Desktop 2.设置eth0网卡为静态IP,加入子网掩码,网关,DNS.并配置自己主动启动 3.改动/etc/hosts.加入主机名和相应IP 4.禁 ...

  6. http协议和web本质(转)

    当你在浏览器地址栏敲入“http://www.cnblogs.com/”,然后猛按回车,呈现在你面前的,将是博客园的首页了(这真是废话,你会认为这是理所当然的).作为一个开发者,尤其是web开发人员, ...

  7. StackExchange.Redis Client

    StackExchange.Redis Client 这期我们来看StackExchange.Redis,这是redis 的.net客户端之一.Redis是一个开源的内存数据存储,可以用来做数据库,缓 ...

  8. java中的移位运算符:<<,>>,>>>总结(转)

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >& ...

  9. SQLHlper意识

    经过学习,通过线敲登录的三个例子,敲四行CRUD样品,因此,访问数据库多次,在这些链接库.打开都一样.只是不同的操作将针对不同的表进行.始学习面向对象的思想.当让要对这些不变的要内容要进行打包,提高代 ...

  10. href=&quot;javascript:void(0);&quot;与#差异

    将<a>标签设置为空链接有两种方式.第一个是href="#",第二个是href="javascript:void(0);". 两种方式都设置了标签为 ...