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

news2025/3/2 4:39:03

解决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、结果

在这里插入图片描述

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

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

相关文章

springboot轻松音乐-计算机毕业设计源码48092

目 录 摘要 1 绪论 1.1研究背景与意义 1.2研究现状 1.3论文结构与章节安排 2 基于微信小程序的轻松音乐系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.3 系统用例分析 2.4 系统…

将charles证书放置根文件夹目录下

一:证书导出重命名 先将charles证书导出,然后使用下列命令将charles证书文件重命名 openssl x509 -inform DER -subject_hash_old -in FiddlerRoot.cer 将文件命名为e5472ab9.0 二:文件移动 我在一台pixcel 5尝试将charles证书移动到安卓跟文件目录下,即显示文件只可读不可…

知识链:知识图谱提升大模型的推理能力,解决多个知识点结合推理时出错

知识链&#xff1a;知识图谱提升大模型的推理能力&#xff0c;解决多个知识点结合推理时出错 提出背景解法拆解逻辑链 CoK 框架hop 步骤处理肺炎疑似病例2-hop规则的应用3-hop规则的应用4-hop规则的应用CoK&#xff08;T&E&#xff09;方法的优势 CoK 算法步骤数据集构建 知…

什么是工业4.0?

在当今这个日新月异的时代&#xff0c;科技的每一次飞跃都深刻地改变着我们的生活与工作方式。而在这场全球性的变革中&#xff0c;工业4.0不仅代表了制造业的未来趋势&#xff0c;更是全球经济发展的新引擎。那么&#xff0c;究竟什么是工业4.0&#xff1f;它如何重塑我们的工…

nginx正向代理、反向代理、负载均衡

nginx.conf nginx首要处理静态页面 反向代理 动态请求 全局模块 work processes 1; 设置成服务器内核数的两倍&#xff08;一般不不超过8个超过8个反而会降低性能一般4个 1-2个也可以&#xff09; netstat -antp | grep 80 查端口号 *1、events块&#xff1a;* 配置影响ngi…

赛迪顾问ITSS服务经理发布多项2024年IT趋势报告

在深入探讨算力、工业控制系统、网络安全、数据治理、人工智能、数字化转型、5G通信等12大IT关键领域的基础上&#xff0c;赛迪顾问ITSS服务经理于1月16日以“乘势而上&#xff0c;及锋而试”为主题&#xff0c;成功举办了2024年IT趋势发布会。 会议聚焦IT行业的新技术、新模式…

p14数组(2)

