文档章节

菜鸟裹裹快递查询接口调用

余诺
 余诺
发布于 08/19 18:01
字数 1237
阅读 1411
收藏 0

声明:本文所有的内容只作学习使用。

菜鸟裹裹是阿里巴巴旗下菜鸟网络的产品,可用于查询淘宝的快递单号,除了快递状态、进程,还包含了淘宝发货的流程。最近因一个产品需求,需要同步淘宝的物流信息,故研究下如果调用接口来自动获取。

研究思路

  1. 菜鸟裹裹官网,输入快递单号查询,示例:491772628733,查询前打开浏览器调试窗口
  2. 观察NetWork窗口,过滤XHR,发现发送了两个请求,观察response,第一个ret为:"FAIL_SYS_ILLEGAL_ACCESS::非法请求",第二个调用成功
  3. 对比两个请求的request参数,只是少了一个c值,细心的话会发现第一个的response中返回结果也包含了c
  4. 查询接口包含12个参数,为了调用需要弄清楚各个参数的含义以及生成方式

代码跟进

dom元素及事件

网页的按钮触发就意味着按钮点击事件触发,查询按钮的dom为

  <span id="J_SearchBtn" class="search-btn" data-spm-anchor-id="a2d5h.11386884.0.i1"></span>

其中id为J_SearchBtn,查看元素的Event Listeners,根据当中的click事件可知注册的源代码位置

$("#J_SearchBtn").on("click", function() {
    if (!$(".search-container").hasClass("loading")) {
        var o = $.trim($("#J_SearchInput").val());
        if ("" === o)
            return;
        e._handleSearch(o)
    }
})

调用链路

继续跟进代码调用,可发现调用链路为

  1. _handleSearch
  2. _requestPackage
  3. lib.mtop.request
  4. n.prototype.request
  5. c.__processRequestMethod, c.__processToken, c.__processRequestUrl, c.__processRequest
  6. __getTokenFromCookie, __requestJSON

代码在主要在https://g.alicdn.com/mtb/lib-mtop/2.4.2/mtop.js文件中

// 函数_requestPackage,从这可以得到api、AntiCreep、v、data、timeout、dataType这6个参数
lib.mtop.request({
    api: i.queryLogisticPackageByMailNo,
    AntiCreep: !0,
    v: "1.0",
    data: {
      mailNo: e
    },
    timeout: 5e3,
    type: "GET",
    dataType: "json",
    isSec: 0,
    ecode: 0
}, o, r)

// 函数__processRequestUrl,从这可以得到jsv、appKey、t、sign这4个参数
var f = "//" + (d.prefix ? d.prefix + "." : "") + (d.subDomain ? d.subDomain + "." : "") + d.mainDomain + "/h5/" + c.api.toLowerCase() + "/" + c.v.toLowerCase() + "/"
  , g = c.appKey || ("waptest" === d.subDomain ? "4272" : "12574478")
  , i = (new Date).getTime()
  , j = h(d.token + "&" + i + "&" + g + "&" + c.data)
  , k = {
    jsv: x,
    appKey: g,
    t: i,
    sign: j
}

// 函数__processRequestMethod,从这可以得到参数type
var b = this.params
  , c = this.options;
"get" === b.type && "jsonp" === b.dataType ? c.getJSONP = !0 : "get" === b.type && "originaljsonp" === b.dataType ? c.getOriginalJSONP = !0 : "get" === b.type && "json" === b.dataType ? c.getJSON = !0 : "post" === b.type && (c.postJSON = !0),
a()

// 函数n.prototype.__requestJSON,可以得到参数c,实际是cookie中读取_m_h5_c值
h.CDR && j(y) && (h.querystring.c = decodeURIComponent(j(y))),
// 函数__getTokenFromCookie,其中y为_m_h5_c,逻辑就是从cookie中读取_m_h5_c值,字符串分别使用';'和'_'拆分两次,得到第一段
var a = this.options;
return a.CDR && j(y) ? a.token = j(y).split(";")[0] : a.token = a.token || j(z),
a.token && (a.token = a.token.split("_")[0]),
o.resolve()

