攻防演练目标资产名称纠正
字数 1128 2025-10-01 14:05:44

攻防演练目标资产名称自动纠错工具教学文档

一、背景与需求

在攻防演练过程中,经常遇到目标单位名称不准确的情况,例如:

  • 使用简称而非全称(如"浙江中医六院"代替完整名称)
  • 单位已更名但备案信息未更新
  • 各种命名不规范问题

手动纠正在攻防演练前期阶段效率低下,影响资产搜集速度,需要自动化解决方案。

二、技术方案选择

2.1 可用平台对比

  • 爱企查/天眼查:参数校验严格,难以实现自动化抓取
  • Riskbird:参数校验相对宽松,适合自动化实现

2.2 最终选择

选择 https://riskbird.com/ 作为数据源,通过模拟API请求实现批量查询。

三、核心代码实现

3.1 基础请求函数

import requests
import json

def req_riskbird(company_name, token):
    """
    向Riskbird发送查询请求获取公司信息
    
    参数:
    company_name: 要查询的公司名称
    token: 用户认证token
    
    返回:
    公司名称列表或空列表
    """
    url = "https://riskbird.com/riskbird-api/newSearch"
    
    headers = {
        "Host": "riskbird.com",
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
        "Accept": "application/json",
        "App-Device": "WEB",
        "Content-Type": "application/json",
        "Origin": "https://riskbird.com",
        "Referer": "https://riskbird.com/search/company",
        "Accept-Language": "zh-CN,zh;q=0.9",
        "Cookie": f"token={token}; app-device=WEB;"
    }
    
    payload = {
        "queryType": "1",
        "searchKey": company_name,
        "pageNo": 1,
        "range": 10,
        "selectConditionData": "{\"status\":\"\",\"sort_field\":\"\"}"
    }
    
    try:
        response = requests.post(url, headers=headers, json=payload)
        response.raise_for_status()
        
        data = response.json()
        
        if data.get("code") == 20000 and data.get("success"):
            company_names = []
            for company in data.get("data", {}).get("list", []):
                if "entName" in company:
                    company_names.append(company["entName"])
            return company_names
        else:
            print(f"Error: {data.get('msg', 'Unknown error')}")
            return []
            
    except requests.exceptions.RequestException as e:
        print(f"Request failed: {e}")
        return []
    except json.JSONDecodeError:
        print("Failed to parse response as JSON")
        return []

3.2 公司名称匹配选择函数

def compare_company(company_name, num, token):
    """
    根据用户选择模式返回匹配的公司名称
    
    参数:
    company_name: 原始公司名称
    num: 选择模式(1-自动选择最高匹配, 2-手动选择)
    token: 用户认证token
    
    返回:
    选择后的公司名称列表
    """
    company_names = req_riskbird(company_name, token)
    
    if not company_names:
        print("未找到相关公司:", company_name)
        return []
    
    if num == 1:
        return [company_names[0]]
    elif num == 2:
        print("以下是搜索到的所有公司名称:")
        for i, name in enumerate(company_names, 1):
            print(f"{i}. {name}")
        
        try:
            print("搜索单位:", company_name)
            selected = int(input("请输入选择的公司编号:"))
            if 1 <= selected <= len(company_names):
                return [company_names[selected - 1]]
            else:
                print("无效的选择")
                return []
        except ValueError:
            print("无效的输入")
            return []
    else:
        print("无效的 num 参数")
        return []

3.3 文件读取函数

def read_file():
    """
    读取同目录下的tar.txt文件,将每行内容存入列表
    
    返回:
    包含所有公司名称的列表
    
    异常:
    FileNotFoundError: 文件不存在
    IOError: 文件读取失败
    """
    company_list = []
    
    try:
        with open('tar.txt', 'r', encoding='utf-8') as file:
            for line in file:
                company_name = line.strip()
                if company_name:
                    company_list.append(company_name)
        return company_list
        
    except FileNotFoundError:
        raise FileNotFoundError("错误:tar.txt 文件不存在")
    except IOError:
        raise IOError("错误:无法读取 tar.txt 文件")
    except Exception as e:
        raise Exception(f"读取文件时发生错误: {str(e)}")

四、使用流程

4.1 准备工作

  1. 获取Riskbird账号并登录,从浏览器开发者工具获取token
  2. 创建tar.txt文件,每行写入一个需要纠正的公司名称

