Nessus报告翻译

Nessus报告翻译(英译中)

提示:借助百度翻译API翻译,每个月免费一百万字符翻译



前言

1、先准备报告模板: https://wwk.lanzn.com/i59zm1zwb9qf
在这里插入图片描述
2、安装需要的库

certifi==2024.2.2
charset-normalizer==3.3.2
colorama==0.4.6
idna==3.7
lxml==5.2.2
numpy==1.24.4
pandas==2.0.3
python-dateutil==2.9.0.post0
python-docx==1.1.2
pytz==2024.1
requests==2.32.2
six==1.16.0
tqdm==4.66.4
typing_extensions==4.12.0
tzdata==2024.1
urllib3==2.2.1

复制以上内容保存到一个requirements文件中,在cmd执行以下命令

pip install -r requirements.txt

3、获取一个百度翻译的api:https://api.fanyi.baidu.com/
在这里插入图片描述


一、使用Python调用百度api进行nessus翻译

1.目录结构

在这里插入图片描述
创建一个文件夹,里面固定文件2个:
1、漏洞扫描报告模板.docx
2、python脚本文件,既图中的test.py

翻译的时候需要把nessus导出的csv文件放入同一文件夹,执行脚本之后就会生成一个同名字的docx文件,如果上图所示。

2.完整代码如下(代码执行前先填百度翻译的key)

import os
import time
import random
import hashlib
import requests
import configparser
import pandas as pd
from tqdm import tqdm
from docx import Document
from docx.oxml.ns import qn
from docx.shared import Pt
from docx.shared import RGBColor


# 百度翻译api
def translate(text, from_lang='auto', to_lang='zh'):
    appid = 'xx'  # 替换为你的 APP ID
    secretKey = 'xxxx'  # 替换为你的密钥
    myurl = '/api/trans/vip/translate'
    salt = random.randint(32768, 65536)
    sign = appid + text + str(salt) + secretKey
    sign = hashlib.md5(sign.encode()).hexdigest()
    url = 'http://api.fanyi.baidu.com' + myurl
    params = {
        'appid': appid,
        'q': text,
        'from': from_lang,
        'to': to_lang,
        'salt': str(salt),
        'sign': sign
    }

    try:
        response = requests.get(url, params=params)
        result = response.json()
        return result['trans_result'][0]['dst']
    except Exception as e:
        print(e)
        return text

# 设置字体大小,宋体
def set_font(paragraph, font_name='宋体',font_size=None,bold=True, italic=False):
    for run in paragraph.runs:
        run.font.name = font_name
        run._element.rPr.rFonts.set(qn('w:eastAsia'), font_name)
        if font_size is not None:
            run.font.size = Pt(font_size)
        run.bold = bold
        run.italic = italic
        run.font.color.rgb = RGBColor(0, 0, 0)

def add_tables(host,risk_counts):
    # 选择表格
    table = doc.tables[2]

    # 添加一行到表格底部
    new_row = table.add_row()
    new_row.cells[0].text = host

    # 使用get方法获取值,如果键不存在,则返回默认值0
    new_row.cells[1].text = str(risk_counts.get('Critical', 0))
    new_row.cells[2].text = str(risk_counts.get('High', 0))
    new_row.cells[3].text = str(risk_counts.get('Medium', 0))
    new_row.cells[4].text = str(risk_counts.get('Low', 0))
    # 计算总数,需要减去等级为None的部分
    new_row.cells[5].text = str(sum(risk_counts.values) - risk_counts.get('None',0) )

# 更新表格
def update_tables(unique_hosts_list):
    table = doc.tables[2]
    for host in unique_hosts_list:
        for row in table.rows:
            if row.cells[0].text == host:
                for cell in row.cells[1:]:
                    cell.text = '0'

# 删除没有危害等级主机标题
def delete_title(unique_hosts_list):
    for paragraph in doc.paragraphs:
        # 检查段落是否是二级标题(level == 2if paragraph.style.name.startswith('Heading 2'):
            host_ip = paragraph.text

            # 如果标题文本不在提供的主机列表中,则删除该标题
            if str(host_ip) in unique_hosts_list:
                doc._body._element.remove(paragraph._element)

