免费查快递跟踪信息Golang实现

参考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":          "其它快递",
}

你可能感兴趣的:(免费查快递跟踪信息Golang实现)