Jsrpc 學習——網易雲熱評加密函數逆向
大家好,我是皮皮。
前幾天給大家分享 jsrpc 的介紹篇,Python 網絡爬蟲之 js 逆向之遠程調用 (rpc) 免去摳代碼補環境簡介,感興趣的小夥伴可以戳此文前往。今天給大家來個 jsrpc 實戰教程,Jsrpc 學習——Cookie 變化的網站破解教程,讓大家繼續加深對 jsrpc 的理解和認識。下面是具體操作過程,不懂的小夥伴可以私我。
1、因爲網易雲音樂熱評的加密並不在 cookie 上,而是參數加密,所以這裏就不需要進行 hook 住 cookie 了。
2、之前就知道網易雲音樂熱評的加密存在之地是在下圖的位置,是那個函數window.asrsea(JSON.stringify(i1x), bsR1x(["流淚", "強"]), bsR1x(Xp8h.md), bsR1x(["愛心", "女孩", "驚恐", "大笑"]))
3、找到了 aes 加密地方的函數,就賦值一個自己名字的全局變量,然後轉發加密就行了。之後可以在控制檯輸入指令window.dcpeng = window.asrsea
,其中window.asrsea
爲加密函數。注意:這個地方挺重要的,很多時候我們會寫成 ct.update(),這樣會有問題!加了括號就是賦值結果,沒加就是賦值整個函數!千差萬別。
4、關閉網頁 debug 模式。注意:這個地方挺重要的,很多時候如果不關閉,ws 無法注入!
5、此時在本地雙擊編譯好的文件win64-localhost.exe
,啓動服務。
6、之後在控制檯注入 ws,即將JsEnv.js
文件中的內容全部複製粘貼到控制檯即可 (注意有時要放開斷點)。
7、連接通信,在控制檯輸入命令var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=para&);
8、隨後繼續輸入命令:
// 註冊一個方法 第一個參數get_v爲方法名,
// 第二個參數爲函數,resolve裏面的值是想要的值(發送到服務器的)
// param是可傳參參數,可以忽略
demo.regAction("get_para", function (resolve, param) {
console.log(param);
console.log(JSON.stringify(param));
var res = dcpeng(param, '010001', '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7', '0CoJUm6Qyw8W8jud');
resolve(JSON.stringify(res));
})
這裏就用到了參數 param,param 也就是需要傳值過來的 json 對象,因爲你不可能獲取固定的歌曲 id 和頁碼,所以用 python 寫成字典,通過 url 編碼寫在 param 裏。
9、這裏爲何不寫成 dcpeng(JSON.stringify(param)...) 這樣呢?因爲 get 傳過來的就是字符串,不用 json 轉字符串了。
上圖 20 行的位置那是 json 轉字符串,因爲只能返回字符串,返回對象的話會變成顯示 "[object]"
這兩步只是控制檯打印,不用管。
10、之後就可以在瀏覽器中訪問數據了,打開網址 http://127.0.0.1:12080/go?group={}&name={}&action={}¶m={}
,這是調用的接口 group 和 name 填寫上面注入時候的,action 是註冊的方法名,param 是可選的參數,這裏續用上面的例子,網頁就是:http://127.0.0.1:12080/go?group=para&name=wangyiyun&action=get_para¶m=rid=R_SO_4_1909604321&threadId=R_SO_4_1909604321&pageNo=1&pageSize=20&cursor=-1&offset=0&orderType=1
11、如上圖所示,我們看到了那個變化的參數 v 的值,直接通過 requests 庫可以發起 get 請求。
12、現在我們就可以模擬數據,進行請求發送了,整體代碼如下所示。
import requests
import json
import urllib.parse
songid = '1908392914'
data = {
"rid": f"R_SO_4_{songid}",
"threadId": f"R_SO_4_{songid}",
"pageNo": "1",
"pageSize": "20",
"cursor": "-1",
"offset": "0",
"orderType": "1",
"csrf_token": ""
}
song_info = str(data)
param = (urllib.parse.quote(song_info))
param_url = f"http://127.0.0.1:12080/go?group=para&name=wangyiyun&action=get_para¶m={param}"
response = requests.get(url=param_url).text
response_json = json.loads(response)
get_para = json.loads(response_json["get_para"])
encText = get_para["encText"]
encSecKey = get_para["encSecKey"]
# print(encText)
# print(encSecKey)
data = {
'params': encText,
'encSecKey': encSecKey
}
response = requests.post('https://music.163.com/weapi/comment/resource/comments/get?csrf_token=', data=data)
print(response.text)
運行之後,可以得到網頁上的評論數據:
放到 json 中去解析,和網頁上呈現的數據一模一樣。
下面是原網頁上的原始數據:
13、至此,請求就已經完美的完成了,如果想獲取全部網頁,構造一個 range 循環翻頁即可實現,改變請求參數中的 pageNo 即可。
14、如果想抓取不同的歌曲,只需要替換 songid 這個參數即可。
總結
大家好,我是皮皮。這篇文章主要給大家介紹了 jsrpc 的實戰教程,使用 jsrpc 工具可以在網絡爬蟲過程中事半功倍,無需仔細的去釦環境,去一步步逆向,只一個黑盒的模式,我們就拿到了想要的結果,屢試不爽。
初次接觸 jsrpc 的小夥伴可能看不懂,這裏還有黑哥錄製的一個視頻,大家可以對照着視頻進行學習,地址:https://www.bilibili.com/video/BV1EQ4y1z7GS
,黑哥全程無聲演示,視頻的 BGM 很大,建議大家可以靜音播放,領會其中奧義。
關於 jsrpc 工具,可以點擊原文前往獲取。
小夥伴們,快快用實踐一下吧!如果在學習過程中,有遇到任何問題,歡迎加我好友,我拉你進 Python 學習交流羣共同探討學習。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/3wmHF4W97SE7nC_ZJNvwOQ