python爬虫HMAC加密案例:某企业信息查询网站

news2025/1/12 17:44:34

声明:
该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关

一、找出需要加密的参数
  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 furl

headers = {
    "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.coloradmin.cn/o/1240486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Django 集成 Celery 实现高效的异步任务处理

概要 在复杂的 Web 应用中&#xff0c;处理长时间运行的任务或定期任务是一项挑战。Django 作为一个强大的 Python Web 框架&#xff0c;可以通过集成 Celery 这一异步任务队列来优化这些任务的处理。Celery 不仅能提高应用性能&#xff0c;还能改善用户体验。本文将深入探讨如…

专业pdf编辑工具PDF Expert mac中文版特点介绍

PDF Expert mac是一款专业的PDF编辑和阅读工具。它可以帮助用户在Mac、iPad和iPhone等设备上查看、注释、编辑、填写和签署PDF文档。 PDF Expert mac软件特点 PDF编辑&#xff1a;PDF Expert提供了丰富的PDF编辑功能&#xff0c;包括添加、删除、移动、旋转、缩放、裁剪等操作…

CSM32RV003:国产高精度16位ADC低功耗RISC-V内核MCU

目录 高精度ADC工业应用工业数据采集应用CSM32RV003简介主要特性 高精度ADC工业应用 高精度ADC即高精度模数转换器&#xff0c;是一种能够将输入模拟信号转换为数字信号的芯片&#xff0c;在多种消费电子、工业、医疗和科研领域都有广泛应用。高精度ADC的主要特点是能够提供高…

《QT从基础到进阶·三十八》QWidget实现炫酷log日志打印界面

QWidget实现了log日志的打印功能&#xff0c;不仅可以在界面显示&#xff0c;还可以生成打印日志。先来看下效果&#xff0c;源码放在文章末尾&#xff1a; LogPlugin插件类管理log所有功能&#xff0c;它可以获取Log界面并能打印正常信息&#xff0c;警告信息和错误信息&…

贪心算法及相关例题

目录 什么是贪心算法&#xff1f; leetcode455题.分发饼干 leetcode376题.摆动序列 leetcode55题.跳跃游戏I leetcode45题.跳跃游戏II leetcode621题.任务调度器 leetcode435题.无重叠空间 leetcode135题.分发糖果 什么是贪心算法&#xff1f; 贪心算法更多的是一种思…

济南数字孪生赋能工业制造,加速推进制造业数字化转型

济南数字孪生赋能工业制造&#xff0c;加速推进制造业数字化转型。数字孪生是指通过数字模型对现实世界进行模拟和描述&#xff0c;从而实现数字化转型的技术。数字孪生技术通过利用先进传感与测量技术、实时数据融合及分析技术、虚拟现实技术和仿真技术&#xff0c;在数字空间…

HQL刷题 50道

HQL刷题 50道 尚硅谷HQL刷题网站 答案 1.查询累积销量排名第二的商品 select sku_id from (select sku_id, dense_rank() over (order by total desc) rnfrom (select sku_id, sum(sku_num) totalfrom order_detailgroup by sku_id) t1) t2 where rn 2;2.查询至少连续三天下…

分类预测 | Matlab实现基于DBN-SVM深度置信网络-支持向量机的数据分类预测

分类预测 | Matlab实现基于DBN-SVM深度置信网络-支持向量机的数据分类预测 目录 分类预测 | Matlab实现基于DBN-SVM深度置信网络-支持向量机的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.利用DBN进行特征提取&#xff0c;将提取后的特征放入SVM进行分类…

【Delphi】开发IOS 程序,TLabel 中英文字对齐(水平),一行代码解决显示对齐问题!

目录 一、问题现象&#xff1a; 二、解决方案&#xff08;一行代码解决ios对齐问题&#xff09;&#xff1a; 三、解决后效果&#xff1a; 四、后记&#xff1a; 一、问题现象&#xff1a; 在用 Delphi 开发ios程序时&#xff0c;使用TLabel控件显示&#xff0c;会出现中英…

《工程测量学》笔记/期末复习资料

水平角观测方法&#xff1a; ①测回法&#xff1b;②方向观测法&#xff08;全圆观测法&#xff09;。 比例尺精度&#xff1a; 图上0.1mm&#xff08;肉眼能够识别的最小距离&#xff09;所表示的实地距离称为“比例尺精度”。 ①尺寸小于比例尺精度的地物不需要测量&…

部署jekins遇到的问题

jdk问题 我用的jdk版本是21的结果版本太新了&#xff0c;启动jekins服务的时候总是报错最后在jekins的安装目录下面的jekinsErr.log查看日志发现是jdk问题最后换了一个17版本的就解决了。 unity和jekins jekins和Git源码管理 jekins和Git联动使用 我想让jekins每次打包的时…

SpringMVC(五)SpringMVC的视图

SpringMVC中的视图是View接口&#xff0c;视图的作用渲染数据&#xff0c;将模型Model中的数据展示给用户 SpringMVC视图的种类很多&#xff0c;默认有转发视图(InternalResourceView)和重定向视图(RedirectView) 当工程引入jstl的依赖&#xff0c;转发视图会自动转换为JstlV…

鸿蒙4.0开发笔记之ArkTs语言基础与基本组件结构(四)

文章声明&#xff1a;本文关于HarmonyOS系统的部分内容和描述借鉴于华为官网的“HarmonyOS开发者学堂”&#xff0c;有需要的也可以进入官网查看。<HarmonyOS第一课>ArkTS开发语言介绍 一、ArkTs语言介绍 ArkTS是鸿蒙系统&#xff08;HarmonyOS&#xff09;优选的主力应…

竞赛 : 题目:基于深度学习的水果识别 设计 开题 技术

1 前言 Hi&#xff0c;大家好&#xff0c;这里是丹成学长&#xff0c;今天做一个 基于深度学习的水果识别demo 这是一个较为新颖的竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/pos…

【机器学习】Nonlinear Independent Component Analysis - Aapo Hyvärinen

Linear independent component analysis (ICA) x i ( k ) ∑ j 1 n a i j s j ( k ) for all i 1 … n , k 1 … K ( ) x_i(k) \sum_{j1}^{n} a_{ij}s_j(k) \quad \text{for all } i 1 \ldots n, k 1 \ldots K \tag{} xi​(k)j1∑n​aij​sj​(k)for all i1…n,k1…K()…

如何访问linux上的web服务

1.获取服务运行端口 例如8080 2.如果时vmware 需要先配置转发端口和主机ip 主机ip需要未使用的 例如&#xff1a; 3.查看虚拟机防火墙设置 centos8 为例 &#xff1a; firewall-cmd --zonepublic --list-ports 查看放通端口 如果没有放通 firewall-cmd --zonepublic --add-p…

使用Pytorch从零开始构建CGAN (conditional GAN)

GAN和DCGAN生成随机图像。因此&#xff0c;我们几乎无法控制生成哪些图像。然而&#xff0c;CGAN 可以让我们指定一个条件&#xff0c;以便我们可以告诉它要生成哪些图像。诀窍是使用可学习层将标签值转换为特征向量&#xff0c;以便生成器可以学习要生成什么图像。鉴别器还利用…

时序预测 | MATLAB实现基于BiLSTM-AdaBoost双向长短期记忆网络结合AdaBoost时间序列预测

时序预测 | MATLAB实现基于BiLSTM-AdaBoost双向长短期记忆网络结合AdaBoost时间序列预测 目录 时序预测 | MATLAB实现基于BiLSTM-AdaBoost双向长短期记忆网络结合AdaBoost时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.Matlab实现BiLSTM-Adaboost…

【OpenCV实现图像:使用OpenCV进行图像处理之透视变换】

文章目录 概要计算公式举个栗子实际应用小结 概要 透视变换&#xff08;Perspective Transformation&#xff09;是一种图像处理中常用的变换手段&#xff0c;它用于将图像从一个视角映射到另一个视角&#xff0c;常被称为投影映射。透视变换可以用于矫正图像中的透视畸变&…

ChatGPT规模化服务的经验与教训

2022年11月30日&#xff0c;OpenAI发布ChatGPT&#xff0c;以很多人未曾预料的速度迅速走红。与此同时&#xff0c;由于短时间内用户量的暴涨&#xff0c;导致服务器过载&#xff0c;迫使OpenAI停止新用户的注册。 ChatGPT发布这一年&#xff0c;同样的情景发生了好几次。在最近…