解决fidder小黑怪倒出JMeter文件缺失域名、请求头

解决fidder小黑怪倒出JMeter文件缺失域名、请求头

1、目录结构:

在这里插入图片描述

2、代码

'''
coding:utf-8
@Software:PyCharm
@Time:2024/7/10 14:02
@Author:Dr.zxy
'''
import zipfile
import os
import xml.etree.ElementTree as ET
import re#定义信息头
headers_to_extract = ['Host', 'Connection', 'Content-Length', 'apiversion', 'apicode','User-Agent', 'format', 'content-type', 'accept', 'pagecode','x-secure-opt-log', 'appcode', 'Origin', 'Referer','Accept-Language', 'Accept-Encoding', 'Cookie'
]# 定义函数解压 .saz 文件
def extract_saz(saz_file):# 创建一个目录来存放解压后的内容extract_folder = saz_file.replace('.saz', '_extracted')os.makedirs(extract_folder, exist_ok=True)# 打开 saz 文件with zipfile.ZipFile(saz_file, 'r') as zip_ref:# 解压所有文件到 extract_folderzip_ref.extractall(extract_folder)return extract_folder# 定义函数将提取的文件重命名为 .txt
def convert_to_txt(extract_folder):# 遍历提取的文件夹中的所有文件for root, _, files in os.walk(extract_folder):for file in files:# 如果文件不是 .txt 文件,则重命名为 .txtif not file.endswith('.txt'):original_path = os.path.join(root, file)new_path = os.path.join(root, os.path.splitext(file)[0] + '.txt')os.rename(original_path, new_path)
#url填充
def update_domain_from_comments(xml_file):#加载文件tree = ET.parse(xml_file)root = tree.getroot()for sampler in root.findall('.//HTTPSamplerProxy'):testplan_comments = sampler.find(".//stringProp[@name='TestPlan.comments']")if testplan_comments is not None:domain_value = testplan_comments.textdomain_prop = sampler.find(".//stringProp[@name='HTTPSampler.domain']")if domain_prop is not None:domain_prop.text = domain_valuetree.write(xml_file, encoding='utf-8', xml_declaration=True)#信息头添加序号
def update_testname(filename):tree = ET.parse(filename)root = tree.getroot()header_managers = root.findall('.//HeaderManager')for idx, header_manager in enumerate(header_managers):# 信息头管理器添加序号 001   002new_testname = f'{idx:03}-HTTP信息头管理器'  # {:03} 确保3位数字的前导为零header_manager.set('testname', new_testname)# 写到Jmeter文件tree.write(filename, encoding='utf-8', xml_declaration=True)# 读取文件内容with open(filename, 'r', encoding='utf-8') as file:content = file.read()# 定义要删除的 XML 片段pattern = r'<HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="000-HTTP信息头管理器" enabled="true">.*?</HeaderManager>\s*<hashTree\s*/>'# 使用正则表达式删除匹配的部分new_content = re.sub(pattern, '', content, flags=re.DOTALL)# 将修改后的内容写回文件with open(filename, 'w', encoding='utf-8') as file:file.write(new_content)# 从文件中读取头并转换为JMeter Header Manager格式的函数
def convert_to_jmeter_xml(directory, headers_to_extract):# 遍历目录中的文件for filename in os.listdir(directory):if filename.endswith("_c.txt"):file_path = os.path.join(directory, filename)#提取下划线前的数值numeric_value = filename.split('_')[0].zfill(3)# 处理文件以提取标头headers = {}with open(file_path, 'r', encoding='utf-8') as file:content = file.read()for header in headers_to_extract:match = re.search(rf'^{header}: (.+)$', content, flags=re.MULTILINE)if match:headers[header] = match.group(1)# 生成JMeter标头管理器XMLheader_xml = ''for header, value in headers.items():header_xml += f'''<elementProp name="" elementType="Header"><stringProp name="Header.name">{header}</stringProp><stringProp name="Header.value">{value}</stringProp></elementProp>'''# 包裹式格式jmeter_xml = f'''<HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="{numeric_value}-HTTP信息头管理器" enabled="true"><collectionProp name="HeaderManager.headers">{header_xml}</collectionProp></HeaderManager>'''# 将JMeter XML内容写入新文件output_filename = f'{numeric_value}_jmeter.xml'output_path = os.path.join(directory, output_filename)with open(output_path, 'w', encoding='utf-8') as output_file:output_file.write(jmeter_xml)#print(f'Converted {filename} to {output_filename}')# 第一步:遍历所有的<HeaderManager>标签,提取testname属性中'-'前的值
def extract_testnames(filename):testnames = []tree = ET.parse(filename)root = tree.getroot()for header_manager in root.findall('.//HeaderManager'):testname = header_manager.get('testname', '')if '-' in testname:testnames.append(testname.split('-')[0])return testnames# 第二步:读取替换目标文件的内容
def read_file_content(filename):with open(filename, 'r', encoding='utf-8') as file:content = file.read()return content# 第三步:替换<HeaderManager>标签节点的内容为指定文件的内容
def replace_header_manager_content(filename, testname, replacement_content):# 解析 XML 文件tree = ET.parse(filename)root = tree.getroot()# 查找所有 <HeaderManager> 节点for header_manager in root.findall('.//HeaderManager'):# 检查 testname 属性是否以指定的 testname 开头if header_manager.get('testname', '').startswith(testname):# 清空 <HeaderManager> 节点的内容header_manager.clear()# 设置新的内容header_manager.text = replacement_content# 保存修改后的 XML 文件tree.write(filename, encoding='utf-8', xml_declaration=True)def modify_jmx_file(input_file, output_file):try:# 读取原始文件内容with open(input_file, 'r', encoding='utf-8') as f:content = f.read()# 替换操作content = content.replace('<HeaderManager>', '')content = content.replace('</HeaderManager>', '')content = content.replace('&lt;', '<')content = content.replace('&gt;', '>')# 写入修改后的内容到目标文件with open(output_file, 'w', encoding='utf-8') as f:f.write(content)#print(f'文件处理完成,修改后的文件保存为 {output_file}')except FileNotFoundError:print(f'Error: File {input_file} not found.')#修改填充的 jmeter
jmx_filename = 'jmx/33n.jmx'
#新的文件名称
output_file = 'jmx/new_modified.jmx'if __name__ == "__main__":# 替换为你的.saz 文件路径saz_file_path = 'files/333.saz'# 解压 .saz 文件extract_folder = extract_saz(saz_file_path)# 将提取的文件重命名为 .txtconvert_to_txt(extract_folder)print(f"step1---fidder转换完成!提取文件存放在:{extract_folder}")update_domain_from_comments(jmx_filename)print(f"step2---url填充完毕")update_testname(jmx_filename)print(f"step3---信息头管理器【序号】添加完成")convert_to_jmeter_xml(extract_folder+"/raw", headers_to_extract)print(f"step4---信息头管理器【新节点·生成】生成完成")# 第一步:提取所有testname中'-'前的值testnames = extract_testnames(jmx_filename)# 第二步和第三步:针对每个testname,读取对应的XML文件并替换内容for testname in testnames:xml_filename = os.path.join(extract_folder+"/raw/", f'{testname}_jmeter.xml')if os.path.exists(xml_filename):replacement_content = read_file_content(xml_filename)replace_header_manager_content(jmx_filename, testname, replacement_content)else:print(f"Warning: File {xml_filename} not found.")print(f"step5---信息头管理器【新节点·替换】完成")modify_jmx_file(jmx_filename, output_file)print(f"step6---信息头管理器【新节点·替换清洗】完成")

