您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
用于高中工作台,自动发送作业。
// ==UserScript== // @name DFX工作台助手 // @namespace https://aboucide.github.io/blog/note/software-use/DFX-GZT.html // @version 1.4.4 // @description 用于高中工作台,自动发送作业。 // @author Tiger // @license MIT // @match https://we.xdf.cn/* // @icon https://we.xdf.cn/static/img/icon-center-teacher-logo.2b63420.png // @grant none // ==/UserScript== (function () { 'use strict'; // 定义CSS样式 const css = ` .floating-window { position: fixed; cursor: grab; padding: 10px; background-color: #4CAF50; color: white; border-radius: 50%; text-align: center; font-size: 24px; z-index: 10000; top: 0; left: 0; transition: transform 0.1s ease; } .floating-window:active { cursor: grabbing; } `; // 创建<style>标签并将CSS样式添加到<head> { const style = document.createElement('style'); style.type = 'text/css'; style.appendChild(document.createTextNode(css)); document.head.appendChild(style); } // 创建悬浮窗<div>元素 { const floatingWindow = document.createElement('div'); floatingWindow.className = 'floating-window'; floatingWindow.textContent = '☀️'; floatingWindow.style.left = '0'; floatingWindow.style.top = '0'; document.body.appendChild(floatingWindow); // 初始化变量 let isDragging = false; let clickEnabled = true; let mouseXOffset = 0; let mouseYOffset = 0; // 处理鼠标按下事件,开始拖动 floatingWindow.addEventListener('mousedown', (e) => { e.preventDefault(); isDragging = true; clickEnabled = false; mouseXOffset = e.clientX - floatingWindow.getBoundingClientRect().left; mouseYOffset = e.clientY - floatingWindow.getBoundingClientRect().top; //document.body.style.cursor = 'grabbing'; }); // 处理鼠标移动事件,更新悬浮窗的位置 document.addEventListener('mousemove', (e) => { if (isDragging && !clickEnabled) { floatingWindow.style.left = (e.clientX - mouseXOffset) + 'px'; floatingWindow.style.top = (e.clientY - mouseYOffset) + 'px'; } }); // 处理鼠标松开事件,结束拖动 document.addEventListener('mouseup', (e) => { if (isDragging) { isDragging = false; setTimeout(() => { clickEnabled = true; //document.body.style.cursor = 'grab'; }, 100); } }); // 处理点击事件,当悬浮窗被点击时触发 floatingWindow.addEventListener('click', (e) => { let result = prompt("请问您想布置几次作业", 5); if(result !==null) { // 创建悬浮日志窗口 const logWindowContent = createLogWindow(); result = parseInt(result, 10); //将用户输入的值转为10进制数字。 setTimeout(() => { main(result); }, 1500); logMessage("开始发布作业,共计【" + result + "】次作业"); } else { alert('已取消运行'); } }); } //程序运行主程序,x是用户输入的运行次数 function main(x) { //logMessage("即将开始发布【"+ x + "】次作业"); //logMessage("当前时间:"+new Date().toLocaleTimeString()); DJsjk();//点击【试卷库】 logMessage("当前时间:"+new Date().toLocaleTimeString()); logMessage("延迟5秒后继续操作"); setTimeout(() => { for (let i = 0; i < x ; i++) { setTimeout(() => { let iii = i+1; logMessage('***开始第【' + iii +'】 次,大约要耗时45秒***'); onepaper(); }, i*(50000*(1+(i+1)/(25+i)))); //设置每50秒运行一次布置作业 } }, 1000); } //选年份、选试卷、选学生、发送试卷 function onepaper() { logMessage("【本次开始】时间:"+new Date().toLocaleTimeString()); setTimeout(() => { //这里会等待10秒,再往下执行 jinsannian(); //随机选取近三年中的某一年 setTimeout(() => { setTimeout(() => { logMessage("开始随机保存当前页面中随机一份试卷"); SJpaper(); setTimeout(() => { DJcksj();//点击查看试卷 setTimeout(() => { clickPublishToMiniProgramButton();//点击【发布至小程序】 setTimeout(() => { clickHomeworkCategory();//点击课后作业 setTimeout(() => { DJsubmit(); //点击提交 setTimeout(() => { clickEditSpan(); //点击编辑 setTimeout(() => { clickLastPlaceholderSelect();//点击最后一个选择框 setTimeout(() => { clickLastExclusiveItem("专属型"); setTimeout(() => { clickLastPlaceholderSelect(); setTimeout(() => { clickLastExclusiveItem("按学员发布"); setTimeout(() => { clickLastSelectStudentButton();//点击选择学员 setTimeout(() => { countAndClickCheckbox(); //勾选学员 setTimeout(() => { countAndClickConfirmButton(); //点击确认学员 setTimeout(() => { countAndClickReleaseButton(); //点击发布 setTimeout(() => { setTimeout(() => { pageback(); //返回【试题库】 setTimeout(() => { logMessage("现在返回到【试卷库】"); logMessage("【结束】时间:"+new Date().toLocaleTimeString()); logMessage("*******完成一次作业布置*******"); }, 2500); }, 2000);//等待2秒 }, 1000);//17、等待1秒后,返回试卷页 }, 1000);//16、等待1秒后,点击【发布】 }, 2000);//15、等待2秒后,点击【确认】学员 }, 4000);//14、等待4秒后,点击学员类型【未开课】、【开课中】 }, 1000);//13、等待1秒后,点击【选择学员】 }, 1000);//12、等待1秒后,点击【按学员发布】 }, 2000);//11、等待2秒后,点击最后一个【选择】,选择发布对象 }, 1000);//10、等待1秒后,点击最后一个【专属型】 }, 1000);//9、等待1秒后,点击最后一个【选择】,选择发布类型 }, 2000);//8、等待2秒后,点击【编辑】 }, 2000);//7、等待2秒后,点击【提交】 }, 3000);//6、等待3秒后,点击【课后作业】 }, 4000);//5、等待4秒后,点击【发布至小程序】 }, 3000);//4、等待3秒后,点击【查看试卷】 }, 1000);//3、等待1秒后随机点击一份【试卷保存】。 }, 3000);//2、随机点击【年份】的按钮后,等待3秒。 }, 5000);// 1、点击【试卷库之后】等待5秒后,等待页面加载完成,随机点击近三年的某一年 } // 点击“试卷库” function DJsjk() { // 点击具有文本“试卷库”的<li>元素 const targetElement = Array.from(document.querySelectorAll('li.el-menu-item')).find(element => element.textContent.trim() === '试卷库'); if (targetElement) { // 1、点击【试卷库之后】,延迟10秒 targetElement.click(); logMessage("已点击【试卷库】"); } else { console.error('未找到【试卷库】,你当前真的在【XDF高中工作台】的首页吗?'); alert('未找到【试卷库】,你当前真的在【XDF高中工作台】的首页吗?') } } // 随机点击近三年年份按钮 function jinsannian() { // 设置超时时间和轮询间隔 let timeout = 10000; // 10秒 let interval = 1000; // 每1秒检查一次 // 定义一个变量来记录开始时间 let startTime = Date.now(); // 使用setInterval来循环检查元素 let intervalId = setInterval(() => { // 选择所有包含年份文本的<button>元素 const yearButtons = Array.from(document.querySelectorAll('button.el-button')) .filter(button => /^\d{4}年$/.test(button.querySelector('span')?.textContent.trim())); // 获取前6个匹配的元素 const topThreeYearButtons = yearButtons.slice(1, 7); // 如果找到了元素 if (topThreeYearButtons.length > 0) { //logMessage("开始随机点击【近6年】"); // 随机选择一个按钮 const randomIndex = Math.floor(Math.random() * topThreeYearButtons.length); const randomButton = topThreeYearButtons[randomIndex]; // 触发点击事件 randomButton.click(); logMessage(`随机选择【${randomButton.querySelector('span').textContent.trim()}】年份`); clearInterval(intervalId); // 清除循环 } else if (Date.now() - startTime > timeout) { // 如果超过超时时间,停止循环 logMessage('等待8秒,超时,未找到【年份】按钮'); window.history.back(); clearInterval(intervalId); } }, interval); } // 随机选取一份试卷 function SJpaper() { // 设置超时时间和轮询间隔 let timeout = 8000; // 8秒 let interval = 1000; // 每500毫秒检查一次 // 定义一个变量来记录开始时间 let startTime = Date.now(); // 使用setInterval来循环检查元素 let intervalId = setInterval(() => { // 选择所有包含文本“保存”的<span>元素 const saveButtons = Array.from(document.querySelectorAll('span.btn-right')) .filter(span => span.textContent.trim() === '保存'); // 获取匹配的元素数量 const saveButtonCount = saveButtons.length; // 如果找到了元素 if (saveButtonCount > 0) { //logMessage(`找到 ${saveButtonCount} 个文本为【保存】的按钮`); // 随机选择一个按钮 const randomIndex = Math.floor(Math.random() * saveButtonCount); const randomSaveButton = saveButtons[randomIndex]; // 触发点击事件 randomSaveButton.click(); logMessage(`随机【保存】第 ${randomIndex + 1} 张试卷`); clearInterval(intervalId); // 清除循环 } else if (Date.now() - startTime > timeout) { // 如果超过超时时间,停止循环 logMessage('等待8秒,超时,未找到【保存】按钮'); clearInterval(intervalId); } }, interval); } //点击【查看试卷】 function DJcksj() { // 设置超时时间和轮询间隔 let timeout = 8000; // 5秒 let interval = 1000; // 每500毫秒检查一次 // 定义一个变量来记录开始时间 let startTime = Date.now(); // 使用setInterval来循环检查元素 let intervalId = setInterval(() => { // 使用querySelectorAll来获取所有匹配的按钮元素 let buttons = document.querySelectorAll('button.btn-primary'); // 如果找到了元素 if (buttons.length > 0) { //logMessage(`点击【查看试卷】`); // 过滤出包含文本为“查看试卷”的按钮 let targetButtons = Array.from(buttons).filter(button => { let span = button.querySelector('span'); return span && span.textContent.trim() === "查看试卷"; }); if (targetButtons.length > 0) { //logMessage(`找到 ${targetButtons.length} 个文本为'查看试卷'的按钮`); // 遍历所有符合条件的按钮并点击 targetButtons.forEach((button, index) => { logMessage(`点击【查看试卷】`); button.click(); }); } clearInterval(intervalId); // 清除循环 } else if (Date.now() - startTime > timeout) { // 如果超过超时时间,停止循环 logMessage('等待超时,未找到元素'); clearInterval(intervalId); } }, interval); } //点击【打印预览/下载】 function DJprint() { // 设置超时时间和轮询间隔 let timeout = 8000; // 8秒 let interval = 1000; // 每1000毫秒检查一次 // 定义一个变量来记录开始时间 let startTime = Date.now(); // 使用setInterval来循环检查元素 let intervalId = setInterval(() => { // 使用querySelectorAll来获取所有匹配的按钮元素 // 更新选择器以匹配提供的按钮类名 let buttons = document.querySelectorAll('button.el-button.el-button--default.el-button--mini'); // 如果找到了元素 if (buttons.length > 0) { logMessage(`点击【打印预览/下载】`); // 过滤出包含文本为“打印预览/下载”的按钮 let targetButtons = Array.from(buttons).filter(button => { let span = button.querySelector('span'); return span && span.textContent.trim() === "打印预览/下载"; }); if (targetButtons.length > 0) { //logMessage(`找到 ${targetButtons.length} 个文本为'打印预览/下载'的按钮`); // 遍历所有符合条件的按钮并点击 targetButtons.forEach((button, index) => { //logMessage(`点击第 ${index + 1} 个按钮`); button.click(); }); } clearInterval(intervalId); // 清除循环 } else if (Date.now() - startTime > timeout) { // 如果超过超时时间,停止循环 logMessage('等待8秒,超时,未找到【打印预览/下载】按钮'); clearInterval(intervalId); } }, interval); } //点击【发布至小程序】 function clickPublishToMiniProgramButton() { // 设置超时时间和轮询间隔 let timeout = 8000; // 8秒 let interval = 1000; // 每1000毫秒检查一次 // 定义一个变量来记录开始时间 let startTime = Date.now(); // 使用setInterval来循环检查元素 let intervalId = setInterval(() => { // 使用querySelectorAll来获取所有匹配的按钮元素 let buttons = document.querySelectorAll('button.el-button.el-button--default.el-button--mini'); // 过滤出包含文本为“发布至小程序”的按钮 let publishButton = Array.from(buttons).filter(button => { let span = button.querySelector('span'); return span && span.textContent.trim() === "发布至小程序"; })[0]; // 取第一个匹配的按钮 // 如果找到了元素 if (publishButton) { logMessage(`点击【发布至小程序】`); // 点击找到的按钮 publishButton.click(); clearInterval(intervalId); // 清除循环 } else if (Date.now() - startTime > timeout) { // 如果超过超时时间,停止循环 logMessage('等待8秒,超时,未找到【发布至小程序】按钮'); clearInterval(intervalId); } }, interval); } //点击【课后作业】 function clickHomeworkCategory() { // 设置超时时间和轮询间隔 let timeout = 8000; // 8秒 let interval = 1000; // 每1000毫秒检查一次 // 定义一个变量来记录开始时间 let startTime = Date.now(); // 使用setInterval来循环检查元素 let intervalId = setInterval(() => { // 使用querySelectorAll来获取所有匹配的category-item元素 let categoryItems = document.querySelectorAll('.category-item'); // 过滤出包含文本为“课后作业”的category-item元素 let homeworkCategory = Array.from(categoryItems).filter(item => item.textContent.trim() === "课后作业")[0]; // 如果找到了元素 if (homeworkCategory) { logMessage(`点击【课后作业】`); // 点击找到的元素 homeworkCategory.click(); clearInterval(intervalId); // 清除循环 } else if (Date.now() - startTime > timeout) { // 如果超过超时时间,停止循环 logMessage('等待8秒,超时,未找到【课后作业】'); clearInterval(intervalId); } }, interval); } // 点击【提交】 function DJsubmit() { // 设置超时时间和轮询间隔 let timeout = 8000; // 8秒 let interval = 1000; // 每1000毫秒检查一次 // 定义一个变量来记录开始时间 let startTime = Date.now(); // 使用setInterval来循环检查元素 let intervalId = setInterval(() => { // 使用querySelectorAll来获取所有匹配的按钮元素 let buttons = document.querySelectorAll('.dialog-footer .el-button.el-button--primary'); // 过滤出包含文本为“提交”的按钮 let submitButtons = Array.from(buttons).filter(button => { let span = button.querySelector('span'); return span && span.textContent.trim() === "提交"; }); // 如果找到至少一个按钮 if (submitButtons.length > 0) { // 输出找到的按钮数量 //logMessage(`找到 ${submitButtons.length} 个文本为'提交'的按钮`); // 点击第一个按钮 submitButtons[0].click(); logMessage(`点击【提交】`); clearInterval(intervalId); // 清除循环 } else if (Date.now() - startTime > timeout) { // 如果超过超时时间,停止循环 logMessage('等待8秒,超时,未找到"提交"的按钮'); clearInterval(intervalId); } }, interval); } // 点击【编辑】 function clickEditSpan() { // 设置超时时间和轮询间隔 let timeout = 8000; // 8秒 let interval = 1000; // 每1秒检查一次 // 定义一个变量来记录开始时间 let startTime = Date.now(); // 使用setInterval来循环检查元素 let intervalId = setInterval(() => { // 使用querySelectorAll来获取所有匹配的span元素 let editSpans = document.querySelectorAll('span.edit'); // 过滤出包含文本为“编辑”的span let targetEditSpans = Array.from(editSpans).filter(span => { return span.textContent.trim() === "编辑"; }); // 如果找到至少一个span if (targetEditSpans.length > 0) { // 输出找到的span数量 //logMessage(`找到 ${targetEditSpans.length} 个文本为'编辑'的span`); // 点击第一个span targetEditSpans[0].click(); logMessage(`点击【编辑】`); clearInterval(intervalId); // 清除循环 } else if (Date.now() - startTime > timeout) { // 如果超过超时时间,停止循环 logMessage('等待8秒,超时,没有找到"编辑"'); clearInterval(intervalId); } }, interval); } // 点击最后一个【请选择】的下拉箭头 function clickLastPlaceholderSelect() { // 设置超时时间和轮询间隔 let timeout = 8000; // 8秒 let interval = 1000; // 每1000毫秒检查一次 // 定义一个变量来记录开始时间 let startTime = Date.now(); // 使用setInterval来循环检查元素 let intervalId = setInterval(() => { // 使用querySelectorAll来获取所有匹配的输入框元素 let inputs = document.querySelectorAll('input[placeholder="请选择"]'); // 统计找到的输入框数量 let count = inputs.length; //logMessage(`总共找到 ${count} 个占位符为'请选择'的输入框`); // 检查是否找到至少一个输入框 if (count > 0) { // 获取最后一个输入框 let input = inputs[count - 1]; // 获取输入框旁边的下拉箭头元素 let suffix = input.parentElement.querySelector('.el-input__suffix-inner .el-icon-arrow-up'); if (suffix) { // 模拟点击下拉箭头 suffix.click(); //logMessage(`开始设置类型`); clearInterval(intervalId); // 清除循环 } else { logMessage(`最后一个输入框没有找到下拉箭头`); clearInterval(intervalId); // 清除循环 } } else if (Date.now() - startTime > timeout) { // 如果超过超时时间,停止循环 logMessage('等待8秒,超时,没有找到"请选择"'); clearInterval(intervalId); } }, interval); } //点击弹出的选择列表为xxx的选项 function clickLastExclusiveItem(xxx) { // 使用querySelectorAll来获取所有匹配的li元素 let items = document.querySelectorAll('li.el-select-dropdown__item'); // 检查是否找到至少一个li元素 if (items.length > 0) { // 从找到的li元素中筛选出包含文本“专属型”的元素 let exclusiveItems = Array.from(items).filter(item => { return item.querySelector('span') && item.querySelector('span').textContent.trim() === xxx; }); // 检查是否找到至少一个包含“专属型”文本的li元素 if (exclusiveItems.length > 0) { // 获取最后一个匹配的li元素 let lastExclusiveItem = exclusiveItems[exclusiveItems.length - 1]; // 模拟点击最后一个匹配的li元素 lastExclusiveItem.click(); logMessage(`设置类型为:【` + xxx + `】`); } else { logMessage(`没有找到文本为【` + xxx + `】`); } } else { logMessage('页面上没有找到【'+ xxx+ '】,是因为没出现多选框的列表吗?'); } } //点击【选择学员】 function clickLastSelectStudentButton() { // 使用querySelectorAll来获取所有匹配的按钮元素 let buttons = document.querySelectorAll('button.el-button.el-button--primary'); // 筛选出包含文本“选择学员”的按钮 let selectStudentButtons = Array.from(buttons).filter(button => { return button.querySelector('span') && button.querySelector('span').textContent.trim() === '选择学员'; }); // 统计找到的按钮数量 let count = selectStudentButtons.length; //logMessage(`总共找到 ${count} 个文本为'选择学员'的按钮`); // 检查是否找到至少一个按钮 if (count > 0) { // 获取最后一个匹配的按钮 let lastSelectStudentButton = selectStudentButtons[count - 1]; // 模拟点击最后一个匹配的按钮 lastSelectStudentButton.click(); logMessage(`点击【选择学员】按钮`); } else { // 如果没有找到按钮,输出提示信息 logMessage('没有找到文本为"选择学员"的按钮'); } } //点击第前两项项复选框【开课中】、【未开课】 function countAndClickCheckbox() { // 使用querySelectorAll来获取所有匹配的复选框元素 let checkboxes = document.querySelectorAll('input[type="checkbox"].el-checkbox__original'); // 统计找到的复选框数量 let count = checkboxes.length; //logMessage(`总共找到 ${count} 个复选框`); // 检查是否找到至少一个复选框 if (count > 0) { // 获取并点击第1和第2个复选框 //第一个复选框是【开课中】学员 //第二个复选框是【未开课】学员 //如果先勾选的学员数为0,则勾选下一个复选框的时候会自动把刚刚那个取消掉。问题不大。 let firstCheckbox = checkboxes[2]; firstCheckbox.click(); firstCheckbox = checkboxes[1]; firstCheckbox.click(); firstCheckbox = checkboxes[0]; firstCheckbox.click(); logMessage(`点击前3个复选框`); } else { // 如果没有找到复选框,输出提示信息 logMessage('没有找到复选框'); } } //点击【确认学员】 function countAndClickConfirmButton() { // 使用querySelectorAll来获取所有匹配的按钮元素 let buttons = document.querySelectorAll('button.el-button.btn.btn-primary.el-button--primary'); // 统计找到的按钮数量 let count = buttons.length; //logMessage(`总共找到 ${count} 个文本为'确认'的按钮`); // 检查是否找到至少一个按钮 if (count > 0) { // 获取第一个按钮并检查其文本内容 let firstButton = buttons[0]; if (firstButton.querySelector('span') && firstButton.querySelector('span').textContent.trim() === '确认') { // 点击第一个按钮 firstButton.click(); logMessage(`点击【学员确认】`); } else { logMessage('第一个按钮的文本不是"确认"'); } } else { // 如果没有找到按钮,输出提示信息 logMessage('没有找到文本为"确认"的按钮'); } } //点击【发布】 function countAndClickReleaseButton() { // 使用querySelectorAll来获取所有匹配的按钮元素 let buttons = document.querySelectorAll('button.el-button.release.el-button--primary'); // 统计找到的按钮数量 let count = buttons.length; //logMessage(`总共找到 ${count} 个文本为'发布'的按钮`); // 检查是否找到至少一个按钮 if (count > 0) { // 获取第一个按钮并检查其文本内容 let firstButton = buttons[0]; if (firstButton.querySelector('span') && firstButton.querySelector('span').textContent.trim() === '发布') { // 点击第一个按钮 firstButton.click(); logMessage(`点击【发布】`); } else { logMessage('第一个按钮的文本不是"发布"'); } } else { // 如果没有找到按钮,输出提示信息 logMessage('没有找到文本为"发布"的按钮'); } } //回退页面到【试卷库】 function pageback() { setTimeout(() => { logMessage('返回上一页,共2次'); window.history.back(); logMessage('返回上一页,第1次'); setTimeout(() => { window.history.back(); logMessage('返回上一页,第2次'); }, 1000); }, 1000); } })(); // 创建悬浮窗口的函数 function createLogWindow() { // 创建悬浮窗口的容器 const logWindow = document.createElement('div'); logWindow.id = 'logWindow'; logWindow.style.position = 'fixed'; logWindow.style.top = '50px'; logWindow.style.left = '0px'; logWindow.style.width = '300px'; logWindow.style.height = '600px'; logWindow.style.backgroundColor = 'rgba(255, 255, 255, 0.5)'; // 半透明背景 logWindow.style.border = '1px solid #ccc'; logWindow.style.padding = '10px'; logWindow.style.boxShadow = '0 0 10px rgba(0,0,0,0.1)'; logWindow.style.zIndex = '1000'; logWindow.style.overflowY = 'auto'; // 允许内容滚动 logWindow.style.display = 'block'; // 创建头部 const logHeader = document.createElement('div'); logHeader.className = 'log-header'; logHeader.innerText = '脚本日志'; logHeader.style.color = 'blue'; // 头部文字颜色 // 创建关闭按钮 const closeButton = document.createElement('button'); closeButton.innerText = 'X'; closeButton.style.color = 'red'; // 关闭按钮文字颜色 closeButton.onclick = function() { logWindow.style.display = 'none'; }; // 创建复制按钮 const copyButton = document.createElement('button'); copyButton.innerText = '复制'; copyButton.style.color = 'green'; // 复制按钮文字颜色 copyButton.onclick = function() { const logContent = document.querySelector('#logWindow .log-content'); copyTextToClipboard(logContent.innerText); alert('日志已复制到剪贴板'); }; // 创建日志内容区域 const logContent = document.createElement('div'); logContent.className = 'log-content'; logContent.style.fontFamily = 'monospace'; logContent.style.whiteSpace = 'pre-wrap'; logContent.style.color = 'blue'; // 日志内容文字颜色 logContent.style.fontSize = '14px'; // 设置字体大小 logContent.style.overflowY = 'auto'; //设置超出范围自动滚动 // 组装悬浮窗口 logHeader.appendChild(closeButton); logWindow.appendChild(logHeader); logWindow.appendChild(logContent); logHeader.appendChild(copyButton); // 将复制按钮添加到头部 // 将悬浮窗口添加到文档中 document.body.appendChild(logWindow); return logContent; } // 向日志窗口添加消息的函数 function logMessage(message) { const logContent = document.querySelector('.log-content'); const newEntry = document.createElement('div'); newEntry.textContent = message; logContent.appendChild(newEntry); logContent.scrollTop = logContent.scrollHeight; } // 复制文本到剪贴板的函数 function copyTextToClipboard(text) { if (navigator.clipboard) { navigator.clipboard.writeText(text).then( function() { console.log('已成功将日志复制到剪贴板'); }, function(err) { console.error('复制到剪贴板失败', err); } ); } else { const textArea = document.createElement("textarea"); textArea.value = text; document.body.appendChild(textArea); textArea.focus(); textArea.select(); try { document.execCommand('copy'); console.log('Fallback: Copying to clipboard was successful!'); } catch (err) { console.error('Fallback: Could not copy text: ', err); } document.body.removeChild(textArea); } }
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址