美文网首页
服务器端请求快递100接口返回301

服务器端请求快递100接口返回301

作者: 前端老邹_伯通 | 来源:发表于2021-04-24 19:49 被阅读0次

    正常查询快递100步骤:
    1.根据单号 查询所属快递公司 -- 问题出在此步骤
    2.再根据 单号+快递公司编号 查询 快递实时情况

    问题描述:

    1.第一步:根据单号 查询所属快递公司 接口如下:

    • 提供测试单号:1106975712662
    const url1 = 'https://www.kuaidi100.com/autonumber/autoComNum?resultv2=1&text=单号'
    
    • 预期返回结果:


      正常返回结果
    • 问题返回结果:


      问题返回结果
    • 但是用浏览器可以正常得到结果:


      用浏览器可以正常得到结果

    问题分析:快递100接口内部判断了 请求头的 user-agent,如果不是浏览器发的 请求,就不查询,并返回301(估计是为了促进收费接口的销量)

    解决方案:伪装成浏览器请求

    • 为请求头 添加 user-agent
    • 代码演示:
    // 导入 request 模块
    const request = require('request')
    
    // 自动匹配运单号所属的物流公司
    function findKuaiDiCom(orderno) {
      // 1.准备 查询快递公司的 url地址,将 快递单号 拼接到 url中
      const url = `https://www.kuaidi100.com/autonumber/autoComNum?resultv2=1&text=${orderno}`
      return new Promise(function (resolve, reject) {
        // 准备请求报文参数对象
        const options = {
          url: url,
          // 需要伪装 成浏览器 发送请求,否则 快递接口 会报错 301
          headers: {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
          }
        };
        // 在 服务器端 ,通过http协议 发送请求,给 目标 地址
        request(options, (err, response, body) => {
          if (err) return reject({ status: 500, msg: err.message })
          body = JSON.parse(body)
          if (body.auto.length <= 0) return reject({ status: 501, msg: '无对应的物流公司' })
          resolve({ status: 200, msg: body.auto[0], comCode: body.auto[0].comCode })
        })
      })
    }
    

    第二步,根据单号和快递公司查询 物流信息

    • 接口如下:
    const url2 ="https://www.kuaidi100.com/query?type=ems&postid=1106975712662&temp=0.2595247267684455"
    
    • 返回结果:


      image.png
    • 代码演示2

    // 根据 单号 查询 快递进度 接口
    async function getLogisticsInfo(req, res) {
      // result = { status: 200, msg: body.auto[0], comCode: body.auto[0].comCode }
      // 1.获取快递单号
      const kuaiDiNo = req.params.orderno
      // 2.根据 快递单号 查询 快递公司信息
      const result = await findKuaiDiCom(kuaiDiNo)
    
      if (result.status !== 200) {
        return {
          meta: {
            status: 500,
            message: '获取物流信息失败!'
          }
        }
      }
    
      const dataUrl = `https://www.kuaidi100.com/query?type=${result.comCode}&postid=${req.params.orderno}&temp=` + Math.random()
      console.log('物流二次请求:', dataUrl)
      request(dataUrl, (err, response, body) => {
        if (err) {
          return res.send({
            meta: {
              status: 501,
              message: '获取物流信息失败!'
            }
          })
        }
        // 获取物流信息成功
        return res.send({
          meta: {
            status: 200,
            message: '获取物流信息成功!'
          },
          data: (JSON.parse(body)).data
        })
      })
    }
    

    相关文章

      网友评论

          本文标题:服务器端请求快递100接口返回301

          本文链接:https://www.haomeiwen.com/subject/psplrltx.html