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以上不支持) ...
随机推荐
- 【课程分享】基于plusgantt的项目管理系统实战开发(Spring3+JDBC+RMI的架构、自己定义工作流)
基于plusgantt的项目管理系统实战开发(Spring3+JDBC+RMI的架构.自己定义工作流) 课程讲师:张弘 课程分类:Java 适合人群:中级 课时数量:37课时 用到技术:Spring ...
- 简单的虚拟摇杆控制移动(NGUI)
一.用NGUI创建虚拟摇杆贴图 先创建一个sprite作为背景叫做JoyStick 并添加一个BoxCollider,再创建一个sprite child作为虚拟摇杆中间的按钮,叫做button 二.通 ...
- 高榕资本宾悦:未使用的企业家Testin云测试服务类故障
高榕资本岳斌:创业者未使用Testin云測试服务属不合格 2014/10/09 · Testin · 开发人员訪谈 Testin云測与工信部等联合承办的ICT中国.2014高层论坛之移动开发人员分论坛 ...
- 【JAVA】【NIO】3、Java NIO Channel
Java NIO和流量相似,但有些差异: ·通道可读写,流仅支持单向.读或写 ·异步通道读取 ·通道读写器,他们是和Buffer交替 道的实现 下面是Java NIO中最重要的通道的实现: ·File ...
- cocospods 卡在 Analyzing dependencies
參考链接:http://www.cocoachina.com/bbs/read.php? tid=193398 关于pod stetup的详解在这里.对于初次使用CocoaPods的同学,即使你不使用 ...
- HDU2149-Public Sale
Public Sale Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- 给AspNetPager分页控件添加bootstrap样式
AspNetPager分页控件算是比较好用的一个分页控件了.想要结合bootstrap使用,官方代码入口 .pagination a[disabled]{ color: #777;cursor: no ...
- jsp、Servlet相关知识介绍(转)
1.servlet生命周期 所谓生命周期,指的是servlet容器如何创建servlet实例.分配其资源.调用其方法.并销毁其实例的整个过程. 阶段一: 实例化(就是创建servlet对象,调用构造器 ...
- 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 ...
- Cocos2d-X中间应用
(层)Laye:与球员打交道响应事件Node子类. 不同的场景,层通常包括直接在屏幕上呈现的内容.而且能够接受用户的输入事件.包括触摸,加速度计和键盘输入等. 我们须要在层中加入精灵,文本标签或者其它 ...