参考ui效果:
https://www.kuaidi100.com/?from=openv
思路:
调用快递100的接口,可以免费查询快递跟踪记录了...
线上请求地址 https://test.ibanana.club/kd100/auto_com_num?num=73119782411952
线上请求地址 https://test.ibanana.club/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...")
postid := ctx.Query("num") //单号
kdtype := ctx.Query("comCode") //快递类型
temp := strconv.Itoa(int(time.Now().UnixNano())) //时间戳
//phone := "" //手机号,默认为空
url := fmt.Sprintf("https://www.kuaidi100.com/query?postid=%s&type=%s&temp=%s", postid, kdtype, temp)
//fmt.Println("url:", url)
resp := SendtGet(url)
respData := gin.H{}
if err := json.Unmarshal([]byte(resp), &respData); err != nil {
fmt.Println("Unmarshal respData fail,", err)
httpext.Error(ctx, e.ERROR)
return
}
if respData["status"] != "200" {
httpext.ErrorExt(ctx, e.INVALID_PARAMS, respData)
return
}
httpext.SuccessExt(ctx, respData)
}
// 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)
}
// Get ... 发送请求 ...
// url: 请求地址
// response: 请求返回的内容
func SendtGet(url string) string {
// 超时时间:5秒
client := &http.Client{Timeout: 5 * time.Second}
resp, err := client.Get(url)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var buffer [512]byte
result := bytes.NewBuffer(nil)
for {
n, err := resp.Body.Read(buffer[0:])
result.Write(buffer[0:n])
if err != nil && err == io.EOF {
break
} else if err != nil {
panic(err)
}
}
return result.String()
}
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": "其它快递",
}