// ==UserScript==
// @name 一键复制磁力链和推送到115离线
// @author [email protected]
// @description 支持BT4G/BTDig/BTSOW/Nyaa/GY/DMHY/SOBT/BTMulu等网站,可一键复制磁力链和推送到115网盘进行离线,支持打开磁力链,并支持通过脚本菜单控制各按钮的显示(推送离线任务需当前浏览器已登录(不可用)115会员账号)
// @version 1.1.2.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 *://*gying.*/*
// @include *://*gyg.*/*
// @include *://*dmhy.*/*
// @include *://sobt*.*/*
// @include *://*btmulu.*/*
// @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,
enableCopyButton: GM_getValue('enableCopyButton', true),
enableOfflineButton: GM_getValue('enableOfflineButton', true),
enableOpenButton: GM_getValue('enableOpenButton', true)
};
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() {
GM_registerMenuCommand("检查115登录(不可用)状态", async () => {
const isLoggedIn = await check115Login(true);
showNotification('115状态', isLoggedIn ? '已登录(不可用)' : '未登录(不可用)');
if (!isLoggedIn) {
setTimeout(() => {
if (confirm('需要登录(不可用)115网盘,是否进入115网盘登录(不可用)页面?')) {
window.open("https://115.com/?mode=login", "_blank");
}
}, 500);
}
});
GM_registerMenuCommand("打开115网盘", () => window.open("https://115.com/?cid=0&offset=0&mode=wangpan", "_blank"));
const toggleCopyButtonText = CONFIG.enableCopyButton ? "禁用复制按钮" : "启用复制按钮";
GM_registerMenuCommand(toggleCopyButtonText, () => {
const newState = !CONFIG.enableCopyButton;
CONFIG.enableCopyButton = newState;
GM_setValue('enableCopyButton', newState);
showNotification('设置已保存', newState ? '已启用"复制"按钮' : '已禁用"复制"按钮');
addActionButtons();
});
const toggleOfflineButtonText = CONFIG.enableOfflineButton ? "禁用离线按钮" : "启用离线按钮";
GM_registerMenuCommand(toggleOfflineButtonText, () => {
const newState = !CONFIG.enableOfflineButton;
CONFIG.enableOfflineButton = newState;
GM_setValue('enableOfflineButton', newState);
showNotification('设置已保存', newState ? '已启用"离线"按钮' : '已禁用"离线"按钮');
addActionButtons();
});
const toggleOpenButtonText = CONFIG.enableOpenButton ? "禁用打开按钮" : "启用打开按钮";
GM_registerMenuCommand(toggleOpenButtonText, () => {
const newState = !CONFIG.enableOpenButton;
CONFIG.enableOpenButton = newState;
GM_setValue('enableOpenButton', newState);
showNotification('设置已保存', newState ? '已启用"打开"按钮' : '已禁用"打开"按钮');
addActionButtons();
});
}
async function checkCookieRefresh() {
try {
await check115Login(true);
} catch (error) {
console.error('检查cookie刷新失败:', error);
}
}
function setupMutationObserver() {
const observer = new MutationObserver((mutations) => {
for (const mutation of mutations) {
if (mutation.addedNodes.length) {
addActionButtons();
}
}
});
observer.observe(document, {
childList: true,
subtree: true
});
}
function addActionButtons() {
if (window.location.host.includes('bt4gprx.com')) {
handleBT4GSite();
}
else {
handleCommonSites();
}
}
function createButton(type, element, icon = null, noDefaultClick = false) {
const btn = document.createElement('button');
btn.className = `${type}-magnet-btn`;
const buttonIcon = icon || ICONS[type] || ICONS.offline;
applyButtonStyle(btn, type, buttonIcon);
if (!noDefaultClick) {
setupButtonClickHandler(btn, type, element);
}
return btn;
}
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,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" 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 applyButtonStyle(btn, type, icon) {
Object.assign(btn.style, {
cursor: 'pointer',
backgroundColor: 'transparent',
color: '#555',
border: '1px solid #ddd',
borderRadius: '4px',
padding: '2px 6px',
fontSize: '12px',
marginRight: '5px',
transition: 'all 0.15s ease-in-out',
fontWeight: '400',
lineHeight: '1.5',
verticalAlign: 'middle',
touchAction: 'manipulation',
width: '30px',
height: '26px',
minWidth: '30px',
minHeight: '26px',
boxSizing: 'border-box',
});
const titles = {
copy: '复制磁力链',
offline: '推送到115离线',
open: '打开磁力链'
};
btn.title = titles[type] || '操作';
btn.innerHTML = icon || ICONS[type] || ICONS.offline;
btn.addEventListener('mouseenter', () => {
btn.style.backgroundColor = '#f0f0f0';
btn.style.borderColor = '#ccc';
});
btn.addEventListener('mouseleave', () => {
btn.style.backgroundColor = 'transparent';
btn.style.borderColor = '#ddd';
});
btn.addEventListener('touchstart', () => {
btn.style.backgroundColor = '#f0f0f0';
btn.style.borderColor = '#ccc';
});
btn.addEventListener('touchend', () => {
btn.style.backgroundColor = 'transparent';
btn.style.borderColor = '#ddd';
});
}
function createButtonContainer(options = {}) {
const elementType = options.elementType || 'span';
const btnContainer = document.createElement(elementType);
btnContainer.className = 'magnet-action-buttons';
const styles = {
display: 'inline-block',
marginRight: options.marginRight || '5px',
marginLeft: options.marginLeft || '0px',
verticalAlign: options.verticalAlign || 'middle',
...options.customStyles
};
Object.assign(btnContainer.style, styles);
return btnContainer;
}
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 createButtonPart = (type, icon, isLast = false) => {
const part = document.createElement('span');
part.className = `magnet-button-part ${type}-part`;
part.style.padding = '0 6px';
part.style.color = '#333';
part.style.transition = 'all 0.15s ease-in-out';
part.style.display = 'inline-flex';
part.style.alignItems = 'center';
part.style.justifyContent = 'center';
part.style.minWidth = '20px';
part.style.height = '22px';
part.innerHTML = icon;
part.dataset.type = type;
const titles = {
copy: '复制磁力链',
offline: '推送到115离线',
open: '打开磁力链'
};
part.title = titles[type] || '操作';
return part;
};
const copyPart = createButtonPart('copy', ICONS.copy);
const offlinePart = createButtonPart('offline', ICONS.offline);
let openPart = null;
if (CONFIG.enableOpenButton) {
openPart = createButtonPart('open', ICONS.open);
}
const buttonParts = [];
if (CONFIG.enableCopyButton) {
buttonParts.push(copyPart);
}
if (CONFIG.enableOfflineButton) {
buttonParts.push(offlinePart);
}
if (CONFIG.enableOpenButton && openPart) {
buttonParts.push(openPart);
}
if (buttonParts.length > 0) {
buttonParts[0].style.borderRadius = '2px 0 0 2px';
combinedBtn.appendChild(buttonParts[0]);
for (let i = 1; i < buttonParts.length; i++) {
const sep = document.createElement('span');
sep.style.padding = '0 2px';
sep.style.color = '#999';
sep.innerText = '|';
combinedBtn.appendChild(sep);
combinedBtn.appendChild(buttonParts[i]);
}
buttonParts[buttonParts.length - 1].style.borderRadius = '0 2px 2px 0';
}
combinedBtn.addEventListener('mouseenter', () => {
combinedBtn.style.backgroundColor = '#f5f5f5';
combinedBtn.style.borderColor = '#ccc';
});
combinedBtn.addEventListener('mouseleave', () => {
combinedBtn.style.backgroundColor = 'transparent';
combinedBtn.style.borderColor = '#ddd';
});
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;
}
function setupButtonClickHandler(btn, type, element) {
const handleClick = async (e) => {
e.preventDefault();
e.stopPropagation();
const magnetLink = typeof element === 'string' ? element : await extractMagnetLink(element);
if (!magnetLink) return;
if (type === 'copy') {
await handleCopyAction(btn, magnetLink);
} else {
await handleOfflineAction(btn, magnetLink);
}
};
btn.addEventListener('click', handleClick);
btn.addEventListener('touchend', handleClick);
}
async function handleCopyAction(btn, magnetLink) {
try {
let decodedMagnetLink = magnetLink;
try {
decodedMagnetLink = decodeURIComponent(magnetLink);
} catch (e) {
}
GM_setClipboard(decodedMagnetLink, 'text');
if (isMobile && navigator.clipboard && navigator.clipboard.writeText) {
try {
await navigator.clipboard.writeText(decodedMagnetLink);
} catch (clipboardError) {
console.log('使用navigator.clipboard失败:', clipboardError);
}
}
let displayText = decodedMagnetLink;
showNotification('磁力链已复制', displayText);
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 feedbackHTML = SUCCESS_FEEDBACK_SVG;
if (btn.classList.contains('magnet-combined-button')) {
let clickedPart;
if (type) {
clickedPart = btn.querySelector(`.magnet-button-part[data-type="${type}"]`);
} else {
clickedPart = btn.querySelector('.magnet-button-part');
}
if (clickedPart) {
const originalContent = clickedPart.innerHTML;
clickedPart.style.minHeight = '22px';
clickedPart.style.display = 'inline-flex';
clickedPart.style.alignItems = 'center';
clickedPart.style.justifyContent = 'center';
clickedPart.innerHTML = feedbackHTML;
btn.disabled = true;
setTimeout(() => {
clickedPart.innerHTML = originalContent;
btn.disabled = false;
}, 2000);
}
} else {
const originalHTML = btn.innerHTML;
btn.style.minHeight = '26px';
btn.innerHTML = feedbackHTML;
btn.disabled = true;
setTimeout(() => {
btn.innerHTML = originalHTML;
btn.disabled = false;
}, 2000);
}
}
async function handleOfflineAction(btn, magnetLink) {
await process115Offline(magnetLink);
showButtonFeedback(btn, 'offline');
}
function handleBT4GSite() {
document.querySelectorAll('.result-item h5 > a[href^="/magnet/"]').forEach(titleA => {
if (titleA.dataset.bt4gButtonsAdded) return;
titleA.dataset.bt4gButtonsAdded = 'true';
const btnContainer = createButtonContainer({
marginRight: '8px'
});
const combinedBtn = createCombinedButtons(titleA);
btnContainer.appendChild(combinedBtn);
titleA.parentNode.insertBefore(btnContainer, titleA);
});
document.querySelectorAll('.card-body').forEach(cardBody => {
if (cardBody.dataset.buttonsAdded) return;
const magnetBtn = cardBody.querySelector('a[href*="downloadtorrentfile.com/hash/"]');
if (!magnetBtn) return;
cardBody.dataset.buttonsAdded = true;
const btnContainer = createButtonContainer({
elementType: 'div',
marginRight: '10px'
});
const combinedBtn = createCombinedButtons(magnetBtn);
btnContainer.appendChild(combinedBtn);
magnetBtn.parentNode.insertBefore(btnContainer, magnetBtn);
});
}
async function fetchBT4GMagnetFromDetail(detailHref) {
try {
let url = detailHref;
if (!/^https?:/.test(url)) {
url = location.origin + url;
}
const resp = await fetch(url, { credentials: 'omit' });
const html = await resp.text();
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);
let magnetLink = `magnet:?xt=urn:btih:${hash}`;
if (nameMatch && nameMatch[1]) {
const name = nameMatch[1];
magnetLink += `&dn=${name}`;
}
return magnetLink;
} catch (e) {
return null;
}
}
function handleCommonSites() {
if (/sobt[^.]+\..+/.test(window.location.host)) {
handleSOBTSite();
}
else if (window.location.host.endsWith('btdig.com')) {
handleBTDigSite();
}
else if (window.location.host.includes('nyaa.si')) {
handleNyaaSite();
}
else if (window.location.host.includes('dmhy.org')) {
handleDMHYSite();
}
else if (/(\.gying|\.gyg)\..+/.test(window.location.host)) {
handleGyingGygSite();
}
else if (/(\.|^)btsow\./.test(window.location.host)) {
handleBtsowSite();
}
else if (/\.btmulu\./.test(window.location.host)) {
handleBTMULUSite();
}
}
function handleBtsowSite() {
document.querySelectorAll('.row.data-row .file').forEach(titleLink => {
if (titleLink.dataset.buttonsAdded) return;
titleLink.dataset.buttonsAdded = true;
const btnContainer = createButtonContainer({
marginRight: '8px'
});
const magnetLink = extractBtsowMagnetLink(titleLink);
if (!magnetLink) return;
const combinedBtn = createCombinedButtons(magnetLink);
btnContainer.appendChild(combinedBtn);
titleLink.parentNode.insertBefore(btnContainer, titleLink);
});
document.querySelectorAll('textarea.magnet-link[readonly]').forEach(textarea => {
if (textarea.dataset.buttonsAdded) return;
textarea.dataset.buttonsAdded = true;
const magnetLink = textarea.value.trim();
if (!magnetLink || !magnetLink.startsWith('magnet:')) return;
const btnContainer = document.createElement('div');
btnContainer.className = 'magnet-action-buttons';
btnContainer.style.display = 'inline-block';
btnContainer.style.marginLeft = '10px';
btnContainer.style.verticalAlign = 'middle';
const combinedBtn = createCombinedButtons(magnetLink);
btnContainer.appendChild(combinedBtn);
textarea.parentNode.insertBefore(btnContainer, textarea.nextSibling);
});
}
async function fetchBTMULUMagnetFromDetail(detailHref) {
try {
let url = detailHref;
if (!/^https?:/.test(url)) {
url = location.origin + url;
}
const resp = await fetch(url, { credentials: 'omit' });
const html = await resp.text();
const parser = new DOMParser();
const doc = parser.parseFromString(html, 'text/html');
const magnetA = doc.querySelector('div.media-body a[href^="magnet:"]');
if (!magnetA) return null;
return magnetA.href;
} catch (e) {
console.error('获取BTMULU磁力链失败:', e);
return null;
}
}
function handleBTMULUSite() {
document.querySelectorAll('div[style="overflow: hidden;"] a[href^="/hash/"] h4').forEach(titleElement => {
const titleLink = titleElement.closest('a[href^="/hash/"]');
if (!titleLink || titleLink.dataset.buttonsAdded) return;
titleLink.dataset.buttonsAdded = true;
const labelElement = titleElement.querySelector('span.label');
if (!labelElement) return;
const btnContainer = createButtonContainer({
customStyles: {
margin: '0 8px'
}
});
(async () => {
try {
const magnetLink = await fetchBTMULUMagnetFromDetail(titleLink.href);
if (magnetLink) {
const combinedBtn = createCombinedButtons(magnetLink);
btnContainer.appendChild(combinedBtn);
if (labelElement.nextSibling) {
titleElement.insertBefore(btnContainer, labelElement.nextSibling);
} else {
titleElement.appendChild(btnContainer);
}
}
} catch (e) {
console.error('处理BTMULU磁力链失败:', e);
}
})();
});
document.querySelectorAll('div.media-body a[href^="magnet:"]').forEach(magnetLink => {
if (magnetLink.dataset.buttonsAdded) return;
magnetLink.dataset.buttonsAdded = true;
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() {
document.querySelectorAll('h3 > a[href^="/torrent/"]').forEach(titleLink => {
if (titleLink.dataset.buttonsAdded) return;
titleLink.dataset.buttonsAdded = true;
const btnContainer = document.createElement('span');
btnContainer.className = 'magnet-action-buttons';
btnContainer.style.display = 'inline-block';
btnContainer.style.marginRight = '5px';
const combinedBtn = createCombinedButtons(titleLink);
btnContainer.appendChild(combinedBtn);
titleLink.parentNode.insertBefore(btnContainer, titleLink);
});
document.querySelectorAll('a.download[id="down-url"]').forEach(openLinkBtn => {
if (openLinkBtn.dataset.buttonsAdded) return;
openLinkBtn.dataset.buttonsAdded = true;
const btnContainer = createButtonContainer({
marginRight: '8px'
});
const magnetLink = openLinkBtn.href;
const combinedBtn = createCombinedButtons(magnetLink);
btnContainer.appendChild(combinedBtn);
openLinkBtn.parentNode.insertBefore(btnContainer, openLinkBtn);
});
}
function handleBTDigSite() {
document.querySelectorAll('.torrent_name > a').forEach(titleLink => {
if (titleLink.dataset.buttonsAdded) return;
titleLink.dataset.buttonsAdded = true;
const btnContainer = createButtonContainer({
marginRight: '10px'
});
let resultDiv = titleLink.closest('.one_result');
let magnetLink = resultDiv ? resultDiv.querySelector('.torrent_magnet a[href^="magnet:"]') : null;
if (!magnetLink) return;
const combinedBtn = createCombinedButtons(magnetLink);
btnContainer.appendChild(combinedBtn);
titleLink.parentNode.insertBefore(btnContainer, titleLink);
});
document.querySelectorAll('tr td div.fa.fa-magnet a[href^="magnet:"]').forEach(magnetLink => {
if (magnetLink.dataset.buttonsAdded) return;
magnetLink.dataset.buttonsAdded = true;
const btnContainer = createButtonContainer({
marginLeft: '10px'
});
const combinedBtn = createCombinedButtons(magnetLink);
btnContainer.appendChild(combinedBtn);
magnetLink.parentNode.appendChild(btnContainer);
});
}
function handleNyaaSite() {
document.querySelectorAll('td.text-center a[href^="magnet:"]').forEach(magnetLink => {
if (magnetLink.dataset.buttonsAdded) return;
magnetLink.dataset.buttonsAdded = true;
let tr = magnetLink.closest('tr');
let downloadBtn = tr ? tr.querySelector("a[href^='/download/']") : null;
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);
}
});
document.querySelectorAll('.panel-footer .card-footer-item[href^="magnet:"]').forEach(magnetLink => {
if (magnetLink.dataset.buttonsAdded) return;
magnetLink.dataset.buttonsAdded = true;
const btnContainer = createButtonContainer({
marginLeft: '10px'
});
const combinedBtn = createCombinedButtons(magnetLink);
btnContainer.appendChild(combinedBtn);
magnetLink.parentNode.insertBefore(btnContainer, magnetLink.nextSibling);
});
}
function handleDMHYSite() {
const magnetHeader = document.querySelector('#topic_list th:nth-child(4)');
if (magnetHeader) {
magnetHeader.style.width = '18%';
}
document.querySelectorAll('a.download-arrow.arrow-magnet').forEach(magnetLink => {
if (magnetLink.dataset.buttonsAdded) return;
magnetLink.dataset.buttonsAdded = true;
const btnContainer = createButtonContainer({
marginLeft: '5px'
});
const combinedBtn = createCombinedButtons(magnetLink);
btnContainer.appendChild(combinedBtn);
magnetLink.parentNode.insertBefore(btnContainer, magnetLink);
});
document.querySelectorAll('#tabs-1 a.magnet, #tabs-1 a#magnet2').forEach(magnetLink => {
if (magnetLink.dataset.buttonsAdded) return;
magnetLink.dataset.buttonsAdded = true;
const btnContainer = createButtonContainer({
marginLeft: '5px'
});
const combinedBtn = createCombinedButtons(magnetLink);
btnContainer.appendChild(combinedBtn);
magnetLink.parentNode.insertBefore(btnContainer, magnetLink.nextSibling);
});
}
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 = document.createElement('span');
btnContainer.className = 'magnet-action-buttons';
btnContainer.style.display = 'inline-block';
btnContainer.style.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 || !magnetLink.startsWith('magnet:')) return;
const newLi = document.createElement('li');
newLi.className = 'magnet-script-custom-li';
Object.assign(newLi.style, {
display: 'inline-flex',
alignItems: 'center',
marginRight: '8px',
verticalAlign: 'middle',
padding: '0',
backgroundColor: 'transparent',
border: 'none',
boxShadow: 'none',
listStyle: 'none',
fontSize: '12px',
lineHeight: '1.5',
fontFamily: 'Arial, sans-serif',
color: '#333',
textDecoration: 'none',
userSelect: 'none',
float: 'none',
clear: 'none',
width: 'auto',
height: 'auto',
minWidth: '0',
minHeight: '0',
maxWidth: 'none',
maxHeight: 'none',
position: 'relative',
overflow: 'visible',
zIndex: '100',
whiteSpace: 'nowrap',
transform: 'translateY(-8.5px)'
});
const combinedBtn = createCombinedButtons(magnetLink);
combinedBtn.className = 'magnet-combined-button';
newLi.appendChild(combinedBtn);
list.insertBefore(newLi, magnetItem);
});
}
async function extractMagnetLink(element) {
try {
if (typeof element === 'string') {
if (element.startsWith('magnet:')) {
return element;
}
throw new Error('无法提取磁力链Hash');
}
if (element.href) {
if (element.href.startsWith('magnet:')) {
return element.href;
}
if (element.href.includes('/magnet/')) {
return await fetchBT4GMagnetFromDetail(element.href);
}
if (element.href.includes('/torrent/')) {
const hashMatch = element.href.match(/\/torrent\/([a-f0-9]+)\.html$/i);
if (hashMatch && hashMatch[1]) {
return `magnet:?xt=urn:btih:${hashMatch[1]}`;
}
}
if (element.href.includes('downloadtorrentfile.com/hash/')) {
const hashMatch = element.href.match(/hash\/([a-f0-9]+)/i);
if (hashMatch && hashMatch[1]) {
const hash = hashMatch[1];
const nameMatch = element.href.match(/[?&]name=([^&]+)/i);
let magnetLink = `magnet:?xt=urn:btih:${hash}`;
if (nameMatch && nameMatch[1]) {
magnetLink += `&dn=${nameMatch[1]}`;
}
return magnetLink;
}
}
if (element.href.includes('/hash/')) {
const hashMatch = element.href.match(/\/hash\/([a-f0-9]+)\.html$/i);
if (hashMatch && hashMatch[1]) {
return `magnet:?xt=urn:btih:${hashMatch[1]}`;
}
}
}
throw new Error('无法提取磁力链Hash');
} 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();
if (!cookies) {
GM_setValue('115_cookies', '');
GM_setValue('115_last_cookie_refresh', 0);
return false;
}
const isValid = await validate115Cookies(cookies);
if (isValid) {
GM_setValue('115_cookies', cookies);
GM_setValue('115_last_cookie_refresh', Date.now());
return true;
}
GM_setValue('115_cookies', '');
GM_setValue('115_last_cookie_refresh', 0);
return false;
} 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) {
const notificationContainer = document.createElement('div');
notificationContainer.className = 'custom-notification';
notificationContainer.id = id ? `notification-${id}` : `notification-${Date.now()}`;
Object.assign(notificationContainer.style, {
position: 'fixed',
bottom: '20px',
right: '20px',
padding: '12px 16px',
backgroundColor: 'rgba(255, 255, 255, 0.8)',
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)',
WebkitBackdropFilter: 'blur(10px)',
border: '1px solid rgba(255, 255, 255, 0.2)'
});
const titleElement = document.createElement('div');
titleElement.textContent = title;
titleElement.style.fontWeight = 'bold';
titleElement.style.marginBottom = '4px';
const textElement = document.createElement('div');
try {
if (text && (text.includes('%') || text.includes('magnet:'))) {
textElement.textContent = decodeURIComponent(text);
} else {
textElement.textContent = text;
}
} catch (e) {
textElement.textContent = text;
}
textElement.style.fontSize = '14px';
notificationContainer.appendChild(titleElement);
notificationContainer.appendChild(textElement);
document.body.appendChild(notificationContainer);
setTimeout(() => {
notificationContainer.style.opacity = '1';
notificationContainer.style.transform = 'translateY(0)';
}, 10);
const timeoutId = setTimeout(() => {
notificationContainer.style.opacity = '0';
notificationContainer.style.transform = 'translateY(20px)';
setTimeout(() => {
if (document.body.contains(notificationContainer)) {
document.body.removeChild(notificationContainer);
}
}, 300);
}, CONFIG.notificationTimeout);
notificationContainer.addEventListener('click', () => {
clearTimeout(timeoutId);
notificationContainer.style.opacity = '0';
notificationContainer.style.transform = 'translateY(20px)';
setTimeout(() => {
if (document.body.contains(notificationContainer)) {
document.body.removeChild(notificationContainer);
}
}, 300);
});
}
initializeScript();
})();