本文主要介绍快递跟踪的相关信息。如根据快递单号预测所属快递公司,判断快递是否已被签收,以及改良官方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. 【课程分享】基于plusgantt的项目管理系统实战开发(Spring3+JDBC+RMI的架构、自己定义工作流)

    基于plusgantt的项目管理系统实战开发(Spring3+JDBC+RMI的架构.自己定义工作流) 课程讲师:张弘 课程分类:Java 适合人群:中级 课时数量:37课时 用到技术:Spring  ...

  2. 简单的虚拟摇杆控制移动(NGUI)

    一.用NGUI创建虚拟摇杆贴图 先创建一个sprite作为背景叫做JoyStick 并添加一个BoxCollider,再创建一个sprite child作为虚拟摇杆中间的按钮,叫做button 二.通 ...

  3. 高榕资本宾悦:未使用的企业家Testin云测试服务类故障

    高榕资本岳斌:创业者未使用Testin云測试服务属不合格 2014/10/09 · Testin · 开发人员訪谈 Testin云測与工信部等联合承办的ICT中国.2014高层论坛之移动开发人员分论坛 ...

  4. 【JAVA】【NIO】3、Java NIO Channel

    Java NIO和流量相似,但有些差异: ·通道可读写,流仅支持单向.读或写 ·异步通道读取 ·通道读写器,他们是和Buffer交替 道的实现 下面是Java NIO中最重要的通道的实现: ·File ...

  5. cocospods 卡在 Analyzing dependencies

    參考链接:http://www.cocoachina.com/bbs/read.php? tid=193398 关于pod stetup的详解在这里.对于初次使用CocoaPods的同学,即使你不使用 ...

  6. HDU2149-Public Sale

    Public Sale Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  7. 给AspNetPager分页控件添加bootstrap样式

    AspNetPager分页控件算是比较好用的一个分页控件了.想要结合bootstrap使用,官方代码入口 .pagination a[disabled]{ color: #777;cursor: no ...

  8. jsp、Servlet相关知识介绍(转)

    1.servlet生命周期 所谓生命周期,指的是servlet容器如何创建servlet实例.分配其资源.调用其方法.并销毁其实例的整个过程. 阶段一: 实例化(就是创建servlet对象,调用构造器 ...

  9. Gradle sourceCompatibility has no effect to subprojects(转)

    I have Java 6 and 7 installed on my machine. Gradle uses 1.7 (checked using gradle -v). But I need t ...

  10. Cocos2d-X中间应用

    (层)Laye:与球员打交道响应事件Node子类. 不同的场景,层通常包括直接在屏幕上呈现的内容.而且能够接受用户的输入事件.包括触摸,加速度计和键盘输入等. 我们须要在层中加入精灵,文本标签或者其它 ...