python爬蟲HMAC加密案例:某企業信息查詢網站

聲明:
該文章為學習使用,嚴禁用于商業用途和非法用途,違者后果自負,由此產生的一切后果均與作者無關

一、找出需要加密的參數
  1. js運行 atob(‘aHR0cHM6Ly93d3cucWNjLmNvbS93ZWIvc2VhcmNoP2tleT0lRTQlQjglODclRTglQkUlQkUlRTklOUIlODYlRTUlOUIlQTI=’) 拿到網址,F12打開調試工具,點擊分頁找到 search/searchMultit 請求,鼠標右擊請求找到Copy>Copy as cUrl(cmd)
  2. 打開網站:https://spidertools.cn/#/curl2Request,把拷貝好的curl轉成python代碼
    在這里插入圖片描述
  3. 新建qichacha.py文件,把代碼復制到該文件內,把請求中的參數拷貝給data,請求中的data參數換成json,運行文件,發現請求成功并成功獲取到數據
    在這里插入圖片描述
  4. 然后把代碼中header、cookie注釋調試后會發現一個雖生成的header、QCCSESSID是加密的
    在這里插入圖片描述
  5. 在請求cookies中分析得知 ,QCCSESSID是后端生成的可以不用管
    在這里插入圖片描述
二、定位參數加密位置
  1. 由于加密的header是動態生成的,顯然使用關鍵字搜索無法定位到,直接切換到sources,添加XHR攔截 search/searchMulti
    在這里插入圖片描述
  2. 一直點擊跳到下一個函數,會看到作用域header里面已經沒有請求頭,在代碼里又看到熟悉的參數 x-pid,可以嘗試的分析里面的代碼
    在這里插入圖片描述
  3. 鼠標懸浮到 o.default 找到該函數的位置,會發現里面有個header 賦值的代碼,在該代碼打上斷點
    在這里插入圖片描述
  4. 結束此次斷點調試,點擊分頁重新發送請求,鼠標懸浮到 i 上發現有隨機生成的 header,并且很容易就找到 i = (0, a.default)(t, e.data),l = (0, r.default)(t, e.data, (0, s.default)()),i 是header的key,l是header的value
    在這里插入圖片描述
三、扣出加密代碼
  1. 創建qichacha.js文件,用于放扣出的js代碼
  2. 先把 header 的 key 和 value 扣出來,i = (0, a.default)(t, e.data),l = (0, r.default)(t, e.data, (0, s.default)()),把 t、e.data 在控制臺打印出來會發現 t 是請求路徑,e.data是請求參數
    在這里插入圖片描述在這里插入圖片描述
  3. 扣出加密header的key:i = (0, a.default)(t, e.data)
  • 根據第二步已經知道 t 是請求路徑,e.data是請求參數,所以只要扣出 a.default 就行, 把 a.default 打印出來會發現,a.default是方法
    在這里插入圖片描述
  • 點擊打印出的 a.default 方法,會快速找到該方法的位置,會發現只有 o.default、a.default是值得注意的方法,其他都是js語法,在方法內部打上斷點,并把 s 方法扣到qichacha.js,把 a.default 換成 s
    在這里插入圖片描述在這里插入圖片描述
  • 開始扣出 s 方法中的 o.default:結束本次調試,點擊分頁重新發送請求,鼠標懸浮到 o.default,點擊藍色部分找到該方法,會再次發現 o.default 方法在該代碼打上斷點,并把 r 方法 js扣到qichacha.js,并把 s 中 o.default 替換成 r
    在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述
  • 結束本次斷點,點擊分頁重新發送請求,一直點擊跳到斷店調試,看到 e 是路徑+參數的字符串時,鼠標懸浮到 r 方法中的 o.default,點擊藍色部分找到該方法,會發現是個HMAC加密
    在這里插入圖片描述在這里插入圖片描述
  • 分析是哪種 HMAC 加密,在控制臺分別打印出:加密數據 e、加密密鑰 t、解密結果(0,o.default)(e, t).toString(),打開網站 https://www.dute.org/hmac?ref=search,輸入密鑰 、加密數據,加密算法是 HMAC SHA 512
    在這里插入圖片描述在這里插入圖片描述
  • 根據 HMAC SHA 512 算法完成 r 方法,經過測試相同的加密數據和加密密鑰,解密結果相同,至此 s 方法中的 o.default 完全扣出,至此 s 方法中的 o.defaul 完全扣出
    在這里插入圖片描述
  • 開始扣出 s 方法中的 a.default:分析 s 方法中的 a.default,點擊藍色部分找到該方法,會發現是個 r 方法,里面值得注意的是 o.default,其他都是js語法,在 for循環打上斷點,,并把 r 方法 js扣到 qichacha.js 因為和之前 r 方法沖突命名為 r1,并把 s 中 a.default 替換成r1
    在這里插入圖片描述在這里插入圖片描述
  • 結束本次斷點,點擊分頁重新發送請求,一直點擊跳到斷店調試,看到 r 方法停止調試,在控制臺輸出 o.default,把打印結果復制出來,補全 r1 方法,至此 s 方法中的 a.default 完全扣出
    在這里插入圖片描述
  • 驗證結果 i = (0, a.default)(t, e.data),刪除除了 e.headers[i] = l 之外的其他斷點,點擊第一頁發送請求,把 i 打印控制臺,再運行 qichacha.js 文件打印 i,對比兩個 i 會發現兩個之一樣
    在這里插入圖片描述在這里插入圖片描述
  1. 扣出加密header的key:l = (0, r.default)(t, e.data, (0, s.default)())
  • 根據第二步已經知道 t 是請求路徑,e.data是請求參數,所以只要扣出 r.default 、r.default 就行
  • 點擊分頁重新發送請求,鼠標懸浮到 s.default,點擊藍色部分找到該方法,會發現 _default 方法,該方法中都是 js 語法,只需把該函數拷貝出來就行,拷貝出來后命名為 s1,把 s.default 換成 s1
    在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述
  • 測試 s1 方法會發現,報 windows.tid 為 undefined的錯誤,切換到提示工具 Elements ,全局搜索 windows.tid 會發現該值是固定的值,把該值賦值下來替換 s1 并刪除 s1
    在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述
  • 開始扣出 r.default 方法:鼠標懸浮到 r.defaul,點擊藍色部分找到該方法,會發現一個 s 方法,會發現只有 o.default、a.default是值得注意的方法,其他都是js語法,在方法內部打上斷點,并把 s 方法扣到qichacha.js 命名為 s1,把 r.default 換成 s1
    在這里插入圖片描述在這里插入圖片描述
  • 仔細分析 s1 會發現和之前的 s 方法類似,可以先試著,把 s1 方法中的 o.default、a.default 替換成之前的 r、r1
    在這里插入圖片描述
  • 測試 s1 方法:把 n、i、(0,o.default)(n + “pathString” + i + t, (0,a.default)(n)) 輸出控制臺,把 n、i、tid值傳給 s1 并打印出來,發現同樣的參數,得到值一樣,說明 s1 內部的 o.default、a.default 確實是 r、r1,結束斷點調試
    在這里插入圖片描述
