日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

网易云音乐获取音频链接(爬虫)破解params参数

發(fā)布時(shí)間:2023/12/9 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 网易云音乐获取音频链接(爬虫)破解params参数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

網(wǎng)易云音樂params和encSecKey參數(shù)的生成
工具:谷歌瀏覽器,reres瀏覽器插件,python3,requests_html庫(kù)
關(guān)鍵詞:js逆向,js的AES加密,爬蟲
1.首先打開網(wǎng)易云音樂的歌單

進(jìn)入一個(gè)能聽到音樂的頁(yè)面搜索音樂文件,因?yàn)樵诰€聽歌要求加載文件速度快,體積小,所以候選音頻文件有:mp3, m4a, acc。一番操作果然找到j(luò)son格式的文件,找到音樂文件地址,接下來(lái)查看請(qǐng)求參數(shù)

2.經(jīng)過一些列的請(qǐng)求發(fā)現(xiàn),只有兩個(gè)參數(shù)是全局的關(guān)鍵,params和encSecKey,搜索數(shù)值未發(fā)現(xiàn)攜帶參數(shù)的文件,疑似由js動(dòng)態(tài)生成

3.查找生成此參數(shù)的js文件,查看此次請(qǐng)求的來(lái)源,找到可以文件,點(diǎn)擊進(jìn)入,再次搜索關(guān)鍵key

果然找到

4.分析js代碼,發(fā)現(xiàn)關(guān)鍵變量是:bZ7ex(名肯定也是會(huì)變),由asrea函數(shù)生成,搜索發(fā)現(xiàn)這個(gè)函數(shù)就是d函數(shù)
分析變量:此函數(shù)的后3位變量肯定是不變值,都是固定的字符,關(guān)鍵找第一個(gè)參數(shù)如何生成

經(jīng)過仔細(xì)觀察params和encSecKey參數(shù)由a,b,c,d,e,這幾個(gè)關(guān)鍵函數(shù)生成,看見for循環(huán)斷點(diǎn)調(diào)試就很麻煩了,直接用reres插件替換成本地文件,在本地調(diào)試

5.被替換文件:https://s3.music.126.net/web/s/core_d889eff6d44685f138aeb17febf426d6.js(過段時(shí)間會(huì)變化)
替換文件:http://127.0.0.1/js/core_d889eff6d44685f138aeb17febf426d6.js
源代碼復(fù)制粘貼到本地服務(wù)器文件

6.控制臺(tái)輸出參數(shù),觀察值,分析,d中的i由a函數(shù)生成,

a函數(shù)就是在b中找了16位隨機(jī)字符,隨機(jī)即確定,直接寫死,可以正常運(yùn)行,大會(huì)進(jìn)行下一項(xiàng)

打印下看看是什么樣

可以看到所有的也包括其他歌曲的encSecKey值也一樣,encSecKey也為死值

測(cè)試發(fā)現(xiàn)只有這個(gè)params值可用,d函數(shù)d值為固定json格式并攜帶有歌曲id,也就是asrea函數(shù)的第一個(gè)參數(shù)也找到了

接下來(lái)找b函數(shù),b函數(shù)一眼看出來(lái)就是AES加密(靠多年行走江湖的經(jīng)驗(yàn))參考這篇文章:https://blog.csdn.net/sinat_17775997/article/details/88814358

b函數(shù)說明

function b(a, b) {console.log("進(jìn)入b函數(shù) => ");console.log("b中a => " + a);console.log("b中b => " + b);var c = CryptoJS.enc.Utf8.parse(b); // 十六位十六進(jìn)制數(shù)作為秘鑰 第一次是g(0CoJUm6Qyw8W8jud) 第二財(cái)是a循環(huán)出的i 現(xiàn)在寫死:WCwzSK4ip8uBjv7Lconsole.log("b中由b生成的c => ");console.log(c);var d = CryptoJS.enc.Utf8.parse("0102030405060708"); // 十六位十六進(jìn)制數(shù)作為秘鑰偏移量console.log("b中生成的d => ");console.log(d);var e = CryptoJS.enc.Utf8.parse(a), f = CryptoJS.AES.encrypt(e, c, { // e為密文, c為秘鑰(固定值), AES加密iv: d, // AES加密 iv 向量(固定值:0102030405060708)mode: CryptoJS.mode.CBC // 加密模式,固定寫法});// 兩次加密出來(lái)f,搞定var bbbbbb = f.toString();console.log("這是b里的bbbbbb => ");console.log(bbbbbb);return bbbbbb}

d函數(shù)說明

function d(d, e, f, g) {console.log("進(jìn)入d函數(shù) =>");console.log("d中d =>" + d);console.log("d中e =>" + e);console.log("d中f =>" + f);console.log("d中g(shù) =>" + g);var h = {}, i = a(16);var ccc = c(i, e, f); // 死值console.log("d中ccc =>" + ccc);return h.encText = b(d, g), //值由 {"ids":"[1495845552]","level":"standard","encodeType":"aac","csrf_token":""} 0CoJUm6Qyw8W8jud 生成h.encText = b(h.encText, i), //值由 新生成的b(d, g) WCwzSK4ip8uBjv7L 生成h.encSecKey = ccc,h}

c函數(shù)就是生成encSecKey的是個(gè)死值
至此參數(shù)都o(jì)k了
加密時(shí)遇到了一個(gè)坑,aes加密填充使用的是pkcs7填充,代碼參考的:https://blog.csdn.net/yt_xy/article/details/108863258
python實(shí)現(xiàn)代碼:

from Cryptodome.Cipher import AES import base64 import time import jsonclass Encrypt:def __init__(self, key, iv):self.key = key.encode('utf-8')self.iv = iv.encode('utf-8')# @staticmethoddef pkcs7padding(self, text):"""明文使用PKCS7填充 """padding_size = len(text.encode('utf-8'))print("明文長(zhǎng)度: ")print(padding_size)padding = 16 - padding_size % 16print(padding)padding_text = chr(padding) * paddingprint(chr(padding))return text + padding_textdef aes_encrypt(self, content):""" AES加密 """cipher = AES.new(self.key, AES.MODE_CBC, self.iv)# 處理明文content_padding = self.pkcs7padding(content)print(content_padding)# 加密encrypt_bytes = cipher.encrypt(content_padding.encode('utf-8'))# 重新編碼result = str(base64.b64encode(encrypt_bytes), encoding='utf-8')return resultif __name__ == '__main__':key_one = '0CoJUm6Qyw8W8jud'key_two = 'WCwzSK4ip8uBjv7L'iv = '0102030405060708'# one_text = '{"ids":"[1316563155]","level":"standard","encodeType":"aac","csrf_token":""}'one_text = '{"ids":"[247579]","level":"standard","encodeType":"aac","csrf_token":""}' # 固定格式的jsonone_text_e = Encrypt(key=key_one, iv=iv)two_text = one_text_e.aes_encrypt(one_text)two_text_e = Encrypt(key=key_two, iv=iv)two_text = two_text_e.aes_encrypt(two_text)print(two_text)

總結(jié)

以上是生活随笔為你收集整理的网易云音乐获取音频链接(爬虫)破解params参数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。