标注平台辅助校准

对AI研判内容有问题点击选择问题

// ==UserScript==
// @name         标注平台辅助校准
// @version      0.5
// @description  对AI研判内容有问题点击选择问题
// @author       my
// @match        *://qgpt-mark.skyeye.qianxin-inc.cn/*
// @require      http://libs.baidu.com/jquery/2.0.0/jquery.min.js
// @require      https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js
// @require      https://cdn.jsdelivr.net/npm/[email protected]/lib/index.min.js
// @require      https://unpkg.com/react-trigger-change/dist/react-trigger-change.js
// @license MIT
// @namespace https://greasyfork.org/users/1362442
// ==/UserScript==


class MarkTool {


    constructor() {
        console.log("这是构造函数");
    }

    run() {
        var that = this;
        // 设置定时器,定时添加各种按钮
        window.setInterval(function () {
            if (window.location.href.indexOf("/data-management/mark-data/list/calibrate/") != -1) {
                that.addRemoveEmptyLineBtn();
                that.addSuggestionSelect();
            }
        }, 1000);

    }
    addSuggestionSelect() {
        // 级联选择器
        const template = `
    <div class="suggestion-select1">
    <el-cascader
      v-model="value"
      :options="options"
      :props="{ expandTrigger: 'hover' }"
      @change="handleChange"
      clearable></el-cascader>
  </div>
    `;
        if (!document.querySelector(".suggestion-select1")) {
            var header = document.querySelector(
                "#pane-model > div > div:nth-child(4) > div.header > div > div.item-header-left"
            );
            if (header) {
                var that = this;
                console.log("找到元素");
                const div = document.createElement("div");
                div.innerHTML = template;

                header.append(div);
            }
        }
    }

    // 增加去除空行按钮
    addRemoveEmptyLineBtn() {
        var that = this;
        if (!document.querySelector(".my-remove-empty-line")) {
            let header = document.querySelector(
                "#pane-model > div > div:nth-child(4) > div.header > div > div.item-header-left"
            );
            if (header) {
                //var div = document.createElement('div')
                let removeEmptyLineBtn = document.createElement("button");
                removeEmptyLineBtn.type = "button";
                removeEmptyLineBtn.onclick = function () {
                    //this.preventDefault();
                    console.log("点击了去除空行");
                    that.del_suggestion_empty_line();
                };
                removeEmptyLineBtn.className =
                    "q-button q-button--primary q-button--mini my-remove-empty-line";
                let span = document.createElement("span");
                span.textContent = "删除空行&序号重排";
                removeEmptyLineBtn.appendChild(span);
                header.append(removeEmptyLineBtn);
            }
        }
    }

    del_suggestion_empty_line() {
        var that = this;
        let value = that.get_suggestion();
        console.log("1211:", value);
        if (value.length == 0) {
        } else {
            // 去掉开头的空格
            value = value.trim();

            // 将连续的多个换行符替换为一个换行符
            value = value.replace(/\n+/g, "\n");

            // 重新计算编号
            let n = 1;
            value = value.replace(/^\d{1,2}\.\s/gm, () => {
                return `${n++}. `;
            });
            console.log("del_suggestion_empty_line:", value);
            that.setSuggestion(value);
        }
    }

    setSuggestion(selectedValue) {
        const textarea = document.querySelector("#pane-model > div > div:nth-child(5) > div > textarea");
        if (textarea) {
            console.log("textarea:", textarea);
            // 清空文本框内容
            textarea.value = '';
            // 更新文本区域的值
            textarea.focus();

            document.execCommand('insertText', false, selectedValue);

            // 可选:在控制台打印最终内容以进行调试
            console.log("Final content:", selectedValue);
        }
        else {
            console.log("没有找到textarea");
        }
    }
    get_suggestion() {
        let suggestionMarkdownEle = document.querySelector(
            "#pane-model > div > div:nth-child(5) > div > textarea"
        );
        if (suggestionMarkdownEle) {

            let value = suggestionMarkdownEle.value;
            return value;
        } else {
            return "";
        }
    }


}

