// ==UserScript== // @name 小雅辅助工具 // @namespace https://gitee.com/fieldlu/xy-script-assets // @version 2.4.1 // @description 专为小雅学习平台打造的超强辅助工具:1. 视频/文档全自动挂机与智能雷达连播;2. 讨论区网络流抓包及全自动批量点赞/自定义回复;3. 全局任务探测与一键秒交。为您提供沉浸式高效体验。4. 底层拦截防切屏防休眠与硬件级静音; // @author Gemini // @license MIT // @match https://*.ai-augmented.com/* // @run-at document-start // @grant GM_addStyle // @grant GM_setValue // @grant GM_getValue // @grant GM_xmlhttpRequest // @icon data:image/png;base64,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 // ==/UserScript== (function () { 'use strict'; // 彻底动态化:读取头部 @version,无任何写死的数字,以后发版只需改头部注释即可! const SCRIPT_VERSION = typeof GM_info !== 'undefined' ? GM_info.script.version : '未知'; const domain = window.location.hostname; (function injectStealthEngine() { const script = document.createElement('script'); script.textContent = ` (function() { // 1. 视界欺骗(防切屏) Object.defineProperties(document, { hidden: { value: false, configurable: false }, visibilityState: { value: 'visible', configurable: false } }); const originAdd = EventTarget.prototype.addEventListener; EventTarget.prototype.addEventListener = function(type, fn, opts) { if (['visibilitychange', 'blur', 'pagehide'].includes(type) && (this === window || this === document)) return; return originAdd.call(this, type, fn, opts); }; // 2. 暴力音轨剥离(Web Audio API + DOM Media 双重拦截) window._xy_hardware_mute = true; // 拦截原生视频播放 const originPlay = HTMLMediaElement.prototype.play; HTMLMediaElement.prototype.play = function() { if (window._xy_hardware_mute) this.muted = true; return originPlay.call(this); }; // 拦截高级音频上下文 const Ctx = window.AudioContext || window.webkitAudioContext; if(Ctx) { const originCreateMedia = Ctx.prototype.createMediaElementSource; Ctx.prototype.createMediaElementSource = function(el) { const source = originCreateMedia.call(this, el); const gainNode = this.createGain(); gainNode.gain.value = window._xy_hardware_mute ? 0 : 1; source.connect(gainNode); document.addEventListener('xy-volume-change', (e) => { if(this.state === 'suspended') this.resume().catch(()=>{}); gainNode.gain.value = e.detail.mute ? 0 : 1; }); source.connect = function() { return gainNode.connect.apply(gainNode, arguments); }; source.disconnect = function() { return gainNode.disconnect.apply(gainNode, arguments); }; return source; }; } // 监听总控台发出的实时静音指令 document.addEventListener('xy-volume-change', (e) => { window._xy_hardware_mute = e.detail.mute; document.querySelectorAll('video, audio').forEach(media => { media.muted = window._xy_hardware_mute; }); }); })(); `; (document.head || document.documentElement).appendChild(script); script.remove(); })(); const appState = { activeZone: 'uninitialized', mode: GM_getValue('xy_play_mode', 'sequence'), recordActive: false, guardActive: GM_getValue('xy_guard_active', true), hardwareMute: GM_getValue('xy_hw_mute', true), isTaskCompleted: false, recordCount: parseInt(sessionStorage.getItem('xy_recordCount')) || 0, totalTime: parseInt(sessionStorage.getItem('xy_totalTime')) || 0, realTime: parseInt(sessionStorage.getItem('xy_realTime')) || 0, lastRecordDate: null, lastPopupClickTime: 0, isFreedomMode: false, aiMode: GM_getValue('xy_ai_mode', true), videoAutoSubmit: GM_getValue('xy_video_submit', true), docBatchSubmit: GM_getValue('xy_doc_batch', true), showRefreshPanel: GM_getValue('xy_show_refresh_panel', true), showTerminal: GM_getValue('xy_show_terminal', false), enableDomScan: true, currentEngine: 'none', docReadTime: 0, lastDocSubmitTime: 0, videoScriptProgress: undefined, videoLastTime: 0, batchDocSubmitting: false, courseResourcesCache: null, lastCourseGroupId: null, discGroupId: null, discussionId: null, targetNames: [], selectedNames: new Set(), docPreviewDoneNodeId: null, discLockedUrl: null, jumpFailCount: 0, jumpSleepUntil: 0, useCustomReply: GM_getValue('xy_use_custom_reply', false), customReplies: [] }; try { appState.targetNames = JSON.parse(GM_getValue('xy_target_names', '[]')); } catch(e) { appState.targetNames = []; } try { appState.customReplies = JSON.parse(GM_getValue('xy_custom_replies', '[]')); } catch(e) { appState.customReplies = []; } let sessionLogs = []; try { sessionLogs = JSON.parse(sessionStorage.getItem('xy_session_logs')) || []; } catch(e) { sessionLogs = []; } let recordIntervalTimer = null; let realTimeTimer = null; let isFetchingResources = false; let isSubmittingLock = false; let isJumpingLock = false; // 动态定时重载调度器变量 let dynamicRefreshTimeoutId = null; let refreshCountdownTimer = null; let lastRefreshStrategy = 'none'; function syncHardwareMute() { document.dispatchEvent(new CustomEvent('xy-volume-change', { detail: { mute: appState.hardwareMute } })); } function getCourseGroupId() { const match = window.location.href.match(/(?:mycourse|course)\/(\d+)/); return match ? match[1] : null; } function getNodeId() { const match = window.location.href.match(/resource\/\d+\/(\d+)/); return match ? match[1] : null; } const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms)); function getCookie(keyword = 'prd-access-token') { for (const cookie of document.cookie.split('; ')) { const [name, value] = cookie.split('='); if (name.includes(keyword)) return value; } return null; } async function getAuthToken() { const token = getCookie(); if (token) return token; throw new Error('未找到Token'); } function cleanName(str) { if (!str) return ""; return str.replace(/[\u200B-\u200D\uFEFF]/g, '').trim(); } function decodeNickname(encodedStr) { if (!encodedStr) return "匿名"; let res = encodedStr; try { res = decodeURIComponent(escape(atob(encodedStr))).split('').reverse().join(''); } catch(e) { try { res = new TextDecoder().decode(Uint8Array.from(atob(encodedStr), c => c.charCodeAt(0))).split('').reverse().join(''); } catch (err) {} } return cleanName(res); } function flattenResources(arr) { let res = []; if (!Array.isArray(arr)) return res; arr.forEach(item => { res.push(item); if (item.children) res = res.concat(flattenResources(item.children)); if (item.child_nodes) res = res.concat(flattenResources(item.child_nodes)); if (item.items) res = res.concat(flattenResources(item.items)); }); return res; } // ========================================== // 🚀 底层雷达系统 & 状态秒判 // ========================================== function switchToZone(newZone) { if (appState.activeZone === newZone) return; const oldZone = appState.activeZone; appState.activeZone = newZone; if (oldZone === 'course') { toggleRecord(false); } // 核心修复:进入待命区或讨论区时,立刻销毁动态重载调度器 if (newZone === 'standby' || newZone === 'disc') { clearDynamicRefresh(); lastRefreshStrategy = 'none'; } // 确保主UI面板本体不会被隐藏 const superConsole = document.getElementById('xy-super-console'); if (superConsole) { superConsole.style.display = 'flex'; } const viewC = document.getElementById('xy-view-course'), viewD = document.getElementById('xy-view-disc'), viewS = document.getElementById('xy-view-standby'), badge = document.getElementById('xy-zone-badge'); if (viewC && viewD && viewS && badge) { viewC.style.display = newZone === 'course' ? 'block' : 'none'; viewD.style.display = newZone === 'disc' ? 'block' : 'none'; viewS.style.display = newZone === 'standby' ? 'flex' : 'none'; if (newZone === 'course') { badge.innerHTML = '📚 刷课区'; badge.style.background = '#dbeafe'; badge.style.color = '#1e40af'; } else if (newZone === 'disc') { badge.innerHTML = '💭 讨论区'; badge.style.background = '#ffedd5'; badge.style.color = '#c2410c'; } else { badge.innerHTML = '🏝️ 待命区'; badge.style.background = '#f1f5f9'; badge.style.color = '#475569'; } } if (oldZone !== 'uninitialized') { const zoneName = newZone === 'course' ? '视频/文档自动引擎' : newZone === 'disc' ? '互动点赞引擎' : '系统隔离待命区'; logMsg(`📍 底层指令:已切换至【${zoneName}】`, newZone === 'standby' ? 'warning' : 'success', false); } if (newZone === 'course') { ensureAutoRecord(); globalTaskStatusChecker(true); appState.docReadTime = 0; appState.lastDocSubmitTime = 0; appState.videoScriptProgress = undefined; appState.isTaskCompleted = false; } } async function runLowLevelScanner() { if (appState.discLockedUrl === window.location.href) { switchToZone('disc'); return; } const groupId = getCourseGroupId(); const nodeId = getNodeId(); if (!groupId || !nodeId) { switchToZone('standby'); return; } let taskType = -1; try { const token = await getAuthToken(); const radarRes = await fetch(`https://${domain}/api/jx-stat/group/task/un_finish`, { headers: { "authorization": `Bearer ${token}` } }); const radarData = await radarRes.json(); if (radarData.success && radarData.data) { const rTask = radarData.data.find(t => t.node_id == nodeId); if (rTask) { taskType = rTask.task_type; } else { const resources = await loadCourseResources(groupId); if (resources) { const flatRes = flattenResources(resources); const currentRes = flatRes.find(r => r.node_id == nodeId || r.id == nodeId); if (currentRes) taskType = currentRes.task_type; } if (!appState.isTaskCompleted && appState.activeZone === 'course') { appState.isTaskCompleted = true; logMsg('✅ [雷达秒判] 当前任务已在全局雷达达成,瞬间放行!', 'success', false); updateCourseUI(); } } } } catch(e) {} if (taskType === 1) { switchToZone('course'); return; } else if (taskType === 6) { switchToZone('disc'); return; } else if (taskType > 1 && taskType <= 5) { if (appState.activeZone !== 'standby') logMsg(`⚠️ API侦测到【测验/作业/问卷】任务!引擎休眠!`, 'error', false); switchToZone('standby'); return; } const htmlStr = document.body ? document.body.innerHTML : ''; if (document.querySelector('video, iframe[src*="ow365"], iframe[src*="office"], .prism-player, .aliplayer, .xy_disk_preview, .pdf-viewer')) { switchToZone('course'); return; } if (document.querySelector('.discussion-container, .jx-discussion, [class*="discuss"]') || htmlStr.includes('发表评论') || htmlStr.includes('全部评论')) { switchToZone('disc'); return; } switchToZone('standby'); } async function loadCourseResources(groupId) { if(appState.lastCourseGroupId === groupId && appState.courseResourcesCache) return appState.courseResourcesCache; if(isFetchingResources) { let waitLoops = 0; while(isFetchingResources && waitLoops < 50) { await sleep(100); waitLoops++; } return appState.courseResourcesCache; } isFetchingResources = true; try { const token = await getAuthToken(); const res = await fetch(`https://${domain}/api/jx-iresource/resource/queryCourseResources?group_id=${groupId}`, { headers: { "authorization": `Bearer ${token}` } }); const data = await res.json(); if (data.success && data.data) { appState.courseResourcesCache = data.data; appState.lastCourseGroupId = groupId; } } catch(e) {} isFetchingResources = false; return appState.courseResourcesCache; } // ========================================== // 🛠️ 弹窗、日志与UI交互 // ========================================== function xyShowModal(title, message, onConfirm = null) { const modal = document.createElement('div'); modal.style.cssText = `position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.5); display: flex; align-items: center; justify-content: center; z-index: 2147483647; opacity: 0; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); backdrop-filter: blur(10px); padding: 20px;`; const content = document.createElement('div'); content.innerHTML = `
`; modal.appendChild(content); document.body.appendChild(modal); requestAnimationFrame(() => { modal.style.opacity = '1'; content.firstElementChild.style.transform = 'scale(1)'; }); const closeModal = () => { modal.style.opacity = '0'; content.firstElementChild.style.transform = 'scale(0.95)'; setTimeout(() => modal.remove(), 300); }; content.querySelector('.modal-confirm').onclick = () => { closeModal(); if(onConfirm) onConfirm(); }; modal.addEventListener('click', (e) => { if (e.target === modal) closeModal(); }); } function showToast(msg, type = 'info') { const colors = { success: { bg: 'linear-gradient(145deg, #10b981, #059669)', icon: '🎉' }, warning: { bg: 'linear-gradient(145deg, #f59e0b, #d97706)', icon: '⚠️' }, error: { bg: 'linear-gradient(145deg, #ef4444, #dc2626)', icon: '❌' }, info: { bg: 'linear-gradient(145deg, #3b82f6, #2563eb)', icon: 'ℹ️' } }; const currentType = colors[type] || colors.info; let container = document.getElementById('xy-toast-box'); if (!container) { container = document.createElement('div'); container.id = 'xy-toast-box'; container.style.cssText = `position:fixed; top:32px; left:50%; transform:translateX(-50%); z-index:9999999; display:flex; flex-direction:column; gap:16px; pointer-events:none;`; document.body.appendChild(container); } const toast = document.createElement('div'); toast.style.cssText = `background:${currentType.bg}; color:white; padding:16px 24px; border-radius:14px; font-weight:bold; font-size:15px; box-shadow:0 12px 30px rgba(0,0,0,0.25); transition:all 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55); opacity:0; transform:translateY(-30px) scale(0.9); backdrop-filter: blur(10px); display:flex; align-items:center; overflow:hidden; position:relative; letter-spacing: 0.5px;`; toast.innerHTML = `${currentType.icon}${msg}`; container.appendChild(toast); if(!document.getElementById('xy-toast-style')) { const style = document.createElement('style'); style.id = 'xy-toast-style'; style.innerHTML = `@keyframes xy-toast-progress { from { transform: scaleX(1); } to { transform: scaleX(0); } }`; document.head.appendChild(style); } requestAnimationFrame(() => { toast.style.opacity = '1'; toast.style.transform = 'translateY(0) scale(1)'; }); setTimeout(() => { toast.style.opacity = '0'; toast.style.transform = 'translateY(-20px) scale(0.9)'; setTimeout(() => toast.remove(), 400); }, 3000); } function logMsg(msg, type = 'info', isSilent = false) { const colors = { success: '#10b981', warning: '#f59e0b', error: '#ef4444', info: '#38bdf8', silent: '#94a3b8' }; const color = isSilent ? colors.silent : (colors[type] || colors.info); const time = new Date().toLocaleTimeString('zh-CN', {hour12: false}); const logStr = `[${time}] ${msg}`; sessionLogs.push({ text: logStr, color: color }); if (sessionLogs.length > 80) sessionLogs.shift(); sessionStorage.setItem('xy_session_logs', JSON.stringify(sessionLogs)); const logBox = document.getElementById('xy-activity-log'); if (logBox) { const el = document.createElement('div'); el.style.color = color; el.style.marginBottom = '4px'; el.style.lineHeight = '1.5'; el.innerText = logStr; logBox.appendChild(el); logBox.scrollTop = logBox.scrollHeight; if (logBox.children.length > 80) logBox.removeChild(logBox.firstChild); } if (!isSilent && (type === 'success' || type === 'error' || type === 'warning' || type === 'info')) showToast(msg, type); } function robustClick(el) { if (!el) return; try { const opts = { bubbles: true, cancelable: true, view: window }; el.dispatchEvent(new MouseEvent('pointerdown', opts)); el.dispatchEvent(new MouseEvent('click', opts)); el.click(); } catch (e) { el.click(); } } // ========================================== // 动态条件定时重载引擎 // ========================================== function scheduleDynamicRefresh(delayMs, reason) { if (dynamicRefreshTimeoutId) clearTimeout(dynamicRefreshTimeoutId); if (refreshCountdownTimer) clearInterval(refreshCountdownTimer); const targetTime = Date.now() + delayMs; logMsg(`🔄 动态重载调度:已设定 ${Math.round(delayMs/60000)} 分钟后刷新 (${reason})`, 'silent', true); const updateVisuals = () => { const statusEl = document.getElementById('xy-refresh-status'); if (statusEl) { const leftMs = targetTime - Date.now(); if (leftMs > 0) { const m = Math.floor(leftMs / 60000); const s = Math.floor((leftMs % 60000) / 1000).toString().padStart(2, '0'); statusEl.innerText = `即将重载: ${m}分 ${s}秒 (${reason})`; } else { statusEl.innerText = `正在执行重载...`; } } }; updateVisuals(); refreshCountdownTimer = setInterval(updateVisuals, 1000); dynamicRefreshTimeoutId = setTimeout(() => { logMsg(`🔄 触发动态定时重载...`, 'info', false); window.location.reload(); }, delayMs); } // 🔥暴力且彻底地销毁调度器的方法 function clearDynamicRefresh() { let cleared = false; if (dynamicRefreshTimeoutId) { clearTimeout(dynamicRefreshTimeoutId); dynamicRefreshTimeoutId = null; cleared = true; } if (refreshCountdownTimer) { clearInterval(refreshCountdownTimer); refreshCountdownTimer = null; cleared = true; } lastRefreshStrategy = 'none'; const statusEl = document.getElementById('xy-refresh-status'); if (statusEl && statusEl.innerText !== '目前无重载任务') { statusEl.innerText = '目前无重载任务'; } if (cleared) { logMsg(`🛑 动态重载已在当前区域彻底挂起并强停`, 'silent', true); } } function checkDynamicRefresh() { // 如果处于待命区/讨论区,或者是手动休眠模式,无条件拦截并强制清空倒计时 if (appState.activeZone !== 'course' || appState.mode === 'manual') { if (lastRefreshStrategy !== 'none' || dynamicRefreshTimeoutId) { clearDynamicRefresh(); } return; } const currentTaskType = appState.currentEngine; if (appState.mode === 'loop') { if (currentTaskType === 'doc') { if (lastRefreshStrategy !== 'loop_doc') { lastRefreshStrategy = 'loop_doc'; scheduleDynamicRefresh(15 * 60 * 1000, `文档挂机防卡死`); } } else { let video = document.querySelector('video'); if (!video) { const iframes = document.querySelectorAll('iframe'); for (let i = 0; i < iframes.length; i++) { try { if (iframes[i].contentDocument) video = iframes[i].contentDocument.querySelector('video'); } catch(e){} if (video) break; } } if (video && video.duration >= 3600) { const strategyKey = `loop_video_${video.duration}`; if (lastRefreshStrategy !== strategyKey) { lastRefreshStrategy = strategyKey; scheduleDynamicRefresh(1.2 * video.duration * 1000, `安全循环>1h长视频`); } } else { if (lastRefreshStrategy !== 'none' && !lastRefreshStrategy.startsWith('loop_video_')) { clearDynamicRefresh(); } else if (lastRefreshStrategy.startsWith('loop_video_') && video && video.duration < 3600) { clearDynamicRefresh(); } } } } else if (appState.mode === 'sequence') { if (appState.isTaskCompleted || Date.now() < appState.jumpSleepUntil) { if (lastRefreshStrategy !== 'sequence_completed') { lastRefreshStrategy = 'sequence_completed'; scheduleDynamicRefresh(10 * 60 * 1000, `连播状态休眠探测`); } } else if (currentTaskType === 'doc') { if (lastRefreshStrategy !== 'sequence_doc') { lastRefreshStrategy = 'sequence_doc'; scheduleDynamicRefresh(15 * 60 * 1000, `文档挂机防卡死`); } } else { if (lastRefreshStrategy !== 'none') { clearDynamicRefresh(); } } } } // ========================================== // 🕸️ 网络抓包与DOM双向解析:零延迟讨论区监听 // ========================================== function scanDomForUserNames() { let names = []; try { const els = document.querySelectorAll('[class*="name"], [class*="author"], [class*="nick"], .reply-user'); els.forEach(el => { const cName = (typeof el.className === 'string' ? el.className : '').toLowerCase(); if (cName.includes('course') || cName.includes('group') || cName.includes('title') || cName.includes('task') || cName.includes('file') || cName.includes('nav') || cName.includes('logo') || cName.includes('menu')) { return; } let txt = el.innerText ? el.innerText.trim() : ''; if (txt && txt.length > 1 && txt.length <= 15 && !txt.includes('\n') && !txt.includes('=')) { if (!/^(回复|评论|作者|楼主|老师|助教|管理员|匿名|刚刚|今天|昨天|分享|赞|查看|更多|展开|全部|时间|我的|首页|取消|确定|保存|上传|下载|关闭)$/.test(txt) && !/(课程|作业|考试|测验|班级|任务|讨论区)/.test(txt)) { names.push(cleanName(txt)); } } }); } catch(e) {} return names; } function dispatchCaptureEvent(did, gid) { if (did && gid && (appState.discussionId !== did || appState.discGroupId !== gid)) { appState.discussionId = did; appState.discGroupId = gid; window.dispatchEvent(new CustomEvent('xy-disc-captured', { detail: { did, gid } })); } } function processDiscussionList(list) { if (!Array.isArray(list) || list.length === 0) return; const newNames = []; list.forEach(item => { const realName = decodeNickname(item.nickname); if (realName && realName !== "匿名" && !realName.includes("=")) newNames.push(realName); }); if (newNames.length > 0) { const beforeCount = appState.targetNames.length; let added = false; newNames.forEach(n => { if(!appState.targetNames.includes(n)) { appState.targetNames.push(n); added = true; } }); if (added) { GM_setValue('xy_target_names', JSON.stringify(appState.targetNames)); renderTargetList(document.getElementById('xy-name-search')?.value || ''); if(appState.activeZone === 'disc') logMsg(`📄 网络包捕获 ${appState.targetNames.length - beforeCount} 位新用户`, 'info', true); } } } const originalFetch = window.fetch; window.fetch = async function(...args) { const url = args[0]; let shouldProcess = false; try { if (typeof url === 'string' && (url.includes('/api/jx-iresource/discussion/queryDiscussion') || url.includes('/api/jx-iresource/discussion/queryPoint'))) { const urlObj = new URL(url.startsWith('http') ? url : window.location.origin + url); const did = urlObj.searchParams.get('discussion_id'); const gid = urlObj.searchParams.get('group_id'); if(did && gid) dispatchCaptureEvent(did, gid); shouldProcess = true; } } catch(e) {} const response = await originalFetch.apply(this, args); if (shouldProcess) { try { const clonedResponse = response.clone(); const data = await clonedResponse.json(); if (data.success && data.data) { let list = null; if (Array.isArray(data.data.list)) list = data.data.list; else if (Array.isArray(data.data.records)) list = data.data.records; else if (Array.isArray(data.data.points)) list = data.data.points; else if (Array.isArray(data.data)) list = data.data; if (list) processDiscussionList(list); } } catch(e) {} } return response; }; const originalXhrOpen = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function(method, url) { this._xy_current_url = url; this._xy_should_process = false; return originalXhrOpen.apply(this, arguments); }; const originalXhrSend = XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.send = function(body) { const xhr = this; try { const url = xhr._xy_current_url; if (typeof url === 'string' && (url.includes('/api/jx-iresource/discussion/queryDiscussion') || url.includes('/api/jx-iresource/discussion/queryPoint'))) { const urlObj = new URL(url.startsWith('http') ? url : window.location.origin + url); const did = urlObj.searchParams.get('discussion_id'); const gid = urlObj.searchParams.get('group_id'); if(did && gid) dispatchCaptureEvent(did, gid); xhr._xy_should_process = true; } } catch(e) {} xhr.addEventListener('load', function() { if (!xhr._xy_should_process) return; try { const data = JSON.parse(xhr.responseText); if (data.success && data.data) { let list = null; if (Array.isArray(data.data.list)) list = data.data.list; else if (Array.isArray(data.data.records)) list = data.data.records; else if (Array.isArray(data.data.points)) list = data.data.points; else if (Array.isArray(data.data)) list = data.data; if (list) processDiscussionList(list); } } catch(e) {} }); return originalXhrSend.apply(this, arguments); }; window.addEventListener('xy-disc-captured', (e) => { appState.discLockedUrl = window.location.href; if (appState.activeZone !== 'disc') { logMsg(`🎯 抓包拦截:零延迟识别讨论区网络流!`, 'success', false); switchToZone('disc'); } logMsg('🔄 检测到新讨论区,自动清空旧名单并开启全量采集...', 'info'); appState.targetNames = []; appState.selectedNames.clear(); GM_setValue('xy_target_names', JSON.stringify([])); renderTargetList(document.getElementById('xy-name-search')?.value || ''); setTimeout(() => { fetchCurrentUsers(); }, 800); updateDiscUI(); }); // ========================================== // 🔥 核心战斗模块:纯净雷达寻路与提交 // ========================================== async function getTaskTypeAccurate() { if (document.querySelector('video') || document.querySelector('.prism-player') || document.querySelector('.aliplayer')) return 'video'; const iframes = document.querySelectorAll('iframe'); for (let i = 0; i < iframes.length; i++) { const src = iframes[i].src || ''; if (src.includes('player') || src.includes('video') || src.includes('aliplayer')) return 'video'; try { if (iframes[i].contentDocument && iframes[i].contentDocument.querySelector('video')) return 'video'; } catch(e) {} } return 'doc'; } async function autoSubmitCurrentTask(silent = false) { if (isSubmittingLock) return false; isSubmittingLock = true; try { const token = await getAuthToken(); const groupId = getCourseGroupId(); const nodeId = getNodeId(); if (!groupId || !nodeId) return false; let taskId = null; const radarRes = await fetch(`https://${domain}/api/jx-stat/group/task/un_finish`, { headers: { "authorization": `Bearer ${token}` } }); const radarData = await radarRes.json(); if (radarData.success && radarData.data) { const rTask = radarData.data.find(t => t.node_id == nodeId); if (rTask && rTask.finish !== 2) { taskId = rTask.task_id || rTask.id; } else if (!rTask || rTask.finish === 2) { if (!silent) logMsg('✅ [雷达] 任务已在后台完成,无需再提交!', 'success', false); return true; } } if (!taskId) { const resources = await loadCourseResources(groupId); if (resources) { const flatRes = flattenResources(resources); const currentRes = flatRes.find(r => r.node_id == nodeId || r.id == nodeId); if (currentRes) taskId = currentRes.task_id || currentRes.id; } } if (!taskId) return false; const finishRes = await fetch(`https://${domain}/api/jx-iresource/resource/finishActivity`, { method: "POST", headers: { "authorization": `Bearer ${token}`, "Content-Type": "application/json; charset=UTF-8" }, body: JSON.stringify({ group_id: groupId, node_id: nodeId, task_id: taskId }) }); const finishData = await finishRes.json(); if (finishData.success === true || finishData.code === 200 || finishData.code === 0) { if (!silent) logMsg('✅ [API] 任务时长达标,后端已成功确认!', 'success', false); return true; } else { if (!silent) logMsg(`⚠️ 时长验证未通过,等待下一次提交心跳...`, 'warning', true); return false; } } catch(e) { if (!silent) logMsg(`❌ 任务提交请求异常`, 'error', true); } finally { isSubmittingLock = false; } return false; } async function tryJumpToNext() { if (isJumpingLock) return; if (Date.now() < appState.jumpSleepUntil) return; // 休眠保护机制 isJumpingLock = true; try { const currentGroupId = getCourseGroupId(); const currentNodeId = getNodeId(); logMsg('🔄 正在通过【全局雷达】匹配下一项自主观看任务...', 'info', false); const token = await getAuthToken(); const res = await fetch(`https://${domain}/api/jx-stat/group/task/un_finish`, { headers: { "authorization": `Bearer ${token}` } }); const unfinishData = await res.json(); const unfinishTasks = (unfinishData.success && unfinishData.data) ? unfinishData.data : []; const now = new Date(); const watchTasks = unfinishTasks.filter(t => { if (t.task_type !== 1) return false; if (t.finish === 2) return false; if (t.node_id == currentNodeId) return false; if (t.start_time && new Date(t.start_time) > now) return false; return true; }); let targetTask = null; if (watchTasks.length > 0) { let courseTasks = watchTasks.filter(t => t.group_id == currentGroupId); targetTask = courseTasks.length > 0 ? courseTasks[0] : watchTasks[0]; } if (targetTask) { let resId = targetTask.resource_id; if (!resId) { const resources = await loadCourseResources(targetTask.group_id); if (resources) { const flatRes = flattenResources(resources); const rInfo = flatRes.find(r => r.node_id == targetTask.node_id || r.id == targetTask.node_id); if (rInfo) { resId = rInfo.id || rInfo.resource_id; } } } if (!resId) resId = targetTask.id; logMsg(`⏭️ 雷达锁定目标:${targetTask.name},执行跨节点跳转!`, 'success', false); const pathPrefix = window.location.href.includes('/course/') ? 'course' : 'mycourse'; appState.jumpFailCount = 0; // 跳转成功,清空失败计数 setTimeout(() => { window.location.href = `/app/jx-web/${pathPrefix}/${targetTask.group_id}/resource/${resId}/${targetTask.node_id}`; }, 500); setTimeout(() => { isJumpingLock = false; }, 5000); return; } appState.jumpFailCount++; if (appState.jumpFailCount >= 3) { logMsg('⏳ 连续3次探测无新任务,引擎进入休眠模式,10分钟后重载...', 'warning', false); appState.jumpSleepUntil = Date.now() + 10 * 60 * 1000; appState.jumpFailCount = 0; updateCourseUI(); isJumpingLock = false; } else { logMsg(`⏳ 探测无新任务,5秒后重试 (第${appState.jumpFailCount}次)...`, 'warning', false); setTimeout(() => { isJumpingLock = false; }, 5000); } } catch(e) { appState.jumpFailCount++; if (appState.jumpFailCount >= 3) { logMsg('⏳ 网络探测连续3次异常,进入深度休眠,10分钟后重新探测...', 'warning', false); appState.jumpSleepUntil = Date.now() + 10 * 60 * 1000; appState.jumpFailCount = 0; updateCourseUI(); isJumpingLock = false; } else { logMsg('雷达连通异常,5秒后重试跳转', 'error', false); setTimeout(() => { isJumpingLock = false; }, 5000); } } } let lastTaskCheck = 0; async function globalTaskStatusChecker(forceCheck = false) { if (appState.mode === 'manual' && !forceCheck) return; const groupId = getCourseGroupId(); const nodeId = getNodeId(); if (!groupId || !nodeId || (Date.now() - lastTaskCheck < 6000 && !forceCheck)) return; lastTaskCheck = Date.now(); try { const token = await getAuthToken(); const res = await fetch(`https://${domain}/api/jx-stat/group/task/un_finish`, { headers: { "authorization": `Bearer ${token}` } }); const data = await res.json(); if (data.success && data.data) { const isStillUnfinished = data.data.filter(t => t.task_type === 1).some(t => t.node_id == nodeId); if (!isStillUnfinished) { if (!appState.isTaskCompleted) { appState.isTaskCompleted = true; updateCourseUI(); await autoSubmitCurrentTask(true); logMsg('✅ [雷达] 当前任务已在全局雷达达成!', 'success', false); } } else { if (appState.isTaskCompleted || (document.getElementById('xy-status-banner') && document.getElementById('xy-status-banner').innerText.includes('初始化'))) { appState.isTaskCompleted = false; updateCourseUI(); } } } } catch(e) {} } function forceDismissPopups(doc = document) { if (!appState.guardActive) return false; try { const dialogs = doc.querySelectorAll('.el-message-box:not([style*="none"]), .el-dialog:not([style*="none"]), .dialog-wrapper:not([style*="none"]), .v-modal'); for (let box of dialogs) { if (box.offsetParent !== null) { const boxText = (box.innerText || "").replace(/\s+/g, ''); if (/长时间.*操作|无操作|没有操作|暂停|休息一下|继续|确认打开|预览确认/.test(boxText)) { let targetBtn = box.querySelector('.el-button--primary, .el-message-box__btns .el-button:nth-child(2)'); if (!targetBtn) { const btns = Array.from(box.querySelectorAll('button, .el-button, [role="button"]')); targetBtn = btns.find(b => /确定|继续|是|我知道了|恢复|确认/.test((b.innerText || "").replace(/\s+/g, ''))); } if (targetBtn && Date.now() - appState.lastPopupClickTime > 2000) { appState.lastPopupClickTime = Date.now(); setTimeout(() => { robustClick(targetBtn); logMsg(`🛡️ 拦截系统弹窗...`, 'success', false); }, 300); return true; } } } } const bodyText = doc.body ? (doc.body.innerText || "").replace(/\s+/g, '') : ""; if (/长时间.*操作|无操作|没有操作|任务暂停|休息一下|确认打开/.test(bodyText)) { const allButtons = Array.from(doc.querySelectorAll('button, [role="button"], .btn, span[class*="btn"]')); const targetBtn = allButtons.find(b => b.offsetParent !== null && /确定|继续|恢复|是|我知道了|确认/.test((b.innerText || "").replace(/\s+/g, ''))); if (targetBtn && Date.now() - appState.lastPopupClickTime > 2000) { appState.lastPopupClickTime = Date.now(); setTimeout(() => { robustClick(targetBtn); logMsg(`🛡️ 拦截系统弹窗...`, 'success', false); }, 500); return true; } } } catch(e) {} return false; } async function triggerDocBatchSniper() { appState.batchDocSubmitting = true; logMsg('🔄 启动【全局文档清理】,静默完成阅读...', 'warning', false); try { const token = await getAuthToken(); const res = await fetch(`https://${domain}/api/jx-stat/group/task/un_finish`, { headers: { "authorization": `Bearer ${token}` } }); const data = await res.json(); if (data.success && data.data) { const docTasks = data.data.filter(t => t.task_type === 1 && t.finish !== 2); if (docTasks.length > 0) { for (let i = 0; i < docTasks.length; i++) { const t = docTasks[i]; if (t.node_id == getNodeId() || /mp4|avi|mov|wmv|flv|mkv/i.test(t.name || '')) continue; await new Promise(r => setTimeout(r, Math.floor(Math.random() * 4000) + 3000)); await fetch(`https://${domain}/api/jx-iresource/resource/finishActivity`, { method: "POST", headers: { "authorization": `Bearer ${token}`, "Content-Type": "application/json; charset=UTF-8" }, body: JSON.stringify({ group_id: t.group_id, node_id: t.node_id, task_id: t.task_id }) }); logMsg(`📄 自动处理:静默提交文档 -> ${t.name}`, 'success', false); } logMsg('🎉 文档自动清理完成,全网未读文档已提交!', 'success', false); } } } catch (e) {} finally { appState.batchDocSubmitting = false; } } function checkAndClickDocPreview() { const nodeId = getNodeId(); if (!nodeId || appState.docPreviewDoneNodeId === nodeId) return; appState.docPreviewDoneNodeId = nodeId; } async function sendRecordRequest() { if (appState.activeZone !== 'course') return; const groupId = getCourseGroupId(); const resourceId = getNodeId(); if (!groupId || !resourceId) return; try { const token = await getAuthToken(); const uRes = await fetch(`https://${domain}/api/jx-auth/oauth2/info`, { headers: { "authorization": `Bearer ${token}` }}); const uData = await uRes.json(); const userId = uData?.data?.info?.id; if(!userId) return; const msgObj = { user_id: userId, group_id: groupId, clientType: 1, roleType: 1, resourceId: resourceId }; const message = JSON.stringify(msgObj); const timestamp = Date.now().toString(); const nonce = crypto.randomUUID(); const arr = [encodeURIComponent(message), timestamp, nonce, "--xy-create-signature--"].sort().join(""); const hashBuffer = await crypto.subtle.digest('SHA-1', new TextEncoder().encode(arr)); const signature = Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join(''); const response = await fetch(`https://${domain}/api/jx-iresource/learnLength/learnRecord`, { method: 'POST', headers: { 'authorization': `Bearer ${token}`, 'content-type': 'application/json' }, body: JSON.stringify({ message, signature, timestamp, nonce }) }); const result = await response.json(); if (result.code === 200 || result.success) { appState.recordCount++; appState.totalTime += 30; appState.lastRecordDate = new Date(); sessionStorage.setItem('xy_recordCount', appState.recordCount); sessionStorage.setItem('xy_totalTime', appState.totalTime); updateCourseUI(); } } catch (e) {} } function toggleRecord(start) { if (appState.recordActive === start) return; appState.recordActive = start; if (start) { sendRecordRequest(); recordIntervalTimer = setInterval(sendRecordRequest, 30000); realTimeTimer = setInterval(() => { appState.realTime++; sessionStorage.setItem('xy_realTime', appState.realTime); updateCourseUI(); }, 1000); if (!appState.guardActive) { appState.guardActive = true; GM_setValue('xy_guard_active', true); } } else { clearInterval(recordIntervalTimer); clearInterval(realTimeTimer); recordIntervalTimer = null; realTimeTimer = null; } updateCourseUI(); } function ensureAutoRecord() { if (appState.activeZone !== 'course') return; const nodeId = getNodeId(); if (nodeId && !appState.recordActive) toggleRecord(true); else if (!nodeId && appState.recordActive) toggleRecord(false); } // ========================================== // ⚙️ 双频驱动引擎:UI渲染(1秒) + 暴力操作(5秒) // ========================================== let watchdogLastActiveTime = Date.now(); // 频段1:1秒级状态维持(脚本进度隔离、文档计时、弹窗点击) setInterval(async () => { await runLowLevelScanner(); // 🔥 核心修复:将清理检测提到最外层,100%保证进入非刷课页面或手动休眠就会直接销毁倒计时 checkDynamicRefresh(); if (appState.activeZone !== 'course') { watchdogLastActiveTime = Date.now(); // 防死锁强刷:处于待命区/讨论区时,持续给看门狗喂时间戳 return; } if (appState.guardActive) forceDismissPopups(document); // 统一提取当前任务类型,用于全局调度和引擎判断 appState.currentEngine = await getTaskTypeAccurate(); if (Date.now() - watchdogLastActiveTime > 180000) { sessionStorage.setItem('xy_reload_reason', '180秒无响应,防死锁刷新'); logMsg(`💀 发生死锁!执行强刷...`, 'error', false); setTimeout(() => window.location.reload(), 1000); return; } // 如果正处于休眠探测状态,则跳过后续检查,直接放行循环 if (appState.mode === 'sequence' && Date.now() < appState.jumpSleepUntil) { updateCourseUI(); watchdogLastActiveTime = Date.now(); return; } const groupId = getCourseGroupId(); if (groupId && appState.mode !== 'manual') { const taskType = appState.currentEngine; // 直接复用 const vEngine = document.getElementById('xy-engine-video'), dEngine = document.getElementById('xy-engine-doc'); if(vEngine) vEngine.style.opacity = taskType === 'video' ? '1' : '0.4'; if(dEngine) dEngine.style.opacity = taskType === 'doc' ? '1' : '0.4'; let isMakingProgress = false; if (taskType === 'video') { let video = document.querySelector('video'); if (!video) { const iframes = document.querySelectorAll('iframe'); for (let i = 0; i < iframes.length; i++) { try { if (iframes[i].contentDocument) video = iframes[i].contentDocument.querySelector('video'); } catch(e){} if (video) break; } } if (video) { if (video.paused && !video.ended) video.play().catch(() => { if(!appState.hardwareMute) video.muted = true; video.play().catch(()=>{}); }); if (appState.hardwareMute && !video.muted) video.muted = true; if (appState.mode === 'sequence') { if (appState.videoScriptProgress === undefined) { appState.videoScriptProgress = 0; appState.videoLastTime = video.currentTime; if (video.currentTime > 2) { logMsg('🔄 强制视频从头开始播放...', 'warning', true); video.currentTime = 0; appState.videoLastTime = 0; } } if (video.currentTime - appState.videoLastTime > 3) { logMsg('❌ 检测到违规拖动进度条,强制刷新重试!', 'error'); appState.videoLastTime = video.currentTime; setTimeout(() => window.location.reload(), 500); return; } if (!video.paused && !video.ended) { appState.videoScriptProgress += 1; } appState.videoLastTime = video.currentTime; let duration = video.duration || 1; let scriptProgressPct = Math.min((appState.videoScriptProgress / duration) * 100, 100); const statusEl = document.getElementById('xy-video-status'); if (statusEl) { statusEl.innerText = (video.ended || appState.videoScriptProgress >= duration) ? '已播完, 验证中...' : `脚本进度 ${scriptProgressPct.toFixed(1)}%`; } if (video.currentTime > 0 && !video.paused) isMakingProgress = true; if (video.ended || appState.videoScriptProgress >= duration) isMakingProgress = true; } else { let progress = (video.currentTime / video.duration) * 100 || 0; const statusEl = document.getElementById('xy-video-status'); if (statusEl) { if (appState.mode === 'loop' && appState.isTaskCompleted) { statusEl.innerText = `[循环] 进度 ${progress.toFixed(1)}%`; } else { statusEl.innerText = video.ended ? '已播完, 验证中...' : `进度 ${progress.toFixed(1)}%`; } } if (video.ended && appState.mode === 'loop' && !appState.isProcessingJump) { appState.isProcessingJump = true; autoSubmitCurrentTask(true).then(success => { if (success || appState.isTaskCompleted) { logMsg('✅ 安全循环:当前任务已达标,即将刷新页面重载继续挂机...', 'success', false); } else { logMsg('⚠️ 安全循环:时长暂未达标,即将刷新页面重置播放...', 'warning', true); } setTimeout(() => { logMsg('🔄 触发安全循环单次播完重载机制...', 'info', false); window.location.reload(); }, 1500); }); } if (video.currentTime > 0 && !video.paused) isMakingProgress = true; if (video.ended) isMakingProgress = true; } } } else if (taskType === 'doc') { checkAndClickDocPreview(); if (!appState.isTaskCompleted) { appState.docReadTime += 1; if (appState.mode === 'sequence') { let progress = Math.min((appState.docReadTime / 130) * 100, 100); const statusEl = document.getElementById('xy-doc-status'), progressEl = document.getElementById('xy-doc-progress'); if(statusEl) { if (appState.docReadTime < 130) { statusEl.innerText = `阅读倒数: ${progress.toFixed(1)}%`; } else if (appState.docReadTime < 300) { statusEl.innerText = `验证重试中: ${appState.docReadTime}s`; } else { statusEl.innerText = `强制提交阶段: ${appState.docReadTime}s`; } } if(progressEl) progressEl.style.width = `${progress}%`; } else { let progress = Math.min((appState.docReadTime / 120) * 100, 100); const statusEl = document.getElementById('xy-doc-status'), progressEl = document.getElementById('xy-doc-progress'); if(statusEl) { if (appState.mode === 'loop' && appState.docReadTime >= 120) { statusEl.innerText = `[循环] 挂机中: ${appState.docReadTime}s`; } else { statusEl.innerText = progress < 100 ? `等待 ${progress.toFixed(1)}%` : `请求验证中...`; } } if(progressEl) progressEl.style.width = `${progress}%`; if (appState.mode === 'loop' && appState.docReadTime >= 120 && !appState.isProcessingJump) { appState.isProcessingJump = true; autoSubmitCurrentTask(true).then(success => { if (success) { appState.isTaskCompleted = true; logMsg('✅ 安全循环:文档已达标,继续静默挂机...', 'success', false); } appState.isProcessingJump = false; }); } } isMakingProgress = true; } else { const statusEl = document.getElementById('xy-doc-status'), progressEl = document.getElementById('xy-doc-progress'); if(statusEl) statusEl.innerText = `已达标 (挂机或跳转)`; if(progressEl) progressEl.style.width = `100%`; isMakingProgress = true; } } if (isMakingProgress || appState.isProcessingJump || appState.recordActive) { watchdogLastActiveTime = Date.now(); } } else { watchdogLastActiveTime = Date.now(); } }, 1000); // 频段2:5秒级跳课与连播模式的专属提交调度 setInterval(async () => { if (!appState.aiMode || appState.activeZone !== 'course' || appState.mode !== 'sequence') return; if (Date.now() < appState.jumpSleepUntil) return; const groupId = getCourseGroupId(); const nodeId = getNodeId(); if (!groupId || !nodeId) { await tryJumpToNext(); return; } if (appState.isTaskCompleted) { await tryJumpToNext(); return; } const taskType = await getTaskTypeAccurate(); if (taskType === 'video') { let video = document.querySelector('video'); if (!video) { const iframes = document.querySelectorAll('iframe'); for (let i = 0; i < iframes.length; i++) { try { if (iframes[i].contentDocument) video = iframes[i].contentDocument.querySelector('video'); } catch(e){} if (video) break; } } if (video && (video.ended || (video.duration > 0 && appState.videoScriptProgress >= video.duration))) { logMsg('⏳ 满足连播脚本进度,发起视频验证请求...', 'info', true); const success = await autoSubmitCurrentTask(); if (success) { appState.isTaskCompleted = true; logMsg('✅ [API] 视频任务已获服务器成功确认!', 'success'); updateCourseUI(); await tryJumpToNext(); } else { logMsg('⚠️ 后台仍判未达标,5秒后继续强交!', 'warning', true); } } } else if (taskType === 'doc') { if (appState.docReadTime >= 130) { if (appState.lastDocSubmitTime === 0 || (appState.docReadTime - appState.lastDocSubmitTime >= 30)) { let isDocRetry = appState.lastDocSubmitTime > 0; logMsg(isDocRetry ? `⏳ 文档未达标,周期性重试提交 (${appState.docReadTime}s)...` : '⏳ 2分10秒已到,发起首次文档验证请求...', 'info', true); const success = await autoSubmitCurrentTask(); appState.lastDocSubmitTime = appState.docReadTime; if (success) { appState.isTaskCompleted = true; logMsg('✅ [API] 文档任务已获服务器成功确认!', 'success'); updateCourseUI(); if (appState.docBatchSubmit && !appState.batchDocSubmitting) triggerDocBatchSniper(); await tryJumpToNext(); } else { if (appState.docReadTime >= 300) { logMsg('⚡ 超过5分钟仍未达标,触发【强制提交放行】保护机制!', 'warning', false); appState.isTaskCompleted = true; updateCourseUI(); if (appState.docBatchSubmit && !appState.batchDocSubmitting) triggerDocBatchSniper(); await tryJumpToNext(); } else { logMsg(`⚠️ 文档验证未通过,将在30秒后利用API重试 (当前${appState.docReadTime}s/300s强行线)`, 'warning', false); } } } } } }, 5000); // 频段3:讨论区DOM智能扫描探测 (3秒一次,不影响主轴) setInterval(() => { if (appState.activeZone === 'disc' && appState.enableDomScan) { const domNames = scanDomForUserNames(); let added = false; domNames.forEach(name => { if (!appState.targetNames.includes(name)) { appState.targetNames.push(name); added = true; } }); if (added) { GM_setValue('xy_target_names', JSON.stringify(appState.targetNames)); renderTargetList(document.getElementById('xy-name-search')?.value || ''); } } }, 3000); // ========================================== // 🎯 讨论区点赞抓取模块:自动全页扫描 // ========================================== async function fetchDiscussions(pageSize = 20, pageIndex = 1) { if (!appState.discussionId || !appState.discGroupId) { showToast('未捕获到ID,请重刷页面获取截包!', 'warning'); return null; } try { const token = await getAuthToken(); const res = await fetch(`https://${domain}/api/jx-iresource/discussion/queryDiscussion?discussion_id=${appState.discussionId}&group_id=${appState.discGroupId}&sort_type=1&sort_way=desc&page_index=${pageIndex}&page_size=${pageSize}&channel=`, { headers: { "authorization": `Bearer ${token}` } }); const data = await res.json(); if (data.success && data.data) { if (Array.isArray(data.data.list)) return data.data.list; if (Array.isArray(data.data.records)) return data.data.records; if (Array.isArray(data.data.points)) return data.data.points; if (Array.isArray(data.data)) return data.data; } return []; } catch(e) { return null; } } async function fetchCurrentUsers() { if (appState.activeZone !== 'disc') return; if(!appState.discussionId) { logMsg('未拦截到讨论区ID,请随便点击一下任意评论!', 'warning'); return; } const btn = document.getElementById('xy-btn-fetch-users'); const originalText = btn ? btn.innerText : ''; if(btn) { btn.disabled = true; btn.innerText = "深潜抓取中..."; } logMsg('🧹 正在深度扫描全部评论页,自动去重收录...', 'info'); try { let pageIndex = 1; while (true) { if(btn) btn.innerText = `深潜抓取中 (第${pageIndex}页)...`; const list = await fetchDiscussions(20, pageIndex); if (!list || list.length === 0) break; list.forEach(item => { const realName = decodeNickname(item.nickname); if (realName && realName !== "匿名" && !realName.includes("=")) { if (!appState.targetNames.includes(realName)) { appState.targetNames.push(realName); } } }); if (list.length < 20) break; await sleep(300); pageIndex++; if (pageIndex > 300) break; } const domNames = scanDomForUserNames(); domNames.forEach(name => { if (!appState.targetNames.includes(name)) { appState.targetNames.push(name); } }); GM_setValue('xy_target_names', JSON.stringify(appState.targetNames)); renderTargetList(document.getElementById('xy-name-search')?.value || ''); logMsg(`✅ 全量扫描到底!总库现存 ${appState.targetNames.length} 人。`, 'success'); } catch (error) { logMsg('抓取失败,请检查网络或刷新重试', 'error'); } finally { if(btn) { btn.disabled = false; btn.innerText = originalText || "🔄 手动刷新名单"; } } } function getCheckedTargetNames() { return Array.from(appState.selectedNames); } async function autoLikeAction(isTargeted = false) { if (appState.activeZone !== 'disc') return; if(!appState.discussionId) { logMsg('网络流未就绪,请随便点击一个评论触发抓包', 'warning'); return; } const checkedNames = isTargeted ? getCheckedTargetNames() : []; if (isTargeted && checkedNames.length === 0) { logMsg('请先勾选目标人物', 'warning'); return; } const btn = document.getElementById(isTargeted ? 'xy-btn-target-like' : 'xy-btn-like'); const originalText = btn.innerText; btn.disabled = true; try { let targets = []; const MAX_LIKES = 15; let pageIndex = 1; while(true) { btn.innerText = `检索点赞目标 (页${pageIndex})...`; const list = await fetchDiscussions(20, pageIndex); if (!list || list.length === 0) break; if (isTargeted) { const matched = list.filter(item => checkedNames.includes(decodeNickname(item.nickname))); targets.push(...matched); } else { targets.push(...list); } if (targets.length >= (isTargeted ? checkedNames.length : MAX_LIKES)) break; if (list.length < 20) break; await sleep(300); pageIndex++; if (pageIndex > 300) break; } if (targets.length === 0) { logMsg(`未找到匹配的目标列表`, 'warning'); return; } targets = targets.slice(0, MAX_LIKES); const uniqueTargets = []; const seenIds = new Set(); for (const t of targets) { if (!seenIds.has(t.id)) { seenIds.add(t.id); uniqueTargets.push(t); } } let successCount = 0; const token = await getAuthToken(); logMsg(`锁定 ${uniqueTargets.length} 个目标评论,准备就绪,开始自动点赞...`, 'info'); btn.innerText = `点赞发射中...`; for (let i = 0; i < uniqueTargets.length; i++) { const item = uniqueTargets[i]; const payload = { discussion_id: appState.discussionId, group_id: appState.discGroupId, point_id: item.id, like: 1 }; try { const likeRes = await fetch(`https://${domain}/api/jx-iresource/discussion/like`, { method: "POST", headers: { "authorization": `Bearer ${token}`, "Content-Type": "application/json; charset=UTF-8" }, body: JSON.stringify(payload) }); const likeData = await likeRes.json(); if (likeData.success || likeData.code === 200 || likeData.code === 0) successCount++; } catch(e) {} await sleep(Math.floor(Math.random() * 700) + 800); } logMsg(`🎉 点赞任务结束!成功点赞 ${successCount} 次!即将刷新页面...`, 'success'); setTimeout(() => { window.location.reload(); }, 1500); } catch (e) { logMsg('点赞异常', 'error'); } finally { btn.disabled = false; btn.innerText = originalText; } } function getRandomReplyText() { const templates = [ "非常赞同你的观点,这种思路确实能给我们带来很多新的启发和思考!", "同学说得太对了,我也一直有这个想法,按照这个方法去做肯定会有很大收获。", "感谢分享!这个角度非常新颖,让我对这个问题有了更加全面和深入的理解。", "这确实是一个值得深入探讨的好问题,你的分析非常有逻辑,支持一下!", "完全同意!这种方法在实际应用中非常有效,非常值得大家一起学习和借鉴。", "很有道理,细节决定成败,你提到的这几个关键点在实践中确实极容易被忽略。", "受教了,之前一直没想通这个问题,看了你的清晰解释之后感觉豁然开朗!", "分析得很透彻!结合我们目前的课程学习内容来看,这个总结非常有指导意义。", "特别认同这段话的内容,学习到了新的知识点,期待以后能有更多这样的干货!", "说得非常有见地,而且语言表达也很清晰易懂,把复杂的问题简单化了,佩服!" ]; if (appState.useCustomReply && appState.customReplies && appState.customReplies.length > 0) { // 过滤符合条件的句子(≥16汉字) const validCustoms = appState.customReplies.filter(text => (text.match(/[\u4e00-\u9fa5]/g) || []).length >= 16); if (validCustoms.length > 0) { return validCustoms[Math.floor(Math.random() * validCustoms.length)]; } else { logMsg('⚠️ 自定义回复库中没有合规句子,系统已自动回退到默认语料', 'warning', true); } } return templates[Math.floor(Math.random() * templates.length)]; } function buildDraftJsComment(text) { const randomKey = Math.random().toString(36).substring(2, 7); const obj = { blocks: [ { key: randomKey, text: text, type: "unstyled", depth: 0, inlineStyleRanges: [], entityRanges: [], data: {} } ], entityMap: {} }; return JSON.stringify(obj); } async function autoReplyAction(isTargeted = false) { if (appState.activeZone !== 'disc') return; if(!appState.discussionId) { logMsg('网络流未就绪,请随便点击一个评论触发抓包', 'warning'); return; } const checkedNames = isTargeted ? getCheckedTargetNames() : []; if (isTargeted && checkedNames.length === 0) { logMsg('请先勾选目标人物', 'warning'); return; } const btnId = isTargeted ? 'xy-btn-target-reply' : 'xy-btn-reply'; const btn = document.getElementById(btnId); const originalText = btn ? btn.innerText : '自动回复'; if (btn) btn.disabled = true; try { let targets = []; const MAX_REPLIES = 15; let pageIndex = 1; while(true) { if (btn) btn.innerText = `检索回复目标 (页${pageIndex})...`; const list = await fetchDiscussions(20, pageIndex); if (!list || list.length === 0) break; if (isTargeted) { const matched = list.filter(item => checkedNames.includes(decodeNickname(item.nickname))); targets.push(...matched); } else { targets.push(...list); } if (targets.length >= (isTargeted ? checkedNames.length : MAX_REPLIES)) break; if (list.length < 20) break; await sleep(300); pageIndex++; if (pageIndex > 300) break; } if (targets.length === 0) { logMsg(`未找到匹配的回复目标列表`, 'warning'); return; } targets = targets.slice(0, MAX_REPLIES); const uniqueTargets = []; const seenIds = new Set(); for (const t of targets) { if (!seenIds.has(t.id)) { seenIds.add(t.id); uniqueTargets.push(t); } } let successCount = 0; const token = await getAuthToken(); logMsg(`锁定 ${uniqueTargets.length} 个目标评论,准备就绪,开始自动回复...`, 'info'); if (btn) btn.innerText = `回复发射中...`; for (let i = 0; i < uniqueTargets.length; i++) { const item = uniqueTargets[i]; const replyText = getRandomReplyText(); const payload = { discussion_id: appState.discussionId, group_id: appState.discGroupId, point_id: item.id, comment: buildDraftJsComment(replyText), open_anonymous_mode: false }; try { const replyRes = await fetch(`https://${domain}/api/jx-iresource/discussion/comment`, { method: "POST", headers: { "authorization": `Bearer ${token}`, "Content-Type": "application/json; charset=UTF-8" }, body: JSON.stringify(payload) }); const replyData = await replyRes.json(); if (replyData.success || replyData.code === 200 || replyData.code === 0) { successCount++; logMsg(`✅ 成功回复 [${decodeNickname(item.nickname)}]: ${replyText.substring(0,8)}...`, 'success', true); } } catch(e) {} await sleep(Math.floor(Math.random() * 1200) + 1800); } logMsg(`🎉 回复任务结束!成功回复 ${successCount} 次!即将刷新页面...`, 'success'); setTimeout(() => { window.location.reload(); }, 2000); } catch (e) { logMsg('回复异常', 'error'); } finally { if (btn) { btn.disabled = false; btn.innerText = originalText; } } } // ========================================== // ☁️ 小雅辅助工具云端情报站 (系统公告) // ========================================== function fetchCloudIntelligence() { const contentBox = document.getElementById('xy-bc-content'); if (!contentBox) return; const timestamp = Date.now(); const url = `https://gitee.com/fieldlu/xy-script-assets/raw/main/notice_new.json?t=${timestamp}`; try { if (typeof GM_xmlhttpRequest !== "undefined") { GM_xmlhttpRequest({ method: 'GET', url: url, headers: { 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache' }, nocache: true, timeout: 10000, onload: function(response) { if (response.status >= 200 && response.status < 300) { try { const realData = JSON.parse(response.responseText); contentBox.innerHTML = `