gin框架对接快递100 查询快递跟踪记录 Golang实现快递查询
参考ui效果:
https://www.kuaidi100.com/?from=openv
gin框架:
请求地址 http://localhost:8822/kd100/auto_com_num?num=73119782411952
请求地址 http://localhost:8822/kd100/query_num_detail?num=73119782411952&comCode=zhongtong
//路由
router.GET("/kd100/auto_com_num", controller.AutoComNum) //获取快递公司类型
router.GET("/kd100/query_num_detail", controller.QueryNumDetail) //获取快递跟踪信息
//获取快递公司类型
func AutoComNum(ctx *gin.Context) {
//fmt.Println("AutoComNum...")
text := ctx.Query("num") //单号
url := "https://www.kuaidi100.com/autonumber/autoComNum?resultv2=1&text=" + text
paramData := gin.H{}
headerData := make(map[string]string, 1)
headerData["User-Agent"] = "Mozilla/5.0 (X11; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0"
resp := SendPostWithHeard(url, paramData, headerData)
type resAuto struct {
ComCode string `json:"comCode"`
LengthPre int `json:"lengthPre"`
NoCount int `json:"noCount"`
NoPre string `json:"noPre"`
Name string `json:"name"`
}
type respData struct {
Num string `json:"num"`
ComCode string `json:"comCode"`
Auto []*resAuto `json:"auto"`
}
var resdata *respData
if err := json.Unmarshal([]byte(resp), &resdata); err != nil {
fmt.Println("Unmarshal resdata fail,", err)
httpext.Error(ctx, e.ERROR)
return
}
for _, v := range resdata.Auto {
kdName, ok := KD100Flags[v.ComCode]
if ok {
v.Name = kdName
} else {
v.Name = "未知快递"
}
}
httpext.SuccessExt(ctx, resdata)
}
//获取快递跟踪信息
func QueryNumDetail(ctx *gin.Context) {
//fmt.Println("AutoComNum...")
num := ctx.Query("num") //单号
kdtype := ctx.Query("comCode") //快递类型
key := "XXXXXXXX" //客户授权key
customer := "XXXXXXXXXXXXXXXXXXXXXXX" //查询公司编号
posturl := "http://poll.kuaidi100.com/poll/query.do" //实时查询请求地址
paramData := make(map[string]string)
paramData["com"] = kdtype //快递公司编码
paramData["num"] = num //快递单号
paramDataSlice, _ := json.Marshal(paramData)
paramjson := string(paramDataSlice)
sign := strings.ToUpper(crypto.GetMd5String(paramjson + key + customer))
fmt.Println("p=====>", customer)
//POST请求需要三个参数,分别为customer(CustomerId)和sign(签名)和param(参数)
postRes, postErr := http.PostForm(posturl, url.Values{"customer": {customer}, "sign": {sign}, "param": {paramjson}})
if postErr != nil {
fmt.Println("查询失败" + postErr.Error())
httpext.ErrorExt(ctx, e.ERROR, "查询失败"+postErr.Error())
return
}
postBody, err := ioutil.ReadAll(postRes.Body)
if err != nil {
fmt.Println("查询失败,请至快递公司官网自行查询" + err.Error())
httpext.ErrorExt(ctx, e.ERROR, "查询失败,请至快递公司官网自行查询"+err.Error())
return
}
fmt.Println(string(postBody))
resp := make(map[string]interface{})
err = json.Unmarshal(postBody, &resp)
if err != nil {
fmt.Println("json.Unmarshal error", err.Error())
httpext.ErrorExt(ctx, e.ERROR, "查询失败,请至快递公司官网自行查询"+err.Error())
return
}
httpext.SuccessExt(ctx, resp)
}
// SendPostWithHeard ... 发送POST请求 ...
// url: 请求地址
// data: POST请求提交的数据
// hearderParam 设置header头信息
// contentType: 请求体格式,如:json
// content: 请求放回的内容
//func SendPostWithHeard(url string, data interface{}, hearderParam map[string]string, contentType string) string {
func SendPostWithHeard(url string, data interface{}, hearderParam map[string]string) string {
bytesData, err := json.Marshal(data)
if err != nil {
fmt.Println(err.Error())
return err.Error()
}
reader := bytes.NewReader(bytesData)
request, err := http.NewRequest("POST", url, reader)
if err != nil {
fmt.Println(err.Error())
return err.Error()
}
//增加header选项 添加请求头
if len(hearderParam) > 0 {
for k, v := range hearderParam {
request.Header.Set(k, v)
}
}
//request.Header.Set("Content-Type", contentTypeParam[contentType])
client := http.Client{}
resp, err := client.Do(request)
if err != nil {
fmt.Println(err.Error())
return err.Error()
}
respBytes, err := ioutil.ReadAll(resp.Body)
fmt.Println(1111111)
fmt.Println(respBytes)
if err != nil {
fmt.Println(err.Error())
return err.Error()
}
return string(respBytes)
}
var KD100Flags = map[string]string{
"ane66": "安能快递",
"debangwuliu": "德邦物流",
"debangkuaidi": "德邦快递",
"ems": "EMS",
"guotongkuaidi": "国通快递",
"huitongkuaidi": "百世快递",
"jd": "京东物流",
"kuayue": "跨越速运",
"pjbest": "品骏快递",
"shentong": "申通快递",
"shunfeng": "顺丰速运",
"suer": "速尔快递",
"xinfengwuliu": "信丰物流",
"youshuwuliu": "优速物流",
"youzhengguonei": "邮政快递包裹",
"yuantong": "圆通速递",
"yuantongguoji": "圆通国际",
"yunda": "韵达快递",
"zhaijisong": "宅急送",
"zhongtong": "中通快递",
"ewe": "EWE全球快递",
"quanyikuaidi": "全一快递",
"tiantian": "天天快递",
"sxjdfreight": "顺心捷达",
"dhl": "DHL-中国件",
"tnt": "TNT",
"other": "其它快递",
}
获取快递公司类型 返回参:
{
"data": {
"num": "1009414746833",
"comCode": "",
"auto": [
{
"comCode": "ems",
"lengthPre": 13,
"noCount": 32,
"noPre": "100941",
"name": "EMS"
},
{
"comCode": "youzhengguonei",
"lengthPre": 13,
"noCount": 1,
"noPre": "100941",
"name": "邮政快递包裹"
}
]
},
"errmsg": "ok",
"errno": 200
}
获取快递跟踪信息 反参
{
"data": {
"com": "zhongtong",
"condition": "00",
"data": [
{
"context": "订单已由【菜鸟驿站】代收,感谢您在京东购物,欢迎您再次光临!",
"ftime": "2020-04-05 11:47:12",
"location": "",
"time": "2020-04-05 11:47:12"
},
{
"context": "配送员开始配送,请您准备收货,配送员,方辉,手机号,15807710153",
"ftime": "2020-04-05 08:15:18",
"location": "",
"time": "2020-04-05 08:15:18"
},
{
"context": "货物已分配,等待配送",
"ftime": "2020-04-05 07:48:13",
"location": "",
"time": "2020-04-05 07:48:13"
},
{
"context": "货物已到达【南宁良庆营业部】",
"ftime": "2020-04-05 07:48:12",
"location": "",
"time": "2020-04-05 07:48:12"
},
{
"context": "货物已完成分拣,离开【南宁分拨中心】",
"ftime": "2020-04-04 23:50:33",
"location": "",
"time": "2020-04-04 23:50:33"
},
{
"context": "货物已完成分拣,离开【南宁分拨中心】",
"ftime": "2020-04-04 21:46:25",
"location": "",
"time": "2020-04-04 21:46:25"
},
{
"context": "货物已到达【南宁分拨中心】",
"ftime": "2020-04-04 21:44:52",
"location": "",
"time": "2020-04-04 21:44:52"
},
{
"context": "货物已完成分拣,离开【南宁分拨中心】",
"ftime": "2020-04-04 18:51:02",
"location": "",
"time": "2020-04-04 18:51:02"
},
{
"context": "货物已交付京东物流",
"ftime": "2020-04-04 17:47:17",
"location": "",
"time": "2020-04-04 17:47:17"
}
],
"ischeck": "0",
"message": "ok",
"nu": "73119782411952",
"state": "0",
"status": "200"
},
"errmsg": "ok",
"errno": 200
}
gin框架对接快递100 查询快递跟踪记录 Golang实现快递查询的更多相关文章
- 对接京东jos遇到的坑 记录一下。方便查询
坑很多,有一些忘记了.文档乱的很,有问题可以私信我一下我看能不能想起来. 坑一.添加商品接口. {"error_response": {"code":" ...
- C#快递跟踪(基于快递100深度定制)
本文主要介绍快递跟踪的相关信息.如根据快递单号预测所属快递公司,判断快递是否已被签收,以及改良官方model后可在不用申请授权的情况下实现json,html,xml及text等多种格式以及单行多行,降 ...
- PHP最近做了物流快递查询的接口用得是快递100
最近做了物流快递查询的接口用得是快递100的,分享下心得体会 主要使用了2种接口,一个是api的 返回json xml 各种数据的 一个是返回的URL的 就是一个带结果的网址 . 1 申请 找一 ...
- 对接快递100&聚水潭API
对接快递100&聚水潭API 入我相思门,知我相思苦. 简介:对接第三方平台快递100&聚水潭API的简要总结. 1.感悟 个人感觉快递100的API更友好一些,比如有SDK可以调用: ...
- .netcore 写快递100的快递物流信息查询接口
快递100的物流信息查询接口,官方提供了一些demo;还好官方提供的代码是.netcore版本写的,不过写的有点low;根据官方提供的代码,我按照.netcore 的风格重构了代码:核心代码如下: / ...
- 快速上手微信小程序-快递100
2007 年 1 月 9 日,乔布斯在旧金山莫斯科尼会展中心发布了首款 iPhone,而在十年后的 1 月 9 日,微信小程序正式上线.张小龙以这样的形式,向乔布斯致敬. 小程序在哪里? 小程序功能模 ...
- java抓取快递100信息接口
package zeze; import java.io.IOException; import org.json.JSONArray; import org.json.JSONException; ...
- 快递100码json
{ "AOL澳通速递": "aolau", "A2U速递": "a2u", "AAE快递": &qu ...
- 在Asp.Net MVC中利用快递100接口实现订阅物流轨迹功能
前言 分享一篇关于在电商系统中同步物流轨迹到本地服务器的文章,当前方案使用了快递100做为数据来源接口,这个接口是收费的,不过提供的功能还是非常强大的,有专门的售后维护团队.也有免费的方案,类似于快递 ...
- php利用快递100接口获取物流信息
PHP使用CURL调用快递100接口查询运单信息 类代码如下: <?php/** * 快递100接口调用类 * @author 齐云海 * date: 2019/05/29 */ class E ...
随机推荐
- KingbaseES Json 系列十二:Json其他函数
KingbaseES Json 系列十二--Json其他函数(JSONB_TYPEOF,JSON_SCALAR,JSON_SERIALIZE,JSON_TYPEOF,JSON_VALUE) JSON ...
- NodeJS 实战系列:模块设计与文件分类
我们从一个最简单的需求开始,来探索我们应该从哪些方面思考模块设计,以及如何将不同的文件分类.之所以说"思考",是因为我在这篇文章里更多的是提供一类解决问题的范式,而非统一的标准答案 ...
- #第一类斯特林数,NTT#CF960G Bandit Blues
题目 给你三个正整数 \(n\),\(a\),\(b\),定义 \(A\) 为一个排列中是前缀最大值的数的个数, 定义 \(B\) 为一个排列中是后缀最大值的数的个数,求长度为 \(n\) 的排列中满 ...
- #线段树#洛谷 4588 [TJOI2018]数学计算
题目传送门 分析 由于曾经做过原题 所以就直接说了,因为每个数最多被除掉一次 所以可以用线段树维护区间乘,也就很简单了,删除就单点修改就行了 代码 #include <cstdio> #i ...
- #构造#B 连通子图
题目 给定正整数\(k\),构造一棵树,使得包含了\(1\)号点的连通子图个数恰好为\(k\). 连通子图就是点集的一个子集(可以为全集),使得该点集中任意两个点均可以经过该点集中的点相互到达. 分析 ...
- OpenHarmony支持HDMI接口声卡适配说明
高清多媒体接口(High Definition Multimedia Interface,HDMI )是一种全数字化视频和声音发送接口,可以发送未压缩的音频及视频信号.HDMI可用于机顶盒.DV ...
- C# 字符串操作指南:长度、连接、插值、特殊字符和实用方法
字符串用于存储文本.一个字符串变量包含由双引号括起的字符集合 示例: // 创建一个string类型的变量并赋予一个值 string greeting = "Hello"; 如果需 ...
- 探索生成式AI的未来:Chat与Agent的较量与融合
近年来,生成式人工智能(AI)不仅在技术界引起了广泛关注,更成为了推动多个行业革新的关键力量.这种技术之所以备受瞩目,不仅在于其独特的创造性和高效性,还在于它对未来商业模式和社会结构可能产生的深远影响 ...
- 可视化库 pygal 生成png中文乱码
解决方法:设置style,style中设置中文字体 代码如下: import pygal from pygal.style import Style import cairosvg style = S ...
- Jenkins安装插件很慢的解决方法
修改 Jenkins / update / default.json 这个文件就可以了 修改内容 1. 把 " www.google.com " 改成 " h ...