cookie中_m_h5_c值怎么设置的,cookie的设置有两种方式 1. http请求的的response通过Set-Cookie来设置 2. 通过JS的document.cookie来设置 通过观察所有的http请求,当中并没有该cookie值设置,所以可以确定是通过JS设置的

关键参数

参数中的sign值是经过加密算法得到的,因为已经经过压缩较难看出是什么算法,只能猜测尝试,长度32位,猜想md5算法

常用加密算法加密结果分析:

|算法|加密结果| | ------ | ------ | |MD5|32位| |SHA1|40位| |SHA224|56位| |SHA256|64位| |AES,DES|结尾为=|

  // 加密前
  6e16c205e17e519707aae3e0938bde68&1534671229873&12574478&{"mailNo":"491772628733"}

  // 加密后
  7b3a2b38d314ae5d619ceaf0ab55eeab

浏览器模拟

至此接口调用所需的12个参数值来源及规则就都知道了,按照规则拼接好接口调用,却发现依旧返回错误

  [ 'FAIL_SYS_TOKEN_EMPTY::令牌为空' ]

既然是模拟浏览器行为,服务器端可能性会校验Referer、Origin等值,查看浏览器的请求中,也确实包含,所以将http请求的Header修改,设置上这两个值。经验证只需要添加Origin即可。

其他猜想

  1. cookie值中的第三段与当前时间相差2小时30分钟,应该是该cookie在服务器的失效时间
  2. 服务器端针对cookie、sign、t、appKey四个参数,会再进行加密校验,并通过时间来确定是否已经过期

完整demo代码-nodejs版本

const axios = require('axios')
const crypto = require('crypto')

function getSign(token, now, appKey, data) {
  const md5 = crypto.createHash('md5')
  const signStr = `${token}&${now}&${appKey}&${data}`
  md5.update(signStr)
  return md5.digest('hex')
}

// cookie默认值,随便填一个即可
async function queryLogistic(mailNo, cookie = '078c9a3abffad4fc5c0dba2509eb19a0_1534611715157;5ffe99dead01566b71a5107d653cfccb') {
  const now = Date.now()
  const appKey = '12574478'
  const mailData = JSON.stringify({ mailNo })
  const token = cookie.split('_')[0]
  const sign = getSign(token, now, appKey, mailData)

  const { data } = await axios({
    url: 'https://h5api.m.taobao.com/h5/mtop.cnwireless.cnlogisticdetailservice.wapquerylogisticpackagebymailno/1.0/',
    headers: {
      Origin: 'https://www.guoguo-app.com'
    },
    params: {
      jsv: '2.4.2',
      appKey,
      t: now,
      sign,
      api: 'mtop.cnwireless.CNLogisticDetailService.wapqueryLogisticPackageByMailNo',
      AntiCreep: true,
      v: 1.0,
      timeout: 5000,
      type: 'originaljson',
      dataType: 'json',
      c: cookie,
      data: mailData,
    }
  })
  return data
}

(async() => {
  const {c, data, ret} = await queryLogistic('491772628733')
  // 如果返回c值,则需要重新使用返回的cookie值发送请求
  if (c) {
    const resp = await queryLogistic('491772628733', c)
    console.info(resp)
  } else {
    console.info(data)
  }
})()

© 著作权归作者所有

共有 人打赏支持
上一篇: RTP,RTCP,RTSP
下一篇: 排序算法演示
余诺
粉丝 5
博文 14
码字总数 7617
作品 0
杭州
程序员
私信 提问
加载中

评论(4)

余诺
余诺

引用来自“rucn”的评论

请问mailNo 是如何得到的呢,是分析其他参数么
mailNo就是输入的快递单号,参数使用可以看lib.mtop.request这个地方
rucn
rucn
请问mailNo 是如何得到的呢,是分析其他参数么
余诺
余诺

引用来自“lmsc”的评论