3、注意事项

4、结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/376952.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

芋道框架万字详解(前后端分离)、若依框架、yudao-cloud保姆级攻略

♥️作者&#xff1a;小宋1021 &#x1f935;‍♂️个人主页&#xff1a;小宋1021主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…

STM32MP135裸机编程:定时器内核时钟频率计算方法

0 工具准备 STM32MP13xx参考手册 1 定时器内核时钟频率计算方法 1.1 定时器分组 STM32MP135的定时器按照时钟源不同分成了三组&#xff0c;如下&#xff1a; APB1: APB2: APB6&#xff1a; 1.2 定时器内核时钟频率计算方法 APB1DIV是APB1的分频系数&#xff0c;APB2DIV、…

51单片机9(使用左移实现流水灯编程)

一、序言&#xff1a;下面我们来给大家介绍一下这个流水灯&#xff0c;流水灯如何来实现&#xff1f;我们依然使用这个工程来完成它。 1、那要使用实现这个流水灯&#xff0c;那我们只需要让D1到D8逐个的点亮&#xff0c;那同样要实现它足够的点亮&#xff0c;也会涉及到延时&…

html设计(两种常见的充电效果)

第一种 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&…

tomcat和nginx实现动静分离

访问nginx就是静态页面&#xff0c;nginx代理index.jsp可以访问tomcat的动态页面。 实验 1、设备以及IP地址 nginx1 192.168.10.41 tomcat1 192.168.10.51 tomcat2 192.168.10.52 2、tomcat1 的配置 创建动态页面 cd /usr/local/tomcat/webapps 创建一个目录作为一个ser…

【LeetCode 链表合集】

文章目录 1. LeetCode 206 反转链表2. NC40 链表相加 1. LeetCode 206 反转链表 题目链接&#x1f517; 解题思路&#xff1a; &#x1f50d; &#x1f427;创建一个新的节点&#xff0c;使用链表头插的方法&#xff1b; 2. NC40 链表相加 题目链接&#x1f517; 解题思路…

C++入门基础(2)

C入门基础&#xff08;2&#xff09; 1.缺省函数2.函数重载3.引用3.1 引用的概念和定义3.2 引用的特性3.3 引用的使用3.3.1引用的特性 4 .const引用5. 指针和引用的关系6.inline 1.缺省函数 • 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调用该函数时&#xf…

【服务器】在Linux查看运行的Python程序,并找到特定的Python程序

在Linux查看运行的Python程序并找到特定的Python程序 写在最前面1. 使用ps命令查看所有Python进程查看详细信息 2. 使用pgrep命令查找Python进程ID 3. 使用top或htop命令使用top命令使用htop命令 4. 使用lsof命令查找Python进程打开的文件 5. 使用nvidia-smi命令查看GPU使用情况…