4.2 执行流程

  1. 调用read_file()读取目标公司列表
  2. 遍历列表,对每个公司名称调用compare_company()函数
  3. 根据需求选择自动模式(1)或手动模式(2)
  4. 获取纠正后的准确公司名称

4.3 实际应用示例

输入:"浙江省中山医院"
输出:"浙江中医药大学附属第三医院(浙江省中山医院)"

五、关键技术要点

5.1 请求头设置

  • 必须设置正确的User-Agent模拟浏览器行为
  • Cookie中需要包含有效的token认证信息
  • Content-Type必须设置为application/json

5.2 错误处理

  • 网络请求异常处理
  • JSON解析异常处理
  • API返回错误码处理
  • 文件操作异常处理

5.3 数据提取

  • 从返回的JSON数据中提取entName字段
  • 处理分页数据(当前代码设置为10条/页)

六、优化建议

6.1 功能扩展

  • 添加批量处理模式,支持大量公司名称一次性处理
  • 增加结果导出功能,支持导出为Excel或CSV格式
  • 添加相似度匹配算法,提高自动选择的准确性

6.2 稳定性提升

  • 添加请求重试机制
  • 实现token自动刷新功能
  • 添加速率限制,避免请求过于频繁被封禁

6.3 用户体验

  • 添加进度显示功能
  • 实现交互式命令行界面
  • 添加日志记录功能

七、注意事项

  1. 遵守Riskbird平台的使用条款,避免过度频繁请求
  2. 注意token的保密性,不要泄露在代码中
  3. 该工具仅限合法授权的攻防演练使用
  4. 平台API可能有变更,需要定期维护更新

八、总结

本工具通过自动化查询Riskbird平台,有效解决了攻防演练中目标资产名称不准确的问题,显著提高了资产搜集阶段的效率。工具采用模块化设计,便于扩展和维护,可根据实际需求选择自动或手动匹配模式。

攻防演练目标资产名称自动纠错工具教学文档 一、背景与需求 在攻防演练过程中,经常遇到目标单位名称不准确的情况,例如: 使用简称而非全称(如"浙江中医六院"代替完整名称) 单位已更名但备案信息未更新 各种命名不规范问题 手动纠正在攻防演练前期阶段效率低下,影响资产搜集速度,需要自动化解决方案。 二、技术方案选择 2.1 可用平台对比 爱企查/天眼查 :参数校验严格,难以实现自动化抓取 Riskbird :参数校验相对宽松,适合自动化实现 2.2 最终选择 选择 https://riskbird.com/ 作为数据源,通过模拟API请求实现批量查询。 三、核心代码实现 3.1 基础请求函数 3.2 公司名称匹配选择函数 3.3 文件读取函数 四、使用流程 4.1 准备工作 获取Riskbird账号并登录,从浏览器开发者工具获取token 创建tar.txt文件,每行写入一个需要纠正的公司名称 4.2 执行流程 调用read_ file()读取目标公司列表 遍历列表,对每个公司名称调用compare_ company()函数 根据需求选择自动模式(1)或手动模式(2) 获取纠正后的准确公司名称 4.3 实际应用示例 输入:"浙江省中山医院" 输出:"浙江中医药大学附属第三医院(浙江省中山医院)" 五、关键技术要点 5.1 请求头设置 必须设置正确的User-Agent模拟浏览器行为 Cookie中需要包含有效的token认证信息 Content-Type必须设置为application/json 5.2 错误处理 网络请求异常处理 JSON解析异常处理 API返回错误码处理 文件操作异常处理 5.3 数据提取 从返回的JSON数据中提取entName字段 处理分页数据(当前代码设置为10条/页) 六、优化建议 6.1 功能扩展 添加批量处理模式,支持大量公司名称一次性处理 增加结果导出功能,支持导出为Excel或CSV格式 添加相似度匹配算法,提高自动选择的准确性 6.2 稳定性提升 添加请求重试机制 实现token自动刷新功能 添加速率限制,避免请求过于频繁被封禁 6.3 用户体验 添加进度显示功能 实现交互式命令行界面 添加日志记录功能 七、注意事项 遵守Riskbird平台的使用条款,避免过度频繁请求 注意token的保密性,不要泄露在代码中 该工具仅限合法授权的攻防演练使用 平台API可能有变更,需要定期维护更新 八、总结 本工具通过自动化查询Riskbird平台,有效解决了攻防演练中目标资产名称不准确的问题,显著提高了资产搜集阶段的效率。工具采用模块化设计,便于扩展和维护,可根据实际需求选择自动或手动匹配模式。