拿獲取作品列表為例
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 **請備註演算法交流