四、驗證結果
  1. 修改qichacha.js,把 t、par作為參數傳給 main 方法,并運行文件,打印出生成的 key、value
    在這里插入圖片描述
  2. 點擊第一頁重新請求,在控制臺輸出 i、l,對比發現值都是一樣的
    在這里插入圖片描述
  3. 修改 qichacha.py 文件,運行文件,數據獲取成功
    在這里插入圖片描述
五、最終代碼
  1. qichacha.js
var cryptoJs = require('crypto-js')var r = function (e, t) {var hmacSha512 = cryptoJs.HmacSHA512(e, t);return hmacSha512.toString()
};var r1 = function () {var o = {"n": 20,"codes": {"0": "W","1": "l","2": "k","3": "B","4": "Q","5": "g","6": "f","7": "i","8": "i","9": "r","10": "v","11": "6","12": "A","13": "K","14": "N","15": "k","16": "4","17": "L","18": "1","19": "8"}};for (var e = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "/").toLowerCase(), t = e + e, n = "", i = 0; i < t.length; ++i) {var a = t[i].charCodeAt() % o.n;n += o.codes[a]}return n
};var s = function () {var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, t = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "/").toLowerCase(), n = JSON.stringify(e).toLowerCase();return r(t + n, r1(t)).toLowerCase().substr(8, 20)
};var s1 = function () {var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, t = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : "", n = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "/").toLowerCase(), i = JSON.stringify(e).toLowerCase();return r(n + "pathString" + i + t, r1(n))
};function main(t, par) {var i = s(t, par);var l = s1(t, par, 'f7d239d312096b665fd9e4a46e603592');return {key: i, value: l}
}var t = '/api/search/searchmulti';
var par = {"searchKey": "萬達集團","pageIndex": 1,"pageSize": 20,
}
console.log(main(t,par))
  1. qichacha.py
