您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
支持BT4G/BTDig/BTSOW/Nyaa/GY/DMHY/SOBT/BTMulu等网站,可一键复制磁力链和推送到115网盘进行离线,支持打开磁力链,并支持通过脚本菜单控制各按钮的显示(推送离线任务需当前浏览器已登录(不可用)115会员账号)
当前为
// ==UserScript== // @name 一键复制磁力链和推送到115离线 // @author [email protected] // @description 支持BT4G/BTDig/BTSOW/Nyaa/GY/DMHY/SOBT/BTMulu等网站,可一键复制磁力链和推送到115网盘进行离线,支持打开磁力链,并支持通过脚本菜单控制各按钮的显示(推送离线任务需当前浏览器已登录(不可用)115会员账号) // @version 1.1.3.20250819 // @icon data:image/gif;base64,R0lGODlhgAGAAZECAPr7/ERNVv///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo5OTk5ODkxZS0wMWE2LTRlMTItYWM1Mi00YTIzMzI1MTViYjQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkU2QTk5NkYxM0UzMTFFQzg5RkRCRTMwRTcyQUZCRjIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkU2QTk5NkUxM0UzMTFFQzg5RkRCRTMwRTcyQUZCRjIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxOTQyMDFlMi00OGRjLTQ3OTgtOTFlNi05ZjkyNzhjNTJlZTUiIHN0UmVmOmRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDplMjk3YTUwZC00MTM4LWVmNDYtYTY3Ni1kZTkzNDU1ZjNmOTkiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRm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 // @include *://bt4gprx.com/* // @include *://*btdig.com/* // @include *://*btsow.*/* // @include *://nyaa.si/* // @include *://*dmhy.*/* // @include *://*gying.*/* // @include *://*gyg.*/* // @include *://*seedhub.*/* // @include *://*.longwangbt.*/* // @include *://*yuhuage.*/* // @include *://sobt*.*/* // @include *://clb*.*/* // @include *://*btmulu.*/* // @include *://*cili.*/* // @include *://*mag.*/* // @include *://*wuji.*/* // @grant GM_setClipboard // @grant GM_xmlhttpRequest // @grant GM_getValue // @grant GM_setValue // @grant GM_registerMenuCommand // @connect 115.com // @connect login.115.com // @connect * // @run-at document-end // @namespace https://gf.qytechs.cn/users/1453515 // @license MIT // ==/UserScript== (function() { 'use strict'; const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); const CONFIG = { notificationTimeout: isMobile ? 5000 : 3000, cookieRefreshInterval: 30 * 60 * 1000, retryDelay: 2000, maxRetries: 3, defaultTimeout: 8000, enableCopyButton: GM_getValue('enableCopyButton', true), enableOfflineButton: GM_getValue('enableOfflineButton', true), enableOpenButton: GM_getValue('enableOpenButton', true) }; const processedElements = new WeakSet(); function processElements(selector, processor, dataAttribute = 'buttonsAdded') { document.querySelectorAll(selector).forEach(element => { if (processedElements.has(element) || element.dataset[dataAttribute]) return; const result = processor(element); if (result !== false) { processedElements.add(element); element.dataset[dataAttribute] = 'true'; } }); } async function retryOperation(operation, maxRetries = CONFIG.maxRetries, onRetry = null) { for (let attempt = 0; attempt <= maxRetries; attempt++) { try { return await operation(attempt); } catch (error) { console.error(`Operation failed (attempt ${attempt + 1}/${maxRetries + 1}):`, error); if (attempt === maxRetries) { throw error; } if (onRetry) { onRetry(attempt, maxRetries); } await new Promise(resolve => setTimeout(resolve, CONFIG.retryDelay * (attempt + 1))); } } } function setupRetryButton(button, retryFunction) { setButtonError(button, '获取失败,点击重试'); button.style.cursor = 'pointer'; button.addEventListener('click', () => { button.textContent = '重新获取中...'; button.style.color = '#666'; button.style.cursor = 'default'; retryFunction().then(success => { if (!success) setButtonError(button, '获取失败'); }).catch(error => { console.error('重试失败:', error); setButtonError(button, '重试失败'); }); }); } const ERROR_CODES = { 10008: '任务已存在,无需重复添加', 911: '需要账号验证,请确保已登录(不可用)115会员账号', 990: '任务包含违规内容,无法添加', 991: '服务器繁忙,请稍后再试', 992: '离线下载配额已用完', 993: '当前账号无权使用离线下载功能', 994: '文件大小超过限制', 995: '不支持的链接类型', 996: '网络错误,请检查连接', 997: '服务器内部错误', 998: '请求超时', 999: '未知错误' }; function initializeScript() { addMenuCommands(); setInterval(checkCookieRefresh, 5 * 60 * 1000); setupMutationObserver(); addActionButtons(); } function addMenuCommands() { const menuCommands = [ { name: "检查115登录(不可用)状态", handler: async () => { try { const isLoggedIn = await check115Login(true); showNotification('115状态', isLoggedIn ? '已登录(不可用)' : '未登录(不可用)'); if (!isLoggedIn) { setTimeout(() => { if (confirm('需要登录(不可用)115网盘,是否进入115网盘登录(不可用)页面?')) { window.open("https://115.com/?mode=login", "_blank"); } }, 500); } } catch (error) { showNotification('检查失败', error.message); } } }, { name: "打开115网盘", handler: () => window.open("https://115.com/?cid=0&offset=0&mode=wangpan", "_blank") } ]; const buttonConfigs = [ { key: 'enableCopyButton', name: '复制' }, { key: 'enableOfflineButton', name: '离线' }, { key: 'enableOpenButton', name: '打开' } ]; buttonConfigs.forEach(({ key, name }) => { const isEnabled = CONFIG[key]; const toggleText = isEnabled ? `禁用${name}按钮` : `启用${name}按钮`; menuCommands.push({ name: toggleText, handler: () => { const newState = !CONFIG[key]; CONFIG[key] = newState; GM_setValue(key, newState); showNotification('设置已保存', newState ? `已启用"${name}"按钮` : `已禁用"${name}"按钮`); addActionButtons(); } }); }); menuCommands.forEach(({ name, handler }) => { GM_registerMenuCommand(name, handler); }); } async function checkCookieRefresh() { try { await check115Login(true); } catch (error) { console.error('检查cookie刷新失败:', error); } } function setupMutationObserver() { let timeoutId; const observer = new MutationObserver(() => { clearTimeout(timeoutId); timeoutId = setTimeout(() => { addActionButtons(); }, 100); }); observer.observe(document, { childList: true, subtree: true }); return observer; } function addActionButtons() { const hostname = window.location.hostname; const siteHandlers = { 'bt4gprx.com': handleBT4GSite, 'btdig.com': handleBTDigSite, 'nyaa.si': handleNyaaSite, 'dmhy.org': handleDMHYSite, 'seedhub': handleSeedhubSite }; const patternHandlers = [ { pattern: /sobt[^.]+\..+|clb[^.]+\..+/, handler: handleSOBTSite }, { pattern: /(\.|^)btsow\./, handler: handleBtsowSite }, { pattern: /\.btmulu\./, handler: handleBTMULUSite }, { pattern: /cili|mag|wuji/, handler: handleCiliMagSite }, { pattern: /(\.gying|\.gyg)\..+/, handler: handleGyingGygSite }, { pattern: /yuhuage\..+/, handler: handleYuhuageSite }, { pattern: /longwangbt\..+/, handler: handleLongwangbtSite } ]; for (const [domain, handler] of Object.entries(siteHandlers)) { if (hostname.includes(domain)) { handler(); return; } } for (const { pattern, handler } of patternHandlers) { if (pattern.test(hostname)) { handler(); return; } } } const ICONS = { copy: '<svg width="15" height="15" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="12" r="12" fill="#000"/><g transform="scale(0.8) translate(3,3)"><path d="M10 13C10.4295 13.5741 10.9774 14.0491 11.6066 14.3929C12.2357 14.7367 12.9315 14.9411 13.6466 14.9923C14.3618 15.0435 15.0796 14.9403 15.7513 14.6897C16.4231 14.4392 17.0331 14.047 17.54 13.54L20.54 10.54C21.4508 9.59695 21.9548 8.33394 21.9434 7.02296C21.932 5.71198 21.4061 4.45791 20.479 3.53087C19.5519 2.60383 18.2978 2.07799 16.9869 2.0666C15.6759 2.0552 14.4129 2.55916 13.47 3.46997L11.75 5.17997" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M14 11C13.5705 10.4259 13.0226 9.9508 12.3934 9.60705C11.7642 9.26329 11.0684 9.05889 10.3533 9.00766C9.63816 8.95643 8.92037 9.05963 8.24861 9.3102C7.57685 9.56077 6.96684 9.95296 6.45996 10.46L3.45996 13.46C2.54915 14.403 2.04518 15.666 2.05659 16.977C2.068 18.288 2.59383 19.542 3.52087 20.4691C4.44791 21.3961 5.70198 21.922 7.01296 21.9334C8.32394 21.9448 9.58695 21.4408 10.53 20.53L12.24 18.82" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></g></svg>', offline: '<img src="data:image/x-icon;base64,AAABAAEAQEAAAAEAGAARBgAAFgAAAIlQTkcNChoKAAAADUlIRFIAAABAAAAAQAgGAAAAqmlx3gAAAAFzUkdCAK7OHOkAAAAEZ0FNQQAAsY8L/GEFAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAFpklEQVR4XuVbXWxURRRe47OJL76auK1BExNUokblRR/MrkI1gaJG1JQHkOCLwQdjTEWJsru2lL8Wa/kRpaVUa1OTBiUEtQXEtP7U0AiIrVhtoN1WkP5tu93xfLPTtLv37Hb3ztzdbe6XfEnTe2bmfHd2fs6ZuR6nUezbeVuxP7TK6wuW3+HbVl/kC3R6fYE+YpgYUcTffXgGG9iiDMqqahYXip6qWEYiKknMryQsRhQ2GYvXEaxEnar6wsSSkuAtRf7gZq8/0MMIMUOqG22gLdVs/rH06apbyakt5OCIxWHnOII20bZyI/cQQtxEPVJGHGQczA3RNvkAX5RbuYF3ReB2mrBOsU7lgdIX8km55yy8/tCj1OBVzpF8UvpEvik3nUGxL7iOGsOyxTpRAIzAR+WuOZSWNt1MY20702BhknyFz8p9PUjxvkCrpZHCZ6uRl7Coej6Z5LuSYQ9qzPOVLxLanhMwo1IFhTzhZcpI1quDWucLbqmzS6kl030CdlVyY8FUpMMlK0JizebD4pV3m7Pia6EvRejAt+L4mYvi98tDbN2ZEJoy2jFia8lVoMOlq6pEz6Ur1L4eKj7+jq0/Y5I2JZMHggsyMr6331WPl6+H4Wtj4p5nKtn6MyZpSxtAqaiOL2yT966uEv+NTioZ9rGt7iRbf7aERiU3EYixycB4SLu74bSSYA+Rqaho+rpb3PlkkK3fBkfYfAISDYyxFu9bvUPcGLP2fvWRM+KJ9XXiwed3L8i7SyrYunUIrUr2HGh8GM/kQGgyGtp+Zm1zStKqZMcRz+Exhhq8v9Ta++MTU+KB53ax9rlmQo4RSUfOSIc1jdbe/+izs6xtfhisVPI9HpW9ZYzsEb0/Oh5RsudwoKVTlL3VJJ9z5XJJaJbikXunf+ikri3c2/i9kpwaf/SH5Xyw9o0jbB05YEyeO8QPLVgDW1y2Zifb++nw95VrYsenHeKRtdVsnU4R2jH+y7mHdrn36MK9nwpjExHxdvVxtl5nGCzH+K/nH9rj1toTovHYL6K9q1f2rB2c7b4sHn5hD1u/SUK7h6IknNWxBiaIzcyGd5rlL6Orp1/EYjElMz0u/RWWw4mr0xShnYaAPKhkDZwgxjnC26GRUSU1NbrPD+gHQOnZhxeAk1nuoaPEFrfqk3YRjc4ouTz2Nf/AljfEMF5AXtNeSJIMDF5Xcq2YjEyL5S/VsGUNMJL3FwAuf7FGDA7fUJKtcDB+kC8gL0MgmSWvHpSxAod/6BfClTFAOQRyOgmmYy3FCqnw+Lpatowm+xxfBrPhQ7RkYsxzWL/lc7aMDuUyaHojpEssfRw2bv2Ctdeh3AiZ3grr8qtTF5TkRGx6r4W11yNthU0HQ7psa/9NSU6Ef+N+1l6HMhhyIhzWIbbAyUBWucjP22swHg4DSA4wBjkntskzM9ZY4VjHedZeh9AsxQNID3FGuWaqUHrlpoOsvR7npcScSIpmS6TJuY0QJkXOXpeWi5dOpMUzJcLei38OKclzwHyAswWujBaT0+KAEwcjmfCxsg9Fb/+wkjyHqxQbOBUEsQcjTh2NpSLC4eD+b8TEpPVnj1+Db8M+tpwB8kdjAA4OmQLGiDsCz75+WJ4Z4LQ3GdPRGbGn4bS4a+UHbHkThEYl1wpTx+PoPeQG3687KbYfaheHWrtEx4+9KaO9kevjMo/oxGYngQsdjwNkZOSCBCYv3O5oOXFOdF8YEOF/x8TUdFRmfhH7d57rF/VtP4mX3zxq8uQ3PRe6IAFQhzhyRSbfhCZoUzLTw9WXpGbh6mtys3D1RclZ0MTh3quygOsvSwPyJSymXwL5akz8fKg5wX0fTMwHZtRCXCKlT3Zn+2yh9gnu/GhqFthVYWtJdN9nc/OB4EJFke76cDIZiLGRaKAecdensxziOUaXfTydCsi9xw9fCvHzeY/nf7AwUADgh+gcAAAAAElFTkSuQmCC" style="width:15px;height:15px;">', open: '<svg width="15" height="15" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="12" r="9" stroke="#2563EB" stroke-width="2"/><path d="M3 12H21M12 3C14.501 6.738 15.922 10.592 16 12C15.922 13.408 14.501 17.262 12 21C9.499 17.262 8.078 13.408 8 12C8.078 10.592 9.499 6.738 12 3Z" stroke="#3B82F6" stroke-width="1.5"/></svg>' }; function createButtonContainer(options = {}) { const btnContainer = document.createElement(options.elementType || 'span'); btnContainer.className = 'magnet-action-buttons'; btnContainer.style.cssText = ` display: inline-block; margin-right: ${options.marginRight || '5px'}; margin-left: ${options.marginLeft || '0'}; vertical-align: ${options.verticalAlign || 'middle'} `; if (options.customStyles) { Object.assign(btnContainer.style, options.customStyles); } return btnContainer; } async function fetchWithRetry(url, options = {}, maxRetries = CONFIG.maxRetries) { const normalizedUrl = /^https?:/.test(url) ? url : new URL(url, location.origin).href; for (let attempt = 0; attempt <= maxRetries; attempt++) { try { const response = await fetch(normalizedUrl, { credentials: 'omit', ...options }); if (!response.ok) { throw new Error(`HTTP ${response.status}: ${response.statusText}`); } return await response.text(); } catch (error) { console.error(`Fetch attempt ${attempt + 1}/${maxRetries + 1} failed for ${normalizedUrl}:`, error); if (attempt === maxRetries) { throw error; } await new Promise(resolve => setTimeout(resolve, CONFIG.retryDelay * (attempt + 1))); } } } function createCombinedButtons(magnetLinkOrElement) { const combinedBtn = document.createElement('button'); combinedBtn.className = 'magnet-combined-button'; combinedBtn.style.display = 'inline-flex'; combinedBtn.style.alignItems = 'center'; combinedBtn.style.justifyContent = 'center'; combinedBtn.style.backgroundColor = 'transparent'; combinedBtn.style.border = '1px solid #ddd'; combinedBtn.style.borderRadius = '3px'; combinedBtn.style.padding = '2px'; combinedBtn.style.fontSize = '12px'; combinedBtn.style.cursor = 'pointer'; combinedBtn.style.transition = 'all 0.15s ease-in-out'; combinedBtn.style.userSelect = 'none'; combinedBtn.style.boxSizing = 'border-box'; combinedBtn.style.height = '26px'; const titles = { copy: '复制磁力链', offline: '推送到115离线', open: '打开磁力链' }; const createButtonPart = (type, icon) => { const part = document.createElement('span'); part.className = `magnet-button-part ${type}-part`; part.style.cssText = 'padding:0 6px;color:#333;transition:all 0.15s ease-in-out;display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:22px;'; part.innerHTML = icon; part.dataset.type = type; part.title = titles[type] || '操作'; return part; }; const buttonParts = [ CONFIG.enableCopyButton && createButtonPart('copy', ICONS.copy), CONFIG.enableOfflineButton && createButtonPart('offline', ICONS.offline), CONFIG.enableOpenButton && createButtonPart('open', ICONS.open) ].filter(Boolean); if (buttonParts.length > 0) { buttonParts[0].style.borderRadius = '2px 0 0 2px'; combinedBtn.appendChild(buttonParts[0]); buttonParts.slice(1).forEach((part, index) => { const sep = document.createElement('span'); sep.style.cssText = 'padding: 0 2px; color: #999;'; sep.innerText = '|'; combinedBtn.append(sep, part); }); if (buttonParts.length > 1) { buttonParts[buttonParts.length - 1].style.borderRadius = '0 2px 2px 0'; } } ['mouseenter', 'mouseleave'].forEach((event, i) => { combinedBtn.addEventListener(event, () => { combinedBtn.style.backgroundColor = i ? 'transparent' : '#f5f5f5'; combinedBtn.style.borderColor = i ? '#ddd' : '#ccc'; }); }); combinedBtn.addEventListener('click', async (e) => { e.preventDefault(); e.stopPropagation(); const clickedPart = e.target.closest('.magnet-button-part'); if (!clickedPart) return; const type = clickedPart.dataset.type; const magnetLink = typeof magnetLinkOrElement === 'string' ? magnetLinkOrElement : await extractMagnetLink(magnetLinkOrElement); if (!magnetLink) return; if (type === 'copy') { await handleCopyAction(combinedBtn, magnetLink); } else if (type === 'offline') { await handleOfflineAction(combinedBtn, magnetLink); } else if (type === 'open') { window.open(magnetLink, '_blank'); showNotification('已打开磁力链', '磁力链已在新标签页打开'); showButtonFeedback(combinedBtn, 'open'); } }); return combinedBtn; } async function handleCopyAction(btn, magnetLink) { try { let decodedMagnetLink = magnetLink; try { decodedMagnetLink = decodeURIComponent(magnetLink); } catch (e) {} GM_setClipboard(decodedMagnetLink, 'text'); if (isMobile && navigator.clipboard?.writeText) { try { await navigator.clipboard.writeText(decodedMagnetLink); } catch (clipboardError) { console.log('使用navigator.clipboard失败:', clipboardError); } } showNotification('磁力链已复制', decodedMagnetLink); showButtonFeedback(btn, 'copy'); } catch (error) { showNotification('复制失败', `请手动复制: ${magnetLink}`); } } const SUCCESS_FEEDBACK_SVG = '<svg width="15" height="15" viewBox="0 0 14 14" style="display:inline-flex;align-items:center;justify-content:center;"><circle cx="7" cy="7" r="7" fill="#4caf50"/><polyline points="4,7 6,9 10,5" fill="none" stroke="#fff" stroke-width="1.5"/></svg>'; function showButtonFeedback(btn, type = null) { const clickedPart = btn.classList.contains('magnet-combined-button') ? btn.querySelector(type ? `.magnet-button-part[data-type="${type}"]` : '.magnet-button-part') : btn; if (!clickedPart) return; const originalContent = clickedPart.innerHTML; clickedPart.style.cssText += 'min-height:22px;display:inline-flex;align-items:center;justify-content:center;'; clickedPart.innerHTML = SUCCESS_FEEDBACK_SVG; btn.disabled = true; setTimeout(() => { clickedPart.innerHTML = originalContent; btn.disabled = false; }, 2000); } async function handleOfflineAction(btn, magnetLink) { await process115Offline(magnetLink); showButtonFeedback(btn, 'offline'); } function handleBT4GSite() { processMagnetLinks({ selectors: '.result-item h5 > a[href^="/magnet/"]', containerStyles: { marginRight: '8px' }, customProcessor: (titleA) => { const btnContainer = createButtonContainer({ marginRight: '8px' }); const loadingBtn = createLoadingButton(); btnContainer.appendChild(loadingBtn); titleA.parentNode.insertBefore(btnContainer, titleA); processBT4GMagnetLink(titleA, btnContainer).then(success => { if (!success) { setupRetryButton(loadingBtn, () => processBT4GMagnetLink(titleA, btnContainer, 2, 6000) ); } }).catch(error => { console.error('BT4G处理失败:', error); setButtonError(loadingBtn, '处理失败'); }); } }); processMagnetLinks({ selectors: '.card-body', customProcessor: (cardBody) => { const magnetBtn = cardBody.querySelector('a[href*="downloadtorrentfile.com/hash/"]'); if (!magnetBtn) return; const btnContainer = createButtonContainer({ elementType: 'div', marginRight: '10px' }); const combinedBtn = createCombinedButtons(magnetBtn); btnContainer.appendChild(combinedBtn); magnetBtn.parentNode.insertBefore(btnContainer, magnetBtn); } }); } async function fetchBT4GMagnetFromDetail(detailHref) { try { const html = await fetchWithRetry(detailHref); const parser = new DOMParser(); const doc = parser.parseFromString(html, 'text/html'); const magnetA = doc.querySelector('a.btn.btn-primary.me-2[href*="downloadtorrentfile.com/hash/"]'); if (!magnetA) return null; const href = magnetA.href; const hashMatch = href.match(/hash\/([a-f0-9]{40})/i); if (!hashMatch) return null; const hash = hashMatch[1]; const nameMatch = href.match(/[?&]name=([^&]+)/i); const magnetUrl = new URL(`magnet:?xt=urn:btih:${hash}`); if (nameMatch?.[1]) { magnetUrl.searchParams.set('dn', nameMatch[1]); } return magnetUrl.toString(); } catch (error) { console.error('Failed to fetch BT4G magnet:', error); return null; } } async function processBT4GMagnetLink(linkElement, btnContainer, maxRetries = CONFIG.maxRetries, timeout = CONFIG.defaultTimeout) { if (!linkElement?.href) return false; return await retryOperation(async (attempt) => { const magnetLink = await Promise.race([ fetchBT4GMagnetFromDetail(linkElement.href), new Promise((_, reject) => setTimeout(() => reject(new Error('请求超时')), timeout) ) ]); if (magnetLink) { btnContainer.innerHTML = ''; btnContainer.appendChild(createCombinedButtons(magnetLink)); return true; } throw new Error('未获取到磁力链'); }, maxRetries, (attempt, maxRetries) => { const loadingBtn = btnContainer.querySelector('.magnet-loading-btn'); if (loadingBtn) { loadingBtn.textContent = `重试中(${attempt + 1}/${maxRetries})...`; } }); } function handleBtsowSite() { processMagnetLinks({ selectors: '.row.data-row .file', containerStyles: { marginRight: '8px' }, customProcessor: (titleLink) => { const magnetLink = extractBtsowMagnetLink(titleLink); if (!magnetLink) return; const btnContainer = createButtonContainer({ marginRight: '8px' }); const combinedBtn = createCombinedButtons(magnetLink); btnContainer.appendChild(combinedBtn); titleLink.parentNode.insertBefore(btnContainer, titleLink); } }); processMagnetLinks({ selectors: 'textarea.magnet-link[readonly]', containerStyles: { elementType: 'div', marginLeft: '10px' }, customProcessor: (textarea) => { const magnetLink = textarea.value.trim(); if (!magnetLink?.startsWith('magnet:')) return; const btnContainer = createButtonContainer({ elementType: 'div', marginLeft: '10px' }); const combinedBtn = createCombinedButtons(magnetLink); btnContainer.appendChild(combinedBtn); textarea.parentNode.insertBefore(btnContainer, textarea.nextSibling); } }); } function handleBTMULUSite() { processMagnetLinks({ selectors: 'div[style="overflow: hidden;"] a[href^="/hash/"] h4', containerStyles: { customStyles: { margin: '0 8px' } }, customProcessor: (titleElement) => { const titleLink = titleElement.closest('a[href^="/hash/"]'); if (!titleLink) return; const labelElement = titleElement.querySelector('span.label'); if (!labelElement) return; const hashMatch = titleLink.href.match(/\/hash\/([a-f0-9]{40})/i); if (!hashMatch) return; const hash = hashMatch[1]; const titleText = titleElement.textContent.replace(/^\s*\w+\s*/, '').trim(); const magnetLink = `magnet:?xt=urn:btih:${hash}&dn=${encodeURIComponent(titleText)}`; const btnContainer = createButtonContainer({ customStyles: { margin: '0 8px' } }); const combinedBtn = createCombinedButtons(magnetLink); btnContainer.appendChild(combinedBtn); if (labelElement.nextSibling) { titleElement.insertBefore(btnContainer, labelElement.nextSibling); } else { titleElement.appendChild(btnContainer); } } }); processMagnetLinks({ selectors: 'div.media-body a[href^="magnet:"]', containerStyles: { elementType: 'div', customStyles: { display: 'block', marginTop: '10px' } }, customProcessor: (magnetLink) => { const btnContainer = createButtonContainer({ elementType: 'div', customStyles: { display: 'block', marginTop: '10px' } }); const combinedBtn = createCombinedButtons(magnetLink.href); btnContainer.appendChild(combinedBtn); magnetLink.parentNode.insertBefore(btnContainer, magnetLink.nextSibling); } }); } function extractBtsowMagnetLink(element) { try { const hashMatch = element.href.match(/detail\/(\w+)/i); if (hashMatch && hashMatch[1]) { const titleText = element.textContent.trim(); return `magnet:?xt=urn:btih:${hashMatch[1]}&dn=${encodeURIComponent(titleText)}`; } throw new Error('无法提取磁力链Hash'); } catch (error) { return null; } } function handleSOBTSite() { processElements('h3 > a[href^="/torrent/"]', (titleLink) => { const btnContainer = createButtonContainer(); const combinedBtn = createCombinedButtons(titleLink); btnContainer.appendChild(combinedBtn); titleLink.parentNode.insertBefore(btnContainer, titleLink); return true; }); processElements('.item-title h3 > a[href^="/detail/"]', (titleLink) => { const btnContainer = createButtonContainer(); const combinedBtn = createCombinedButtons(titleLink); btnContainer.appendChild(combinedBtn); titleLink.parentNode.insertBefore(btnContainer, titleLink); return true; }); processElements('a.download[id="down-url"]', (openLinkBtn) => { const btnContainer = createButtonContainer({ marginRight: '8px' }); const combinedBtn = createCombinedButtons(openLinkBtn.href); btnContainer.appendChild(combinedBtn); openLinkBtn.parentNode.insertBefore(btnContainer, openLinkBtn); return true; }); } function handleBTDigSite() { processElements('.torrent_name > a', (titleLink) => { const resultDiv = titleLink.closest('.one_result'); const magnetLink = resultDiv?.querySelector('.torrent_magnet a[href^="magnet:"]'); if (!magnetLink) return false; const btnContainer = createButtonContainer({ marginRight: '10px' }); const combinedBtn = createCombinedButtons(magnetLink); btnContainer.appendChild(combinedBtn); titleLink.parentNode.insertBefore(btnContainer, titleLink); return true; }); processElements('tr td div.fa.fa-magnet a[href^="magnet:"]', (magnetLink) => { const btnContainer = createButtonContainer({ marginLeft: '10px' }); const combinedBtn = createCombinedButtons(magnetLink); btnContainer.appendChild(combinedBtn); magnetLink.parentNode.appendChild(btnContainer); return true; }); } function handleNyaaSite() { processMagnetLinks({ selectors: 'td.text-center a[href^="magnet:"]', containerStyles: { marginRight: '6px', customStyles: { display: 'inline-flex', alignItems: 'center' } }, customProcessor: (magnetLink) => { const tr = magnetLink.closest('tr'); const downloadBtn = tr?.querySelector("a[href^='/download/']"); const btnContainer = createButtonContainer({ marginRight: '6px', customStyles: { display: 'inline-flex', alignItems: 'center' } }); const combinedBtn = createCombinedButtons(magnetLink); btnContainer.appendChild(combinedBtn); if (downloadBtn) { downloadBtn.parentNode.insertBefore(btnContainer, downloadBtn); } else { magnetLink.parentNode.insertBefore(btnContainer, magnetLink.nextSibling); } } }); processMagnetLinks({ selectors: '.panel-footer .card-footer-item[href^="magnet:"]', containerStyles: { marginLeft: '10px' }, insertPosition: 'after' }); } function processMagnetLinks({ selectors, containerStyles = { marginLeft: '5px' }, insertPosition = 'after', customProcessor }) { if (!Array.isArray(selectors)) { selectors = [selectors]; } selectors.forEach(selector => { document.querySelectorAll(selector).forEach(element => { if (element.dataset.buttonsAdded) return; element.dataset.buttonsAdded = true; if (customProcessor && typeof customProcessor === 'function') { customProcessor(element); return; } const btnContainer = createButtonContainer(containerStyles); const combinedBtn = createCombinedButtons(element); btnContainer.appendChild(combinedBtn); if (insertPosition === 'before') { element.parentNode.insertBefore(btnContainer, element); } else { element.parentNode.insertBefore(btnContainer, element.nextSibling); } }); }); } function handleDMHYSite() { const magnetHeader = document.querySelector('#topic_list th:nth-child(4)'); if (magnetHeader) { magnetHeader.style.width = '18%'; } processMagnetLinks({ selectors: 'a.download-arrow.arrow-magnet', containerStyles: { marginLeft: '5px' }, insertPosition: 'before' }); processMagnetLinks({ selectors: ['#tabs-1 a.magnet', '#tabs-1 a#magnet2'], containerStyles: { marginLeft: '5px' }, insertPosition: 'after' }); } function handleGyingGygSite() { document.querySelectorAll('li.down-list2').forEach(item => { const magnetLink = item.querySelector('a.torrent[href^="magnet:"]'); const detailLink = item.querySelector('a[href^="/bt/"]'); if (!magnetLink || !detailLink || detailLink.dataset.buttonsAdded) return; detailLink.dataset.buttonsAdded = true; const btnContainer = createButtonContainer({ marginRight: '8px' }); const combinedBtn = createCombinedButtons(magnetLink); btnContainer.appendChild(combinedBtn); detailLink.parentNode.insertBefore(btnContainer, detailLink); }); document.querySelectorAll('div.alert-info ul.down123').forEach(list => { const magnetItem = list.querySelector('li[data-clipboard-text^="magnet:"]'); if (!magnetItem || magnetItem.dataset.buttonsAdded) return; magnetItem.dataset.buttonsAdded = true; const magnetLink = magnetItem.getAttribute('data-clipboard-text'); if (!magnetLink?.startsWith('magnet:')) return; const newLi = document.createElement('li'); newLi.className = 'magnet-script-custom-li'; newLi.style.cssText = ` display: inline-flex; align-items: center; margin-right: 8px; vertical-align: middle; padding: 0; background: transparent; border: none; list-style: none; font-size: 12px; transform: translateY(-8.5px); z-index: 100 `; const combinedBtn = createCombinedButtons(magnetLink); newLi.appendChild(combinedBtn); list.insertBefore(newLi, magnetItem); }); } async function extractMagnetLink(element) { try { if (typeof element === 'string') { return element.startsWith('magnet:') ? element : null; } const href = element?.href; if (!href) return null; if (href.startsWith('magnet:')) return href; const extractors = [ { test: 'seedhub', handler: fetchSeedhubMagnetFromDetail }, { test: '/magnet/', handler: fetchBT4GMagnetFromDetail }, { test: '/torrent/', handler: (url) => { const match = url.match(/\/torrent\/([a-f0-9]+)\.html$/i); return match?.[1] ? `magnet:?xt=urn:btih:${match[1]}` : null; }}, { test: '/detail/', handler: (url) => { const match = url.match(/\/detail\/([a-f0-9]+)\.html$/i); return match?.[1] ? `magnet:?xt=urn:btih:${match[1]}` : null; }}, { test: 'downloadtorrentfile.com/hash/', handler: (url) => { const hashMatch = url.match(/hash\/([a-f0-9]+)/i); if (!hashMatch?.[1]) return null; const nameMatch = url.match(/[?&]name=([^&]+)/i); return `magnet:?xt=urn:btih:${hashMatch[1]}${nameMatch?.[1] ? `&dn=${nameMatch[1]}` : ''}`; }}, { test: '/hash/', handler: (url) => { const match = url.match(/\/hash\/([a-f0-9]+)\.html$/i); return match?.[1] ? `magnet:?xt=urn:btih:${match[1]}` : null; }} ]; for (const { test, handler } of extractors) { if (href.includes(test)) { return await handler(href); } } return null; } catch (error) { showNotification('错误', error.message); return null; } } async function check115Login(forceCheck = false) { try { const lastRefresh = GM_getValue('115_last_cookie_refresh', 0); const currentCookies = GM_getValue('115_cookies', ''); if (!forceCheck && currentCookies && Date.now() - lastRefresh < CONFIG.cookieRefreshInterval) { return true; } const cookies = await getCurrent115Cookies(); const isValid = cookies && await validate115Cookies(cookies); GM_setValue('115_cookies', isValid ? cookies : ''); GM_setValue('115_last_cookie_refresh', isValid ? Date.now() : 0); return isValid; } catch (error) { console.error('检查登录(不可用)状态失败:', error); return false; } } function getCurrent115Cookies() { return new Promise((resolve) => { GM_xmlhttpRequest({ url: 'https://115.com/', method: 'GET', anonymous: true, onload: function(response) { const cookieHeader = response.responseHeaders .split('\n') .find(row => row.toLowerCase().startsWith('set-cookie:')); if (cookieHeader) { const cookies = cookieHeader.replace(/^set-cookie:\s*/i, '').split(';')[0]; resolve(cookies); } else { if (response.finalUrl.includes('login.115.com')) { resolve(''); } else { const savedCookies = GM_getValue('115_cookies', ''); resolve(savedCookies); } } }, onerror: () => resolve('') }); }); } function validate115Cookies(cookies) { return new Promise((resolve) => { GM_xmlhttpRequest({ url: 'https://115.com/web/lixian/', method: 'GET', headers: { 'Cookie': cookies }, onload: function(response) { resolve(!response.finalUrl.includes('login.115.com')); }, onerror: () => resolve(false) }); }); } async function process115Offline(magnetLink) { const notificationId = Date.now(); try { showNotification('115离线', '正在检查登录(不可用)状态...', notificationId); const isLoggedIn = await check115Login(true); if (!isLoggedIn) { throw new Error('请先登录(不可用)115网盘'); } showNotification('115离线', '正在提交离线任务...', notificationId); const result = await submit115OfflineTask(magnetLink); handleOfflineResult(result); } catch (error) { showNotification('115离线失败', error.message); if (error.message.includes('登录(不可用)')) { setTimeout(() => { if (confirm('需要登录(不可用)115网盘,是否进入115网盘登录(不可用)页面?')) { window.open('https://115.com/?mode=login', '_blank'); } }, 500); } } } async function submit115OfflineTask(magnetLink) { const cookies = GM_getValue('115_cookies', ''); if (!cookies) { throw new Error('未检测到有效的登录(不可用)状态'); } const response = await fetch115Api( `https://115.com/web/lixian/?ct=lixian&ac=add_task_url&url=${encodeURIComponent(magnetLink)}`, { headers: { 'Cookie': cookies } } ); return tryParseJson(response); } function handleOfflineResult(result) { if (!result) { throw new Error('无效的响应'); } if (result.state) { showNotification('115离线成功', '任务已成功添加到离线下载列表'); return; } const errorMsg = ERROR_CODES[result.errcode] || result.error_msg || '未知错误'; throw new Error(errorMsg); } function fetch115Api(url, options = {}) { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ url: url, method: options.method || 'GET', headers: { 'User-Agent': navigator.userAgent, 'Origin': 'https://115.com', ...(options.headers || {}) }, data: options.body, onload: function(response) { if (response.status >= 200 && response.status < 300) { resolve(response.responseText); } else { reject(new Error(`请求失败: ${response.status}`)); } }, onerror: reject }); }); } function tryParseJson(text) { try { return JSON.parse(text); } catch (e) { return null; } } function showNotification(title, text, id = null) { if (id) { const existing = document.getElementById(`notification-${id}`); if (existing) existing.remove(); } const container = document.createElement('div'); container.className = 'custom-notification'; container.id = id ? `notification-${id}` : `notification-${Date.now()}`; Object.assign(container.style, { position: 'fixed', bottom: '20px', right: '20px', padding: '12px 16px', background: 'rgba(255, 255, 255, 0.95)', color: '#333', borderRadius: '8px', boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)', zIndex: '9999', maxWidth: '300px', wordWrap: 'break-word', opacity: '0', transform: 'translateY(20px)', transition: 'opacity 0.3s ease, transform 0.3s ease', fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, sans-serif', backdropFilter: 'blur(10px)', border: '1px solid rgba(255, 255, 255, 0.2)', cursor: 'pointer' }); const titleEl = document.createElement('div'); titleEl.textContent = title; Object.assign(titleEl.style, { fontWeight: 'bold', marginBottom: '4px' }); const textEl = document.createElement('div'); try { textEl.textContent = (text?.includes('%') || text?.includes('magnet:')) ? decodeURIComponent(text) : text; } catch (e) { textEl.textContent = text; } textEl.style.fontSize = '14px'; container.append(titleEl, textEl); document.body.appendChild(container); requestAnimationFrame(() => { Object.assign(container.style, { opacity: '1', transform: 'translateY(0)' }); }); const removeNotification = () => { Object.assign(container.style, { opacity: '0', transform: 'translateY(20px)' }); setTimeout(() => container.remove(), 300); }; const timeoutId = setTimeout(removeNotification, CONFIG.notificationTimeout); container.addEventListener('click', () => { clearTimeout(timeoutId); removeNotification(); }); } function handleSeedhubSite() { processElements('.seeds a', (linkElement) => { const btnContainer = createButtonContainer({ marginRight: '8px', customStyles: { display: 'inline-block', verticalAlign: 'middle' } }); const combinedBtn = createCombinedButtons(linkElement); btnContainer.appendChild(combinedBtn); linkElement.parentNode.insertBefore(btnContainer, linkElement); return true; }); } function handleYuhuageSite() { processElements('.search-item .item-title h3 > a[href^="/hash/"]', (titleLink) => { const btnContainer = createButtonContainer({ marginRight: '8px' }); const loadingBtn = createLoadingButton(); btnContainer.appendChild(loadingBtn); titleLink.parentNode.insertBefore(btnContainer, titleLink); processYuhuageMagnetLink(titleLink, btnContainer).then(success => { if (!success) { setupRetryButton(loadingBtn, () => processYuhuageMagnetLink(titleLink, btnContainer, 2, 6000) ); } }).catch(error => { console.error('Yuhuage处理失败:', error); setButtonError(loadingBtn, '处理失败'); }); return true; }, 'yuhuageButtonsAdded'); processElements('.detail-panel .panel-header', (panelHeader) => { const magnetIcon = panelHeader.querySelector('i.fa.fa-magnet'); if (!magnetIcon) return false; const panelBody = panelHeader.nextElementSibling; const magnetLink = panelBody?.querySelector('a.download[href^="magnet:"]'); if (!magnetLink) return false; const btnContainer = createButtonContainer({ marginLeft: '10px', customStyles: { display: 'inline-flex', alignItems: 'center' } }); const combinedBtn = createCombinedButtons(magnetLink.href); btnContainer.appendChild(combinedBtn); panelHeader.appendChild(btnContainer); return true; }, 'yuhuagePanelProcessed'); } async function fetchSeedhubMagnetFromDetail(detailHref) { try { const html = await fetchWithRetry(detailHref); const encodedMatch = html.match(/data = "([a-zA-Z0-9]+)"/); if (encodedMatch?.[1]) { const magnetLink = atob(encodedMatch[1]); if (magnetLink?.startsWith('magnet:')) { return magnetLink; } } return null; } catch (error) { console.error('获取Seedhub磁力链失败:', error); return null; } } async function fetchYuhuageMagnetFromDetail(detailHref) { try { const html = await fetchWithRetry(detailHref); const parser = new DOMParser(); const doc = parser.parseFromString(html, 'text/html'); const magnetLink = doc.querySelector('.detail-panel .panel-body a.download[href^="magnet:"]'); if (magnetLink?.href) { return magnetLink.href.trim(); } const magnetMatch = html.match(/magnet:\?xt=urn:btih:[a-f0-9]+[^"'>\s]*/i); if (magnetMatch?.[0]) { return magnetMatch[0].trim(); } return null; } catch (error) { console.error('获取Yuhuage磁力链失败:', error); return null; } } async function processYuhuageMagnetLink(linkElement, btnContainer, maxRetries = CONFIG.maxRetries, timeout = CONFIG.defaultTimeout) { if (!linkElement?.href) return false; return await retryOperation(async (attempt) => { const magnetLink = await Promise.race([ fetchYuhuageMagnetFromDetail(linkElement.href), new Promise((_, reject) => setTimeout(() => reject(new Error('请求超时')), timeout) ) ]); if (magnetLink) { btnContainer.innerHTML = ''; btnContainer.appendChild(createCombinedButtons(magnetLink)); return true; } throw new Error('未获取到磁力链'); }, maxRetries, (attempt, maxRetries) => { const loadingBtn = btnContainer.querySelector('.magnet-loading-btn'); if (loadingBtn) { loadingBtn.textContent = `重试中(${attempt + 1}/${maxRetries})...`; } }); } function createLoadingButton() { const loadingBtn = document.createElement('span'); loadingBtn.className = 'magnet-loading-btn'; loadingBtn.textContent = '获取中...'; loadingBtn.style.cssText = 'font-size:12px;color:#666;padding:2px 6px;border:1px solid #ddd;border-radius:4px;background-color:transparent;'; return loadingBtn; } function setButtonError(button, message = '获取失败') { if (!button) return; button.textContent = message; button.style.color = '#ff4d4f'; } async function processMagnetLink(linkElement, btnContainer, maxRetries = CONFIG.maxRetries, timeout = CONFIG.defaultTimeout) { if (!linkElement?.href) return false; return await retryOperation(async (attempt) => { const magnetLink = await Promise.race([ fetchMagnetFromDetailPage(linkElement.href), new Promise((_, reject) => setTimeout(() => reject(new Error('请求超时')), timeout) ) ]); if (magnetLink) { btnContainer.innerHTML = ''; btnContainer.appendChild(createCombinedButtons(magnetLink)); return true; } throw new Error('未获取到磁力链'); }, maxRetries, (attempt, maxRetries) => { const loadingBtn = btnContainer.querySelector('.magnet-loading-btn'); if (loadingBtn) { loadingBtn.textContent = `重试中(${attempt + 1}/${maxRetries})...`; } }); } function handleCiliMagSite() { processElements('table.table.table-hover.file-list tbody tr', (row) => { const linkElement = row.querySelector('td a[href^="/"]'); if (!linkElement) return false; const btnContainer = createButtonContainer({ marginRight: '8px' }); const loadingBtn = createLoadingButton(); btnContainer.appendChild(loadingBtn); linkElement.parentNode.insertBefore(btnContainer, linkElement); processMagnetLink(linkElement, btnContainer).then(success => { if (!success) { setupRetryButton(loadingBtn, () => processMagnetLink(linkElement, btnContainer, 2, 6000) ); } }).catch(error => { console.error('CiliMag处理失败:', error); setButtonError(loadingBtn, '处理失败'); }); return true; }, 'ciliMagProcessed'); processElements('div.input-group.magnet-box', (magnetBox) => { const magnetInput = magnetBox.querySelector('input[id="input-magnet"][value^="magnet:"]'); const addonElement = magnetBox.querySelector('.input-group-addon'); if (!magnetInput?.value.trim() || !addonElement) return false; if (addonElement.classList.contains('magnet-prefix')) { addonElement.style.padding = '2px 5px'; } const btnContainer = createButtonContainer({ marginLeft: '5px', customStyles: { display: 'inline-flex', alignItems: 'center' } }); const combinedBtn = createCombinedButtons(magnetInput.value.trim()); btnContainer.appendChild(combinedBtn); addonElement.appendChild(btnContainer); return true; }, 'magnetBoxProcessed'); } async function fetchMagnetFromDetailPage(detailHref) { try { const html = await fetchWithRetry(detailHref, { headers: { 'User-Agent': navigator.userAgent } }); const parser = new DOMParser(); const doc = parser.parseFromString(html, 'text/html'); const magnetInput = doc.querySelector('input[id="input-magnet"][value^="magnet:"]'); if (magnetInput?.value) { return magnetInput.value.trim(); } const magnetLink = doc.querySelector('a[href^="magnet:"]'); if (magnetLink?.href) { return magnetLink.href.trim(); } const magnetMatch = html.match(/magnet:\?xt=urn:btih:[a-f0-9]+[^"'>]+/i); if (magnetMatch?.[0]) { return magnetMatch[0].trim(); } return null; } catch (error) { console.error('从详情页获取磁力链失败:', error); return null; } } function handleLongwangbtSite() { processElements('td.text_left a[href^="show.php?hash="]', (titleLink) => { const hashMatch = titleLink.href.match(/hash=([a-f0-9]{40})/i); if (!hashMatch) return false; const hash = hashMatch[1]; const titleText = titleLink.textContent.trim(); const magnetLink = `magnet:?xt=urn:btih:${hash}&dn=${encodeURIComponent(titleText)}`; const btnContainer = createButtonContainer({ marginRight: '8px' }); const combinedBtn = createCombinedButtons(magnetLink); btnContainer.appendChild(combinedBtn); titleLink.parentNode.insertBefore(btnContainer, titleLink); return true; }); } initializeScript(); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址