Jsrpc學習——某條加密參數(shù)Sign變化的網(wǎng)站hook教程
大家好,我是皮皮。
1、這里使用的網(wǎng)站是fec2bc913be604a5162540c03d45532c,MD5加密處理過的。
2、需要抓取首頁相關信息,如下圖所示。
3、打開瀏覽器抓包,然后打斷點調(diào)試,依次點擊右邊的Call Stack內(nèi)的東西,直到找到加密函數(shù),里邊的值對應請求參數(shù)即可判定。仔細尋找,發(fā)現(xiàn)加密的函數(shù)在這里了。下圖直接用的是十一姐的圖,十一姐文章原文鏈接:
https://blog.csdn.net/weixin_43411585/article/details/123030973
4、之后可以在控制臺輸入指令window.dcpeng = window.byted_acrawler.sign,其中window.byted_acrawler.sign為加密函數(shù)。注意:這個地方挺重要的,很多時候我們會寫成ct.update(),這樣會有問題!加了括號就是賦值結果,沒加就是賦值整個函數(shù)!千差萬別。
5、關閉網(wǎng)頁debug模式。注意:這個地方挺重要的,很多時候如果不關閉,ws無法注入!
6、此時在本地雙擊編譯好的文件win64-localhost.exe,啟動服務。
7、之后在控制臺注入ws,即將JsEnv.js文件中的內(nèi)容全部復制粘貼到控制臺即可(注意有時要放開斷點)。
8、連接通信,在控制臺輸入命令var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=para&name=test");
9、隨后繼續(xù)輸入命令:
// 注冊一個方法 第一個參數(shù)get_v為方法名,
// 第二個參數(shù)為函數(shù),resolve里面的值是想要的值(發(fā)送到服務器的)
// param是可傳參參數(shù),可以忽略
demo.regAction("get_para", function (resolve, param) {
console.log(param);
var res = dcpeng(param, {"url":"https://www.toutiao.com/?wid=1641423780855"});
resolve(res);
})
這個地方要記得傳參,不然你拿不到數(shù)據(jù)的。(這里排查了好久才出來)
10、之后就可以在瀏覽器中訪問數(shù)據(jù)了,打開網(wǎng)址 http://127.0.0.1:12080/go?group={}&name={}&action={}¶m={} ,這是調(diào)用的接口 group和name填寫上面注入時候的,action是注冊的方法名,param是可選的參數(shù),這里續(xù)用上面的例子,網(wǎng)頁就是:http://127.0.0.1:12080/go?group=para&name=test&action=get_para
11、如上圖所示,我們看到了那個變化的參數(shù)v的值,直接通過requests庫可以發(fā)起get請求。
12、現(xiàn)在我們就可以模擬數(shù)據(jù),進行請求發(fā)送了。
13、將拷貝的內(nèi)容可以丟到這里進行粘貼:http://tool.yuanrenxue.com/curl
14、之后將右側的代碼復制到Pycharm中即可用,非常便利。
15、之后就可以構造請求了,加一個整體循環(huán),然后即可獲取翻頁的內(nèi)容,整體代碼如下所示。
# coding:utf-8
# @Time : 2022/5/10 16:30
# @Author: 皮皮
# @公眾號: Python共享之家
# @website : http://pdcfighting.com/
# @File : 頭jsrpc.py
# @Software: PyCharm
import requests
import json
import urllib.parse
import time
param_url = "http://127.0.0.1:12080/go?group=para&name=test&action=get_para"
response = requests.get(url=param_url).text
response_json = json.loads(response)
sign = response_json["get_para"]
print(sign)
behot_time = int(time.time())
params = {
"offset": 0,
"channel_id": 0,
"max_behot_time": 1641416108,
"category": "pc_profile_recommend",
"aid": 24,
"app_name": "toutiao_web",
"disable_raw_data": "true",
"_signature": sign
}
url = f'https://www.toutiao.com/api/pc/list/feed'
response_detail = requests.get(url, params=params).json()
print(response_detail["data"])
運行結果如下圖所示,和網(wǎng)頁上呈現(xiàn)的數(shù)據(jù)一模一樣。
16、至此,請求就已經(jīng)完美的完成了,如果想獲取全部網(wǎng)頁,構造一個range循環(huán)翻頁即可實現(xiàn)。
小伙伴們,快快用實踐一下吧!如果在學習過程中,有遇到任何問題,歡迎加我好友,我拉你進Python學習交流群共同探討學習。