q某音乐API接口分析--获取vKey和Sign
q某音樂API接口分析--獲取vKey和Sign
在q某音樂網(wǎng)站中,想要獲得一首歌曲的資源鏈接(必須要這兩個參數(shù)vKey和Sign,破解有一定的難度)
步驟一:
F12打開開發(fā)者工具,在network中點擊XHR,篩選ajxa請求(一般的數(shù)據(jù)請求都是使用ajax),這里這種數(shù)據(jù)都很簡單,沒有加密,沒有sign(簽名,口令等),不做分析
步驟二:
隨便點擊一個歌單,進入到歌單播放頁面(https://y.qq.com/portal/player.html),右邊紅色圈圈里面的是歌曲的鏈接地址,一個一個試得出可以使用的地址在req_0.data.midurlinfo[0].purl
?
將purl拼接url直接訪問可以歌曲資源:http://ws.stream.qqmusic.qq.com/C400001GV9Ix0NrZuz.m4a?guid=2849918000&vkey=D30AB7F58D1D6821C6ED837DEFF01E94DBEF70BD3FF0DD5090928E96130B93F59653E7CE4259B5244E9409FFD28745B326C8CE89FA138E2F&uin=0&fromtag=66
步驟三:
多次分析參數(shù),發(fā)現(xiàn)該請求只有兩個參數(shù)在變 sign 和 songmid,- 這個參數(shù)是個隨機值,不變也可以。(邏輯關系,我們需要這兩個參數(shù)才能得到vKey,歌曲資源鏈接是vKey和sign和歌曲songmid拼接組成,其它參數(shù)不變,如uin和guid)
步驟四:
我們再往前找,此時發(fā)現(xiàn)前面沒有一個請求返回的數(shù)據(jù)跟sign的值一樣,就說明sign不是由后端返回過來的,而是由前端js生成的。
這時我們ctrl+f進行關鍵詞查找,搜索sign(關鍵詞的選定需要根據(jù)經(jīng)驗來)
這里多次出現(xiàn)sign,說明有很大的可能性是我們要找的sign生成算法,然后打下斷點看下結(jié)果。
這時我們在控制臺輸出這個函數(shù),看一下返回的內(nèi)容。發(fā)現(xiàn)正是我們需要的sign。
這時我們只需要把這個函數(shù)對應的代碼復制下來,準備還原,控制臺輸出這個函數(shù)的代碼:
多次斷點發(fā)現(xiàn),r(f, e, c, l, t)也是返回這個值。
通過對比,發(fā)現(xiàn) sign 的位數(shù)不一樣,且生成的簽名串不一樣,這時,我們進入到加密函數(shù)(getSecuritySign())內(nèi)部,一步一步debug。
最后發(fā)現(xiàn),它其實是動態(tài)的生成加密函數(shù)名,以及一個固定的加密串和隨機函數(shù)。通過一個棧結(jié)構(gòu)存儲這些數(shù)據(jù),并進行調(diào)用。
?
最終還原的代碼如下所示:
這段代碼由原網(wǎng)站復制得來,未改動
?動態(tài)生成的執(zhí)行代碼:
function getSign(data) {let str = 'abcdefghijklmnopqrstuvwxyz0123456789';let count = Math.floor(Math.random() * 7 + 10);let sign = 'zza';for(let i = 0; i < count ; i++){sign += str[Math.floor(Math.random() * 36)];}sign += global.__sign_hash_20200305('CJBPACrRuNy7'+JSON.stringify(data));return sign }執(zhí)行結(jié)果如下:
與之前的結(jié)果進行比較發(fā)現(xiàn)后32位是一樣的,證明我們的算法是沒有問題的
然后再根據(jù)sign獲得vKey,在purl前面加上域名就能播放歌曲:
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的q某音乐API接口分析--获取vKey和Sign的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kickstart自动化系统安装_利用K
- 下一篇: Excel数据透视表经典教程六《报表布局