您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
CNVD添加复制漏洞列表页面单个或所有漏洞标题、优化用户中心已提交漏洞展示和复制漏洞编号
// ==UserScript== // @name CNVD_Modify // @namespace http://tampermonkey.net/ // @version 0.3 // @description CNVD添加复制漏洞列表页面单个或所有漏洞标题、优化用户中心已提交漏洞展示和复制漏洞编号 // @author Mrxn // @homepage https://mrxn.net/ // @supportURL https://github.com/Mr-xn/CNVD_Modify // @license MIT // @run-at document-end // @match https://www.cnvd.org.cn/* // @icon https://www.google.com/s2/favicons?sz=64&domain=cnvd.org.cn // @grant none // ==/UserScript== (function() { 'use strict'; // Your code here... function copy_all_vuln_title(){ // 获取表格元素 const table = document.querySelector('.tlist'); // 获取表格中的thead和tbody元素 const thead = table.querySelector('thead'); const tbody = table.querySelector('tbody'); // 获取所有的tr元素 const trList = tbody.querySelectorAll('tr'); // 获取表格中的第一个th元素 const th = thead.querySelector('th:first-child'); // 创建复制按钮 const btn = document.createElement('button'); btn.textContent = '复制所有标题'; // 给复制按钮设置样式 btn.style.position = 'relative'; btn.style.top = 0; btn.style.right = 0; btn.style.paddingLeft = '10px'; // 给复制按钮添加点击事件 btn.addEventListener('click', () => { // 创建一个数组,用于保存所有的title属性值 const titles = []; // 遍历所有的tr元素 trList.forEach(tr => { // 获取当前tr元素下的第一个td元素 const td = tr.querySelector('td:first-child'); // 如果当前td元素下有a标签 const a = td.querySelector('a'); if (a) { // 将a标签的title属性值添加到数组中 titles.push(a.getAttribute('title') || a.outerText); } }); // 将title属性值以换行符为分隔符合并为一个字符串 const text = titles.join('\n'); // 创建一个临时的textarea元素 const textarea = document.createElement('textarea'); // 将合并后的字符串赋值给textarea元素的value属性 textarea.value = text; // 将textarea元素添加到页面中 document.body.appendChild(textarea); // 选中textarea元素中的文本 textarea.select(); // 复制选中的文本 document.execCommand('copy'); // 删除临时的textarea元素 document.body.removeChild(textarea); }); // 将复制按钮添加到th元素中 th.appendChild(btn); } function user_copy(){ // 判断当前页面是否为 https://www.cnvd.org.cn/ if (window.location.href.startsWith('https://www.cnvd.org.cn/')) { //优化用户中心的已提交漏洞列表展示 var elements = document.querySelectorAll('.tlist th, .tlist td'); for (var i = 0; i < elements.length; i++) { elements[i].style.padding = '0'; } //优化漏洞列表页面给每条漏洞前面添加复制按钮 // 获取所有的td元素 const tdList = document.querySelectorAll('tbody td'); // 遍历所有的td元素 tdList.forEach(td => { // 获取a标签元素 const a = td.querySelector('a'); if (!a) { return; } // 创建复制按钮 const btn = document.createElement('button'); btn.textContent = '复制'; // 给复制按钮设置样式 btn.style.position = 'relative'; btn.style.top = 0; btn.style.right = 0; // 根据a标签的href属性判断复制的内容 if (a.getAttribute('href').startsWith('/flaw/show/')) { //复制单独的每一条漏洞标题 // 复制a标签的title属性 btn.addEventListener('click', () => { // 创建一个临时的textarea元素 const textarea = document.createElement('textarea'); // 将a标签的title属性赋值给textarea元素的value属性 textarea.value = a.getAttribute('title') || a.outerText; // 将textarea元素添加到页面中 document.body.appendChild(textarea); // 选中textarea元素中的文本 textarea.select(); // 复制选中的文本 document.execCommand('copy'); // 删除临时的textarea元素 document.body.removeChild(textarea); }); } else if (a.getAttribute('href').startsWith('/user/myreport/')) { // 复制a标签的文本内容 btn.addEventListener('click', () => { // 创建一个临时的textarea元素 const textarea = document.createElement('textarea'); // 将a标签的文本内容赋值给textarea元素的value属性 textarea.value = a.textContent; // 将textarea元素添加到页面中 document.body.appendChild(textarea); // 选中textarea元素中的文本 textarea.select(); // 复制选中的文本 document.execCommand('copy'); // 删除临时的textarea元素 document.body.removeChild(textarea); }); } else { // 如果a标签的href属性既不以/flaw/show/开头,也不以/user/myreport/开头,则不添加复制按钮 return; } // 将复制按钮添加到td元素中 td.appendChild(btn); }); } } function run(){ if (window.location.href.startsWith('https://www.cnvd.org.cn/')){ user_copy(); } if (window.location.href.includes('/flaw/list') || window.location.href.includes('/flaw/flawListByManu')) { //添加复制所有漏洞标题按钮 copy_all_vuln_title(); } } function Surveillance(){ // 监视 table 内容的变化 const observer = new MutationObserver(function(mutationsList, observer) { // 遍历每一个变化 for (let mutation of mutationsList) { // 如果变化发生在 table 中,则执行某个函数 if (mutation.target.nodeName === 'TABLE') { return true; } } }); // 配置 MutationObserver 监听 table 内容的变化 const config = { childList: true, subtree: true }; observer.observe(document.body, config); } //开始运行 run(); })();