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以上不支持) ...
随机推荐
- RH133读书笔记(2)-Lab 2 Working with packages
Lab 2 Working with packages Goal: To gain working experience with package management System Setup: A ...
- [LeetCode62]Unique Paths
题目: A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). ...
- JDBC调用存储过程
一. JDBC调用存储过程 (1)使用存储过程SQL编写的程序代码,等一段语句和控制流语句.在创建时被编译成机器代码和存储在数据库中的client转让. 存储过程具有以下优势: 1.所生成的机器代码被 ...
- 华为OJ:查找字符的第一个字符串只出现一次
您可以使代码有点写得真好,不要直接写双循环,如果,是可能的写函数调用,非常高的可重用性. import java.util.Scanner; public class findOnlyOnceChar ...
- Adb shell得到root才干
于Adb shell我们希望用一些文件系统文件夹时,经常有在没有痛苦Root才干,系统会提示su: Permission Denied. su不是每个手机有一个.能不能在这里下载: http://do ...
- 一切从编辑器说起:web前端代码编辑器
俗话说:工欲善其事,必先利其器. 工欲善其事必先利其器.谓工匠想要使他的工作做好,一定要先让工具锋利.比喻要做好一件事,准备工作非常重要. 前端写代码也是一样,需要一个好的适合自己的代码编辑器. 我想 ...
- ramoops具体失败原因来解释驱动寄存器
正在使用linux的ramoops驱动器模块,当编译完成加载.查找驱动程序加载失败.显然,直接用内核代码,为什么会出现这种情况? 第一眼ramoops初始化代码: 180 static int __i ...
- Play Modules Morphia 1.2.9a 之 Aggregation and Group aggregation
聚合 和 分组聚合: PlayMorphia 它提供了基于开发人员models的友好接口 设想你定义了一个model.class Sales: @Entity public class Sales e ...
- 编hadoop-1.X源代码
满足需要在不久的将来windows调试Linux下一个hadoop问题,Linux检查时需要的文件权限.和windows在没有必要,因此,有必要修改hadoop源代码,再次编译,过程例如以下: (1) ...
- JSP简明教程(四):EL表达式语言、JavaBean、Cookie、Session
EL表达式语言 EL这是Expression Language.的目的是为了简化JSP句法.来看几个例子来清除. ${test} 它会被翻译成<%=test%> ${test.name} ...