【接口自动化_06课_Pytest+Excel+Allure完整框架集成】

一、logging在接口自动化里的应用 1、设置日志的配置&#xff0c;并收集日志文件 日志的设置需要在pytest.ini文件里设置。这个里面尽量不要有中文 2、debug日志的打印 pytest.ini文件的开关一定得是true才能在控制台打印日志 import allure import pytest from P06_PytestFr…

使用 YUM 仓库和 NFS 共享存储的详细指南

使用 YUM 仓库和 NFS 共享存储的详细指南 文章目录 使用 YUM 仓库和 NFS 共享存储的详细指南一、YUM 仓库服务1.1 YUM 介绍1.2 YUM 源的提供方式1.2.1 配置本地源仓库1.2.2 配置 FTP 源1.2.3 配置 HTTP 源 1.3 网络源配置1.3.1 清华源1.3.2 163 源1.3.3 阿里云源 1.4 YUM 命令1…

IntelliJ IDEA自定义菜单(Menus)、任务栏(toolbars)详细教程

本示例是基于IDEA2024.1Ultimate版本的New UI模式下 一、自定义菜单 1、打开Settings&#xff0c;找到Menus and Toolbars 2、点击右边的Main Menu&#xff0c;点击号&#xff0c;选择Add Action 3、弹出Add Action弹窗&#xff0c;搜索或者选择你要添加的指令 二、自定义工具…

Linux命令更新-Vim 编辑器

简介 Vim 是 Linux 系统中常用的文本编辑器&#xff0c;功能强大、可扩展性强&#xff0c;支持多种编辑模式和操作命令&#xff0c;被广泛应用于程序开发、系统管理等领域。 1. Vim 命令模式 Vim 启动后默认进入命令模式&#xff0c;此时键盘输入的命令将用于控制编辑器本身&…

OpenCV 寻找棋盘格角点及绘制

目录 一、概念 二、代码 2.1实现步骤 2.2完整代码 三、实现效果 一、概念 寻找棋盘格角点&#xff08;Checkerboard Corners&#xff09;是计算机视觉中相机标定&#xff08;Camera Calibration&#xff09;过程的重要步骤。 OpenCV 提供了函数 cv2.findChessboardCorners…

LeetCode 441, 57, 79

目录 441. 排列硬币题目链接标签思路代码 57. 插入区间题目链接标签思路两个区间的情况对每个区间的处理最终的处理 代码 79. 单词搜索题目链接标签原理思路代码 优化思路代码 441. 排列硬币 题目链接 441. 排列硬币 标签 数学 二分查找 思路 由于本题所返回的 答案在区间…

【C++】入门基础(引用、inline、nullptr)

目录 一.引用 1.引用的定义 2.引用的特性 3.引用的使用场景 4.const引用 5.引用和指针的区别 二.inline 三.nullptr 一.引用 1.引用的定义 引用不是新定义一个变量&#xff0c;而是给已经存在的变量取一个别名&#xff0c;编译器不会给引用变量开辟内存空间&#xff0c…

检测精度评价指标召回率和精确率

检测精度评价指标为&#xff1a; 1、召回率&#xff08;Recall Rate &#xff09; 2、平均精度均值&#xff08;mAP&#xff09; 3、平均对数漏检率&#xff08;MR-2&#xff09; 计算 TP 和 FP 的示例 假设你有一个目标检测模型&#xff0c;并使用它检测图像…

Git代码管理工具 — 3 Git基本操作指令详解

目录 1 获取本地仓库 2 基础操作指令 2.1 基础操作指令框架 2.2 git status查看修改的状态 2.3 git add添加工作区到暂存区 2.4 提交暂存区到本地仓库 2.5 git log查看提交日志 2.6 git reflog查看已经删除的记录 2.7 git reset版本回退 2.8 添加文件至忽略列表 1 获…

在conda的环境中安装Jupyter及其他软件包

Pytorch版本、安装和检验 大多数软件包都是随Anaconda安装的&#xff0c;也可以根据需要手动安装一些其他软件包。 目录 创建虚拟环境 进入虚拟环境 安装Jupyter notebook 安装matplotlib 安装 pandas 创建虚拟环境 基于conda包的环境创建、激活、管理与删除http://t.cs…

(实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee

★硬件资源&#xff1a;本文章以STM32L431RCT6做主控芯片做验证&#xff1b; ★IDE开发环境&#xff1a;RT Thread stdio&#xff1b; ★RT Thread 版本&#xff1a;V4.0.3 一、RT Thread Stdio加载软件包 1、如下图所示&#xff0c;通过RT Thread Stdio加载的软件包&#…

gd32发送数据,定义参数,接收中断

void usart_receive_data(uint8_t ucch) {usart_data_receive(UART3); } void usart_send_data(uint8_t ucch) {usart_data_transmit(UART3,(uint8_t)ucch);while(usart_flag_get(UART3,USART_FLAG_TBE) RESET); } 这是在c文件中定义函数&#xff0c;之后在h文件中声明&#…