參考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
}