import requests
import execjs
import furlheaders = {"authority": "www.qcc.com","accept": "application/json, text/plain, */*","accept-language": "zh-CN,zh;q=0.9","cache-control": "no-cache","content-type": "application/json","origin": "https://www.qcc.com","pragma": "no-cache","referer": "https://www.qcc.com/web/search?key=^%^E4^%^B8^%^87^%^E8^%^BE^%^BE^%^E9^%^9B^%^86^%^E5^%^9B^%^A2","sec-ch-ua": "^\\^Google","sec-ch-ua-mobile": "?0","sec-ch-ua-platform": "^\\^Windows^^","sec-fetch-dest": "empty","sec-fetch-mode": "cors","sec-fetch-site": "same-origin","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36","x-requested-with": "XMLHttpRequest","x-pid": "30ccc65659628b892fb5c1c99a083a95",# "43d930d400d14394164a": "87ae6559513fa06d04d868f1a98d6e48637c09c76415caadecdd28f8e52f9912bca862cce00619ae312b20a57701dcf7858063dd9bb071fad27c01076e24be9d",
}
cookies = {"QCCSESSID": "eaa3818b5a849d53ca70e37dac","qcc_did": "fe88cac5-6065-4d4d-bdc6-f642aea5386b"
}
url = "https://www.qcc.com/api/search/searchMulti"
data = {"searchKey": "萬達集團","pageIndex": 2,"pageSize": 20
}with open('qichacha.js','r') as js_file:js = execjs.compile(js_file.read())url_info = furl.furl(url)get_headers = js.call('main',str(url_info.path),data)headers[get_headers['key']] = get_headers['value']print(headers)response = requests.post(url, headers=headers, cookies=cookies, json=data)print(response.text)print(response)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161503.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161503.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161503.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

飛槳——總結PPOCRLabel中遇到的坑

操作系統&#xff1a;win10 python環境&#xff1a;python3.9 paddleocr項目版本&#xff1a;2.7 1.報錯&#xff1a;ModuleNotFoundError: No module named Polygon&#xff08;已解決&#xff09; 已解決所以沒有復現報錯內容 嘗試方法一&#xff1a;直接使用pip命令安裝&…

oracle rac 19.3安裝補丁19.19

使用opatchauto apply DIR來進行安裝 1.升級之前先備份一下GRID_HOME和ORACLE_HOME 2.現在新的opatch安裝不需要先停止集群和數據庫&#xff0c;在升級過程中&#xff0c;他會自動關閉和啟動集群 3.先將OPatch&#xff08;P6880880&#xff09;包拷貝到$GRID_HOME和$ORACLE_HOM…

【Web安全】sqlmap的使用筆記及示例

【Web安全】sqlmap的使用筆記 文章目錄 【Web安全】sqlmap的使用筆記1. 目標2. 脫庫2.1. 脫庫&#xff08;補充&#xff09; 3. 其他3.1. 其他&#xff08;補充&#xff09; 4. 繞過腳本tamper講解 1. 目標 操作作用必要示例-u指定URL&#xff0c;檢測注入點sqlmap -u http://…

ts實現合并數組對象中key相同的數據

背景 在平常的業務中&#xff0c;后端同學會返回以下類似的結構數據 // 后端返回的數據結構 [{ id: 1, product_id: 1, pid_name: "Asia", name: "HKG01" },{ id: 2, product_id: 1, pid_name: "Asia", name: "SH01" },{ id: 3, pro…

實現極坐標圖表QPolarChart的角度軸范圍是[0,360]時,0度在水平右側

目錄 參考角度軸范圍是[0,360]時&#xff0c;0度在水平右側.h.cpp 參考 Qt數據可視化(QPolarChart雷達圖) 默認QPolarChart的范圍是[0,360]時&#xff0c;0度在垂直上方 如官方例子QValueAxis角度軸范圍是[-100,100] 角度軸范圍是[0,360]時&#xff0c;0度在水平右側 原理&am…

用eclipse搭建簡單的JavaWeb環境

在 Eclipse 中搭建 JavaWeb 項目的環境涉及到配置服務器、創建項目、添加庫等步驟。以下是基于 Eclipse 的 JavaWeb 項目搭建的簡要步驟&#xff1a; 步驟&#xff1a; 1. 安裝 Eclipse IDE for Java EE Developers 確保你已經安裝了 Eclipse IDE for Java EE Developers 版…

MyBatis-Plus: 簡化你的MyBatis應用

MyBatis-Plus: 簡化你的MyBatis應用 在Java開發中&#xff0c;MyBatis一直是一個受歡迎的持久層框架&#xff0c;提供了靈活的數據訪問方式。然而&#xff0c;MyBatis的使用往往涉及許多樣板代碼&#xff0c;這在一定程度上增加了開發的復雜性。這里&#xff0c;MyBatis-Plus&…

刷題筆記(第八天)

1. 請補全JavaScript代碼&#xff0c;實現一個函數&#xff0c;要求如下&#xff1a; 根據輸入的數字范圍[start,end]和隨機數個數"n"生成隨機數生成的隨機數存儲到數組中&#xff0c;返回該數組返回的數組不能有相同元素 注意&#xff1a; 不需要考慮"n"…

【C++11】auto與decltype關鍵字使用詳解

系列文章目錄 C11新特性使用詳解-持續更新 文章目錄 系列文章目錄前言一、auto關鍵字1.根據變量的初始化表達式來推導變量的類型2.const與引用 二、decltype關鍵字1.推斷表達式的類型2.const與引用 三、總結 前言 auto和decltype是C11引入的倆個重要的新關鍵字&#xff0c;用…