哎。。。以为找了个免费的接口。经过实测发现这个接口不能频繁调用。否则很容易出现 RGV587_ERROR::SM 错误(菜鸟果果官网的查询按钮狂点也会出现。然后不能继续查询,会弹出淘宝登陆界面。)目测是ip被拉进黑名单了,想继续用就得设置代理ip。如果是后端服务器调用。很容易被进黑名单,这个勉强可以做在c端,但是也经不起查询狂魔的点击。😔
发现是最近的开始频率限制更严格了,20s一次都会限制,可能阿里开始为双11准备了。测试猜测应该是固定时间窗口内防刺次数限制,可以试试平均30~40s一次
l
lmsc
哎。。。以为找了个免费的接口。经过实测发现这个接口不能频繁调用。否则很容易出现 RGV587_ERROR::SM 错误(菜鸟果果官网的查询按钮狂点也会出现。然后不能继续查询,会弹出淘宝登陆界面。)目测是ip被拉进黑名单了,想继续用就得设置代理ip。如果是后端服务器调用。很容易被进黑名单,这个勉强可以做在c端,但是也经不起查询狂魔的点击。😔
菜鸟推出“躺收”系统,躺着也能收到包裹!

“嗯,我不在家,把快递放小区门口的传达室吧。” “我这几天出差了,你过三天再把快递送过来。” 这种场景以后将不再出现了。菜鸟宣布在4月1日正式推出“躺收”系统——顾名思义,真正实现躺...

技术小能手
04/02
0
0
小米发力AI场景下的“快应用”,投百亿资源扶持开发者

近日,备受瞩目的2018 MIDC小米AIoT第二届开发者大会在京召开,雷军宣布AI+loT是小米的核心战略,小米将和合作伙伴一起打造AI+loT的美好明天。另外,大会还宣布了小米与宜家达成全球战略合作...

AI科技大本营
12/05
0
0
今日科技联播:阿里“文案妹”逗比搞怪样样在行,每秒20000广告文案不是吹牛

阿里“文案妹”每秒可撰20000广告文案,再不努力AI都来抢饭碗了......口红也能救命?韩国发明形状如口红的自卫设备“My Hero”,名如其用,关键时刻保护你,MIT猎豹机器人又出第三代啦!上坡...

柚子菌
07/06
0
0
美团旗下生鲜超市小象生鲜落地北京;英国最大医院之一 UCLH 将采用 AI 提升医疗服务效率 | AI 掘金晚报

美团旗下生鲜超市小象生鲜落地北京 可人脸识别支付 2018年5月25日,美团旗下全新升级的生鲜超市小象生鲜在北京方庄时代life广场正式开业。在此次亮相的小象生鲜方庄店中,包括自助支付、智能...

李雨晨
05/25
0
0
专家解读:顺丰和菜鸟开战核心是大数据

菜鸟网络与顺丰速运互相关闭互通数据接口事件正在迅速发酵。业内人士指出,事情闹得这么大,其本质是大数据的争夺。 1日下午,菜鸟网络方面发消息称,合作伙伴顺丰突然关闭了物流数据接口,菜...

玄学酱
03/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

二十分钟教你如何将区块链应用与函数计算相结合

前言 本篇文章适合对区块链应用感兴趣或是想要通过函数计算服务进一步开发区块链应用的新人。本文将结合阿里云区块链服务、阿里云函数计算服务、阿里云日志服务 以及社区应用 Marbles,手把手...

阿里云官方博客
4分钟前
0
0
Double数相加后结果不准确

在我们进行两个double运算时,例如:2..0-1.1 不是想象的输出0.9,而是0.89999999999999999。其主要原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确的表示分数1/10。这就好像十...

嘴角轻扬30
12分钟前
0
0
去除移动端点击效果

移动端点击时,会有一个类似active的短暂背景淡出效果,去除该效果可使用 -webkit-tap-highlight-color: rgba(255, 0, 0, 0);

originDu
13分钟前
0
0
腾讯云与MariaDB 基金会签署战略合作,共建全球开源生态圈

本文由云+社区发表 腾讯云日前与MariaDB基金会正式签署战略合作协议,2019年,腾讯云将继续以白金会员身份为基金会的发展提供强有力的资源支持,与MariaDB全球用户和开发者一道,共建开放共赢...

腾讯云加社区
18分钟前
1
0
Kotlin的SAM(Single Abstract Method)

今天有人在群里问kotlin支持SAM的问题,其实kotlin不支持SAM,因为人家支持FP(function programing) package reactinterface Test { fun print()}class TestInterface(var...

SuShine
19分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部