def add_num():
    two_number = 0
    three_num = 0
    four_num = 0
    for para in doc.paragraphs:

        if para.style.name.startswith('Heading 2'):
            two_number += 1
            three_num = 0  # 将三级标题序号的初始化移到处理新的二级标题的位置
            para.text = f"2.{two_number} {para.text}"
            # print(para.text)

        elif para.style.name.startswith('Heading 3'):
            three_num += 1
            four_num = 0
            para.text = f"2.{two_number}.{three_num} {para.text}"

            # print(para.text)
        #
        elif para.style.name.startswith('Heading 4'):
            four_num += 1
            para.text = f"2.{two_number}.{three_num}.{four_num} {para.text}"
        #     print(para.text)



# 找到对应位置添加内容
def add_context(csv_path):
    # 读取CSV文件
    df = pd.read_csv(csv_path)
    hosts = df['Host'].unique()

    # 生成所以ip的列表并去重
    unique_hosts_list = df['Host'].unique().tolist()


    risk_name = {'Low': '低危', 'Medium': '中危', 'High': '高危', 'Critical': '紧急'}


    for host in tqdm(hosts, desc="Processing hosts"):

        names = df[df['Host'] == host]['Name'].tolist()
        risks = df[df['Host'] == host]['Risk'].tolist()
        scores = df[df['Host'] == host]['CVSS v2.0 Base Score'].tolist()
        cves = df[df['Host'] == host]['CVE'].tolist()
        ports = df[df['Host'] == host]['Port'].tolist()
        descriptions = df[df['Host'] == host]['Description'].tolist()  # 描述
        solutions = df[df['Host'] == host]['Solution'].tolist()  # 解决方案
        # 统计危险等级和
        risk_counts = df[df['Host'] == host]['Risk'].value_counts()

        # 添加危险等级数量
        add_tables(host, risk_counts)

        for para in doc.paragraphs:

            if para.text == '安全风险状况等级说明':
                # 添加ip标题
                host_title = para.insert_paragraph_before(host, style='Heading 2')
                set_font(host_title, font_size=18)


                for score, name, cve, port, risk, description, solution in zip(scores, names, cves, ports, risks, descriptions,solutions):

                    # 如果分数为空或者0和端口为0的跳过
                    if pd.isna(score) or score == 0 or port == 0:
                        continue


                    # 如果cve为空替换成空格
                    if pd.isna(cve):
                        cve = ''

                    name = translate(name)
                    name_title = para.insert_paragraph_before(name,style='Heading 3')
                    set_font(name_title, font_size=16)


                    # 四级标题和内容
                    for heading_text, content in [('主机-端口', f"{host}:{port}"),
                                                  ('CVE', str(cve)),
                                                  ('威胁程度', risk_name[risk]),
                                                  ('描述', translate(description.replace('\n', ' '))),
                                                  ('解决方案', translate(str(solution).replace('\n', ' ').replace('-', '')))
                                                  ]:

                        # 保留没有危害的主机
                        if host in unique_hosts_list:
                            unique_hosts_list.remove(host)

                        heading = para.insert_paragraph_before(heading_text, style='Heading 4')
                        set_font(heading, font_size=14)

                        content = f"    {content}"
                        paragraph = para.insert_paragraph_before(content)
                        # 设置段落前后间距(以磅为单位)
                        paragraph.paragraph_format.space_before = Pt(3)
                        paragraph.paragraph_format.space_after = Pt(3)
                        set_font(paragraph, font_size=10.5, bold=False)

    # 更新表格,把没有危害等级的主机全部设置为0
    update_tables(unique_hosts_list)
    # 删除没有漏洞的主机ip标题
    delete_title(unique_hosts_list)
    # 添加序号
    add_num()

if __name__ == '__main__':
    # 读取模板文件
    doc = Document("漏洞扫描报告模板.docx")
    start = time.time()
    print('开始翻译')
    # 获取csv文件名
    csv_file_name_list = [file for file in os.listdir() if file.endswith('.csv')]
    for csv_path in csv_file_name_list:
        add_context(csv_path)

        # 保存Word文档
        doc.save(csv_path.replace('.csv','.docx'))

    end = time.time()
    print('翻译结束,用时:{}秒'.format(int(end-start)))

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值