解决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_folder
        zip_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 文件,则重命名为 .txt
            if 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.text
            domain_prop = sampler.find(".//stringProp[@name='HTTPSampler.domain']")
            if domain_prop is not None:
                domain_prop.text = domain_value
    tree.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   002
        new_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标头管理器XML
            header_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)
    # 将提取的文件重命名为 .txt
    convert_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、结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言 | Leetcode C语言题解之第236题二叉树的最近公共祖先

题目&#xff1a; 题解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/typedef struct road_t {struct TreeNode *road_node; // 途径路径struct road_t *p_next; }…

[IDEA插件] JarEditor 编辑jar包(直接新增、修改、删除jar包内的class文件)

文章目录 1. 安装插件 JarEditor2. 在IDEA中添加外部JAR包3. JarEditor 使用介绍 之前我们需要修改jar内文件的时候需要解压jar包&#xff0c;反编译class&#xff0c;新建java源文件&#xff0c;修改代码&#xff0c;再编译成class&#xff0c;替换jar包内的class文件。 现在…

MongoDB教程(三):mongoDB用户管理

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、MongoD…

P2p网络性能测度及监测系统模型

P2p网络性能测度及监测系统模型 网络IP性能参数 IP包传输时延时延变化误差率丢失率虚假率吞吐量可用性连接性测度单向延迟测度单向分组丢失测度往返延迟测度 OSI中的位置-> 网络层 用途 面相业务的网络分布式计算网络游戏IP软件电话流媒体分发多媒体通信 业务质量 通过…

JavaSE 面向对象程序设计进阶 IO 压缩流 解压缩流

目录 解压缩流 压缩流 解压缩流 压缩包 压缩包里面的每一个文件在java中都是一个ZipEntry对象 把每一个ZipEntry按照层级拷贝到另一个文件夹当中 import java.io.*; import java.util.Date; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream;public cl…

水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集)

水表数字识别2&#xff1a;Pytorch DBNet实现水表数字检测(含训练代码和数据集) 目录 水表数字识别2&#xff1a;Pytorch DBNet实现水表数字检测(含训练代码和数据集) 1.前言 2. 水表数字识别的方法 3. 水表数字识别数据集 4. 水表数字分割模型训练 &#xff08;1&#x…

OpenCV解决验证码(数字和字母)识别(Python)

文章目录 前言一、准备验证码图片 前言 OpenCV是一个基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库。它支持Windows、Linux、Mac OS、Android和iOS等多个操作系统&#xff0c;提供了丰富的图像处理和计算机视觉功能&#xff0c;包括但…

基于JAVA的网上招聘系统的设计与实现

点击下载源码 网上招聘系统的设计与实现 摘 要 随着时代的发展&#xff0c;中国的互联网技术愈加成熟&#xff0c;已经有越来越多的社会群体开始学会使用互联网技术&#xff0c;整个社会正在朝着智能化、信息化的方向前进。有了互联网&#xff0c;用户便可以足不出户地利用互…

【TOOLS】Chrome扩展开发

Chrome Extension Development 1. 入门教程 入门案例&#xff0c;可以访问【 谷歌插件官网官方文档 】查看官方入门教程&#xff0c;这里主要讲解大概步骤 Chrome Extenson 没有固定的脚手架&#xff0c;所以项目的搭建需要根据开发者自己根据需求搭建项目&#xff08;例如通过…

性能测试(1)

性能测试的概念 性能测试的策略 基准测试 负载测试 稳定性测试 并发测试 压力测试 基准测试 负载测试 1.满足性能指标 2.最大 3.多组数据 一步步增加 满足需求 1.达不到要求 先改bug 2.达到了 则就按其要求10即可 资源是有限的 吞吐量 直接体现性能能力 处理能力 前面资源…

大模型数据标注:驱动人工智能进化的基石

在人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;领域&#xff0c;数据标注是构建高性能模型不可或缺的一环&#xff0c;尤其是对于那些依赖海量数据的大模型而言。 随着深度学习技术的突飞猛进&#xff0c;大模型的规模和复杂度达到了前所未有的水平…

每日Attention学习11——Lightweight Dilated Bottleneck

模块出处 [TITS 23] [link] [code] Lightweight Real-Time Semantic Segmentation Network With Efficient Transformer and CNN 模块名称 Lightweight Dilated Bottleneck (LDB) 模块作用 改进的编码器块 模块结构 模块代码 import torch import torch.nn as nn import to…

Qt Quick qml自定义控件:qml实现电池控件

qml入门进阶专栏地址:https://blog.csdn.net/yao_hou/category_9951228.html?spm=1001.2014.3001.5482 本篇博客介绍如何使用qml来实现电池控件,效果图如下: 下面给出实现代码 Battery.qml /*电池组件*/import QtQuick 2.15 import QtQuick.Controls 2.15Rectangle {id: b…

Python:setattr()函数和__setattr__()魔术方法

相关阅读 Pythonhttps://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 setattr()是一个python内置的函数&#xff0c;用于设置一个对象的属性值&#xff0c;一般情况下&#xff0c;可以通过点运算符(.)完成相同的功能&#xff0c;但是getat…

大模型系列3--pytorch dataloader的原理

pytorch dataloader运行原理 1. 背景2. 环境搭建2.1. 安装WSL & vscode2.2. 安装conda & pytorch_gpu环境 & pytorch 2.112.3 命令行验证python环境2.4. vscode启用pytorch_cpu虚拟环境 3. 调试工具3.1. vscode 断点调试3.2. py-spy代码栈探测3.3. gdb attach3.4. …

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(十一)-无人机服务可用性用例需求

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

基于信号处理的PPG信号滤波降噪方法(MATLAB)

光电容积脉搏波PPG信号结合相关算法可以用于人体生理参数检测&#xff0c;如血压、血氧饱和度等&#xff0c;但采集过程中极易受到噪声干扰&#xff0c;对于血压、血氧饱和度测量的准确性造成影响。随着当今社会医疗保健技术的发展&#xff0c;可穿戴监测设备对于PPG信号的质量…

01-Fiddler的下载、安装和配置

一、Fiddler的下载 官网下载地址&#xff1a;https://www.telerik.com/download/fiddler。 下载之后&#xff0c;傻瓜式安装即可。 二、Fiddler的抓包原理 Fiddler相当于是一个“中间人”&#xff0c;客户端发送请求时&#xff0c;会先将请求发给Fiddler&#xff0c;Fiddler再把…

C字符串和内存函数介绍(三)——其他的字符串函数

在#include<string.h>的这个头文件里面&#xff0c;除了前面给大家介绍的两大类——长度固定的字符串函数和长度不固定的字符串函数。还有一些函数以其独特的用途占据一席之地。 今天要给大家介绍的是下面这三个字符串函数&#xff1a;strstr&#xff0c;strtok&#xf…

数据结构——查找(线性表的查找与树表的查找)

目录 1.查找 1.查找的基本概念 1.在哪里找&#xff1f; 2.什么查找&#xff1f; 3.查找成功与否&#xff1f; 4.查找的目的是什么&#xff1f; 5.查找表怎么分类&#xff1f; 6.如何评价查找算法&#xff1f; 7.查找的过程中我们要研究什么&#xff1f; 2.线性表…