function addElementUICSS() {
    const link = document.createElement("link");
    link.rel = "stylesheet";
    link.type = "text/css";
    link.href =
        "https://cdn.jsdelivr.net/npm/[email protected]/lib/theme-chalk/index.min.css";
    document.head.appendChild(link);
}
function findyanpanSelectElement() {
    console.log("油猴脚本测试");
    // 建议选择器的vue渲染
    const element = document.querySelector(".suggestion-select1");
    const vue_element = document.querySelector(".el-input.el-input--suffix");
    const jiaozhun_btn = document.querySelector(
        "#pane-model > div > div:nth-child(2) > div.header > div > div.radio > div > label:nth-child(1) > span.q-radio__label"
    );
    if (jiaozhun_btn && element && !vue_element) {
        console.log("渲染建议选择");
        var Main = {
            data() {
                return {
                    currentNumber: 1,
                    showLoading: false,
                    value: [],
                    options: [
                        {
                            value: "缺少信息",
                            label: "缺少信息",
                            children: [
                                {
                                    value: "缺少Payload分析",
                                    label: "缺少Payload分析",
                                },
                                {
                                    value: "缺少Payload对应的攻击者意图判断",
                                    label: "缺少Payload对应的攻击者意图判断",
                                },
                                {
                                    value: "缺少Payload攻击成功的判断原理",
                                    label: "缺少Payload攻击成功的判断原理",
                                },
                                {
                                    value: "缺少判断报文中的Payload是否攻击成功",
                                    label: "缺少判断报文中的Payload是否攻击成功",
                                },
                                {
                                    value: "缺少结论",
                                    label: "缺少结论",
                                },
                            ],
                        },
                        {
                            value: "分析错误",
                            label: "分析错误",
                            children: [
                                {
                                    value: "告警介绍内容错误",
                                    label: "告警介绍内容错误",
                                },
                                {
                                    value: "payload分析错误",
                                    label: "payload分析错误",
                                },
                                {
                                    value: "攻击者意图分析错误",
                                    label: "攻击者意图分析错误",
                                },
                                {
                                    value: "成功原理分析错误",
                                    label: "成功原理分析错误",
                                },
                                {
                                    value: "报文中的Payload是否攻击成功分析错误",
                                    label: "报文中的Payload是否攻击成功分析错误",
                                },
                                {
                                    value: "结论错误",
                                    label: "结论错误",
                                },
                            ],
                        },
                        {
                            value: "模型问题",
                            label: "模型问题",
                            children: [
                                {
                                    value: "模型幻觉",
                                    label: "模型幻觉",
                                },
                                {
                                    value: "模型异常错误",
                                    label: "模型异常错误",
                                }
                            ],
                        },
                        {
                            value: "其他",
                            label: "其他",
                            children: [
                                {
                                    value: "解码错误",
                                    label: "解码错误",
                                },
                                {
                                    value: "计算错误",
                                    label: "计算错误",
                                },
                                {
                                    value: "格式错误",
                                    label: "格式错误",
                                },
                                {
                                    value: "非脆弱性类告警",
                                    label: "非脆弱性类告警",
                                },
                                {
                                    value: "非业务/误报类告警",
                                    label: "非业务/误报类告警",
                                },
                                {
                                    value: "非需要核实类告警",
                                    label: "非需要核实类告警",
                                },
                                {
                                    value: "非情报类告警",
                                    label: "非情报类告警",
                                },
                                {
                                    value: "非攻击类告警",
                                    label: "非攻击类告警",
                                },
                            ],
                        },
                    ],
                };
            },
            methods: {
                handleChange(value) {
                    this.setSuggestion(value);
                },
                get_suggestion() {
                    let suggestionMarkdownEle = document.querySelector(
                        "#pane-model > div > div:nth-child(5) > div > textarea"
                    );
                    if (suggestionMarkdownEle) {

                        let value = suggestionMarkdownEle.value;
                        return value;
                    } else {
                        return "";
                    }
                },
                setSuggestion(selectedValue) {
                    const textarea = document.querySelector("#pane-model > div > div:nth-child(5) > div > textarea");
                    if (textarea) {
                        console.log("textarea:", textarea);
                        // 将选中的值转换为字符串,并用冒号分隔
                        const selectedText = selectedValue.join(':');

                        finalContent = `${this.currentNumber}. ${selectedText}\n`

                        // 更新文本区域的值
                        textarea.focus();

                        document.execCommand('insertText', false, finalContent);

                        // 递增编号,以便下次添加时使用
                        this.currentNumber++;

                        // 可选:在控制台打印最终内容以进行调试
                        console.log("Final content:", finalContent);
                    }
                    else {
                        console.log("没有找到textarea");
                    }
                },

            },
        };
        var Ctor = Vue.extend(Main);
        new Ctor().$mount(".suggestion-select1");
    }
}

function get_answerResultEle() {
    let answerResultEle = document.querySelector(
        '#pane-answer > div > div.ai-judgment-result > div > form > div:nth-child(1) > div > div > span'
    );
    if (answerResultEle) {
        let value = answerResultEle.textContent; // 使用 textContent 获取文本内容
        // console.log("answerResultEle text: ", value);
        return value; // 返回文本内容
    } else {
        return "";
    }
}

