拿获取作品列表为例

https://cp.kuaishou.com/rest/cp/works/v2/video/pc/photo/list?__NS_sig3=xxxxxxxxxxx

搜索__NS_sig3

发现__NS_sig3是一个异步回调生成的值

s().call("$encode", [i, {suc: function(e) {t(`__NS_sig3=${e}`)},err: function(t) {e(t)}}])

具体逻辑就是:

  • s().call("$encode", [...])
    : 这个部分表示调用对象
    s()
    上的
    call
    方法,并传递
    $encode
    作为第一个参数。这里的
    s()
    可能是某个对象或函数的调用,它返回了一个对象,该对象具有
    call
    方法。不明白
    call
    方法的可以参考这篇文章https://juejin.cn/post/7158686309211439141
  • "$encode"
    : 这是传递给
    call
    方法的第一个参数
  • [i, { ... }]
    : 这是传递给
    call
    方法的第二个参数,是一个数组。数组的第一个元素
    i
    就是要加密的原数据。第二个元素是一个包含
    suc

    err
    回调函数的对象。

打断点到
s()...
这里,看看
i
是什么

看起来
i
也是一个加密的值,有点像md5加密之后的样子,往上找
i
生成的地方

const i = m(t, e, n);

其中
t
是json字符串,
e
是cookies中的kuaishou.web.cp.api_ph的值,
n
是一个空对象

进到
m
函数里面发现
e
被JSON序列化之后有被加到了
d(i)
后面,最终调用
a()(s)
被加密出来。看到这里就可以愉快的扣js了,哪里没有补哪里。就不过多赘述了。

搞定
i
之后就可继续往下走了,既然__NS_sig3是通过
s().call()
生成的,自然我们就要搞清楚
s()
是在哪里定义的

找到s的定义
s = n.n(o)
再找到o的定义
o = n(7606)
,此时我们发现7606这个东西好眼熟,没错就是我们的老朋友webpack,接下来就开始扣webpack,如何扣webpack的步骤这里就不赘述了,网上的教程一抓一大把。

最后验证一下结果

Nice ,接下来放到python里面跑一下看看是否能成功

  • 先来一个错误的sig看看什么样子

  • 再试试我们自己生成的sig的结果

完美运行~

该部分算法和app中的某部分雷同

**本文仅供学习参考,如有问题询问或有需要可留言,或加q 1018866051 **请备注算法交流

标签: none

添加新评论