拿获取作品列表为例
http
https://cp.kuaishou.com/rest/cp/works/v2/video/pc/photo/list?__NS_sig3=xxxxxxxxxxx
搜索__NS_sig3
发现__NS_sig3是一个异步回调生成的值
js
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
生成的地方
js
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 **请备注算法交流