function get_jiaozhunResultEle() {
    let jiaozhunResultEle = document.querySelector(
        '#pane-model > div > div.result > form > div:nth-child(1) > div:nth-child(1) > div > span'
    );
    if (jiaozhunResultEle) {
        let value = jiaozhunResultEle.textContent; // 使用 textContent 获取文本内容
        // console.log("jiaozhunResultEle text: ", value);
        return value; // 返回文本内容
    } else {
        return "";
    }
}

function get_resultShenheEle() {
    let resultShenhe = document.querySelector(
        '#pane-model > div > div.result > form > div:nth-child(1) > div:nth-child(2) > div > div > label.q-radio.q-radio--small.is-checked > span.q-radio__label'
    );
    if (resultShenhe) {
        let value = resultShenhe.textContent; // 使用 textContent 获取文本内容
        // console.log("resultShenhe text: ", value);
        return value; // 返回文本内容
    } else {
        return "";
    }
}

function get_answerBusinessEle() {
    let answerBusinessEle = document.querySelector(
        '#pane-answer > div > div.ai-judgment-result > div > form > div:nth-child(2) > div > div > span'
    );
    if (answerBusinessEle) {
        let value = answerBusinessEle.textContent; // 使用 textContent 获取文本内容
        // console.log("answerResultEle text: ", value);
        return value; // 返回文本内容
    } else {
        return "";
    }
}

function get_jiaozhunBusinessEle() {
    let jiaozhunBusinessEle = document.querySelector(
        '#pane-model > div > div.result > form > div:nth-child(2) > div:nth-child(1) > div > span'
    );
    if (jiaozhunBusinessEle) {
        let value = jiaozhunBusinessEle.textContent; // 使用 textContent 获取文本内容
        // console.log("jiaozhunResultEle text: ", value);
        return value; // 返回文本内容
    } else {
        return "";
    }
}

function get_businessShenheEle() {
    let businessShenhe = document.querySelector(
        '#pane-model > div > div.result > form > div:nth-child(2) > div:nth-child(2) > div > div > label.q-radio.q-radio--small.is-checked > span.q-radio__label'
    );
    if (businessShenhe) {
        let value = businessShenhe.textContent; // 使用 textContent 获取文本内容
        // console.log("resultShenhe text: ", value);
        return value; // 返回文本内容
    } else {
        return "";
    }
}

function get_markIDEle() {
    let markID = document.querySelector(
        '#pane-model > div > div.info > div > span:nth-child(2)'
    );
    if (markID) {
        let value = markID.textContent; // 使用 textContent 获取文本内容
        // console.log("markID text: ", value);
        return value; // 返回文本内容
    } else {
        return "";
    }
}


function addAlert(markID) {
    let answerResult = get_answerResultEle();
    let jiaozhunResult = get_jiaozhunResultEle();
    let resultShenhe = get_resultShenheEle().trim(); // 使用 trim() 去除空格

    let answerBusiness = get_answerBusinessEle();
    let jiaozhunBusiness = get_jiaozhunBusinessEle();
    let businessShenhe = get_businessShenheEle().trim(); // 使用 trim() 去除空格

    // console.log(answerResult);
    // console.log(jiaozhunResult);
    // console.log(resultShenhe);
    // console.log(answerBusiness);
    // console.log(jiaozhunBusiness);
    // console.log(businessShenhe);

    if ((answerResult === jiaozhunResult && resultShenhe === "错误") || (answerResult !== jiaozhunResult && resultShenhe === "正确") ||
        (answerBusiness === jiaozhunBusiness && businessShenhe === "错误") || (answerBusiness !== jiaozhunBusiness && businessShenhe === "正确")) {
        // console.log("2222");
        if (confirm("校准攻击结果以及业务触发和标准答案不一致")) {
            // console.log("3333:", markID);
            return markID; // 只返回更新后的 strmarkID
        } else {
            console.log("用户点击了取消");
            // 如果取消,则不返回或更新任何值(或者可以返回当前的 strmarkID)
            return markID; // 仍然返回当前的 strmarkID
        }
    }
    return -1
}

var strmarkID = -1;

var markTool = new MarkTool();
(function () {
    "use strict";
    addElementUICSS();
    markTool.run();

    window.setInterval(function () {
        if (window.location.href.indexOf("/data-management/mark-data/list/calibrate/") != -1) {
            findyanpanSelectElement();
        }
        let markID = get_markIDEle();
        // console.log("now markid", markID);
        // console.log("old markid", strmarkID);

        if (markID != strmarkID) {
            // 调用 addAlert 并更新 strmarkID(如果需要)
            strmarkID = addAlert(markID);
        }
    }, 1000);
})();