数组作为函数的参数 冒泡排序 两两比较 void bubble_sort(int arr[],int sz) {int i0;for(i0;i<sz-1;i){//每一趟冒泡排序int j0;for(j0;j<sz-1-i;j){if(arr[j]>arr[j1]){int tmparr[j];arr[j]arr[j1];arr[j1]tmp;}}} } int main(){int arr[]{9,8,7,6,5,4,3,2,1,0}…

镜像加速方法

参考&#xff1a; https://github.com/DaoCloud/public-image-mirror 使用DaoCloud加速&#xff1a; 比如我想在dockerhub下载这个镜像&#xff1a; 本来的命令是&#xff1a; docker pull openjdk:11.0-jdk-slim-buster在要拉取的镜像前&#xff0c;添加前缀&#xff1a;m.…

网络安全从业人员必知的ClamAV工具(非常详细)零基础入门到精通,收藏这一篇就够了

一、引言 ClamAV&#xff08;Clam AntiVirus&#xff09;是一个开源的防病毒工具&#xff0c;广泛应用于网络安全领域。它的主要功能包括病毒扫描、恶意软件检测、以及电子邮件网关的病毒防护。ClamAV以其高效的性能和灵活的配置选项&#xff0c;成为网络安全从业人员的重要工…

护眼台灯真的护眼吗?一起看台灯的功能作用有哪些

长时间近距离用眼、长时间阅读书籍、长时间处于不良姿势下阅读或写作&#xff0c;都可能导致眼部调节过度&#xff0c;从而引起近视。近视不仅影响个人生活质量&#xff0c;还可能限制职业选择&#xff0c;甚至增加眼部疾病的风险。因此&#xff0c;从日常细节入手&#xff0c;…

IoC源码分析——singleton bean创建与循环依赖

文章目录 概要主流程bean的创建循环依赖 概要 容器初始化时&#xff0c;会创建单例bean&#xff0c;本文主要关注单例bean是如何创建的&#xff0c;并说明源码中是如何解决循环依赖的 代码入口 Testpublic void testIoC() {// ApplicationContext是容器的高级接口&#xff0c…

qcom 平台efuse机器抓取dump log的方法

引言&#xff1a; qcom 平台机器&#xff0c;一旦efuse后机器将无法抓取dump log qcom 原文&#xff1a; efuse机器抓取dump log的方法如下&#xff1a; 一、修改配置文件&#xff1a; 把kamorta_debugpolicy.xml 在配置了debugpolicy&#xff08;加入串号和打开开关&#x…

前端进阶全栈计划:Java基础语法

前言 本教程旨在帮助初学者系统地掌握Java的基础知识。我们将从Java的基本语法开始&#xff0c;逐步深入到面向对象编程、异常处理、多线程编程等核心概念。无论你是编程新手&#xff0c;还是希望夯实基础的开发者&#xff0c;这份指南都将带你走进Java的世界&#xff0c;打下坚…

安全防御---防火墙实验1

安全防御—防火墙实验1 一、实验拓扑与要求 要求&#xff1a; 1、DMZ区内的服务器&#xff0c;办公区仅能在办公时间内&#xff08;9&#xff1a;00-18:00)可以访问&#xff0c;生产区的设备全天可以访问 2、生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 …

TQSDRPI开发板教程:编译openwifi工程

本例程基于SDRPI开发板&#xff0c;在Ubuntu中使用vivado编译openwifi工程&#xff0c;最终生成BOOT.BIN文件。需要拥有安装vivado2021.1版本的ubuntu系统或虚拟机。 首先需要下载openwifi的编译文件&#xff0c;可以在GitHub中搜索openwifi-hw&#xff0c;网址如下所示&#…

Python基础教学之一:入门篇——迈入编程世界的第一步

Python基础教学之一&#xff1a;入门篇——迈入编程世界的第一步 一、Python简介&#xff1a;历史与现状 Python&#xff0c;一种解释型、高级和通用的编程语言&#xff0c;由Guido van Rossum在1989年圣诞节期间创造&#xff0c;并于1991年首次发布。设计哲学强调代码的可读性…

Centos9安装部署及静态ip配置方案

一、获取centos9的iso镜像 去官网 点击download 官网 点击x86&#xff0c;下载centos9 二、创建虚拟机 1、点击新建虚拟机 2、选择自定义 下一步 3、点击下一步 4、选择稍后安装操作系统 点击下一步 5、选择linux 选择要安装的centos 版本 这里选择centos7 6、设置虚拟…

顺序结构 ( 五 ) —— 数据输入输出 【互三互三】

文章目录 &#x1f341;序 &#x1f341;一、字符输入函数getchar &#x1f341;二、字符输出函数putchar &#x1f341;三、通过cout流输出数据 &#x1f341;四、通过cin流读入数据 &#x1f341;五、格式化输入函数scanf &#x1f341;六、格式化输出函数printf &…

最简单的vue3组件之间传值

localStorage 是 HTML5 引入的一个 Web Storage API 的一部分&#xff0c;它允许网页在用户的浏览器上存储数据。localStorage 提供了一种持久化的本地存储方案&#xff0c;数据不会因为浏览器关闭而丢失&#xff0c;除非用户或脚本显式地删除它们。 localStorage 是一种非常实…

代码架构你想过吗?

过去的一段时间&#xff0c;我常发现我接手的服务、自己从0开始搭建起来的服务&#xff0c;整个服务代码的架构都比较混乱&#xff0c;很难去维护迭代。常见的有两种 平铺在根目录的。层次不清晰的&#xff0c;逻辑分别散落在各个层次中 我经过一段时间的分析&#xff0c;我总…