簡單幾步,借助Aapose.Cells將 Excel XLS 轉換為PPT

數據呈現是商業和學術工作的一個重要方面。通常&#xff0c;您需要將數據從一種格式轉換為另一種格式&#xff0c;以創建信息豐富且具有視覺吸引力的演示文稿。當您需要在幻燈片上呈現工作表數據時&#xff0c;需要從 Excel XLS 轉換為 PowerPoint 演示文稿。在這篇博文中&…

原理Redis-QuickList

QuickList **問題1&#xff1a;**ZipList雖然節省內存&#xff0c;但申請內存必須是連續空間&#xff0c;如果內存占用較多&#xff0c;申請內存效率很低。怎么辦&#xff1f; 為了緩解這個問題&#xff0c;我們必須限制ZipList的長度和entry大小。 **問題2&#xff1a;**但是…

[網鼎杯 2018]Fakebook

[網鼎杯 2018]Fakebook 打開環境出現一個登錄注冊的頁面 在登錄和注冊中發現 了地址欄出現變化&#xff0c;掃一波看看 看看robots.txt和flag.php 訪問robots.txt看看 再訪問user.php.bak <?php class UserInfo { public $name ""; public …

Head、Neck、Backbone介紹

在深度學習中&#xff0c;通常將模型分為三個部分&#xff1a;backbone、neck 和 head。 Backbone&#xff1a;backbone 是模型的主要組成部分&#xff0c;通常是一個卷積神經網絡&#xff08;CNN&#xff09;或殘差神經網絡&#xff08;ResNet&#xff09;等。backbone 負責…

ON1 Photo RAW 2024 for Mac——專業照片編輯的終極利器

ON1 Photo RAW 2024 for Mac是一款專為Mac用戶打造的照片編輯器&#xff0c;以其強大的功能和易用的操作&#xff0c;讓你的照片編輯工作變得輕松愉快。 一、強大的RAW處理能力 ON1 Photo RAW 2024支持大量的RAW格式照片&#xff0c;能夠讓你在編輯過程中獲得更多的自由度和更…

練習九-利用狀態機實現比較復雜的接口設計

練習九-利用狀態機實現比較復雜的接口設計 1&#xff0c;任務目的&#xff1a;2&#xff0c;RTL代碼3&#xff0c;RTL原理框圖4&#xff0c;測試代碼5&#xff0c;波形輸出 1&#xff0c;任務目的&#xff1a; &#xff08;1&#xff09;學習運用狀態機控制的邏輯開關&#xff…

【C++11】=default與=delete關鍵字使用詳解

系列文章目錄 C11新特性使用詳解-持續更新 文章目錄 系列文章目錄一、default關鍵字1. 為什么要引入default關鍵字2. 注意事項3. 使用default關鍵字有什么好處4.實例代碼 二、delete關鍵字1. 為什么要引入delete關鍵字2. 注意事項3. 使用場景3.1刪除默認構造函數3.2 刪除拷貝構…

2023.11.22 -數據倉庫的概念和發展

目錄 https://blog.csdn.net/m0_49956154/article/details/134320307?spm1001.2014.3001.5501 1經典傳統數倉架構 2離線大數據數倉架構 3數據倉庫三層 數據運營層,源數據層&#xff08;ODS&#xff09;&#xff08;Operational Data Store&#xff09; 數據倉庫層&#…

開發上門送桶裝水小程序要考慮哪些業務場景

上門送水業務已經有很長一段時間了&#xff0c;但是最開始都是給用戶發名片、貼小廣告&#xff0c;然后客戶電話訂水&#xff0c;水站工作人員再上門去送&#xff0c;這種人工記單和派單效率并不高&#xff0c;并且電話溝通中也比較容易出現偏差&#xff0c;那么根據這個情況就…

IT 領域中的主要自動化趨勢

48%的IT自動化流程屬于IT服務管理&#xff0c;過去一年中&#xff0c;IT運維自動化增長了272%。 IT部門從交付者轉變為戰略伙伴 今年的《工作自動化指數》數據顯示&#xff0c;自動化正在蔓延到組織的各個部門&#xff0c;越來越多的部門采用自動化&#xff0c;并且IT以外的員工…

一條命令徹底卸載Linux自帶多個版本jdk

一條命令徹底卸載Linux自帶多個版本jdk 檢查系統已經安裝的jdk rpm -qa | grep java卸載所有已經安裝的 jdk xargs 將參數逐個傳遞 將已安裝的 java 程序逐個當做參數傳遞給 rpm -e --nodeps rpm -qa | grep java | xargs rpm -e --nodeps再次檢查系統已經安裝的jdk rpm -qa | …