您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
只在 https://www.douyin.com/* 生效。默认关闭。点击面板一键切换 document.designMode(设计模式),使页面所有内容可选/可复制。使用后建议关闭或刷新页面以恢复正常交互。
// ==UserScript== // @name 抖音:一键开启设计模式以解除选中/复制限制 // @namespace https://toolsdar.cn/ // @version 1.0 // @description 只在 https://www.douyin.com/* 生效。默认关闭。点击面板一键切换 document.designMode(设计模式),使页面所有内容可选/可复制。使用后建议关闭或刷新页面以恢复正常交互。 // @match https://www.douyin.com/* // @grant none // @license MIT // @run-at document-idle // ==/UserScript== (function () { 'use strict'; // ====== UI 创建 ====== function createPanel() { if (document.getElementById('tm-designmode-panel')) return; const panel = document.createElement('div'); panel.id = 'tm-designmode-panel'; panel.style.cssText = [ 'position:fixed', 'right:12px', 'bottom:12px', 'z-index:2147483647', 'font-family:system-ui,-apple-system,Segoe UI,Roboto,"Helvetica Neue",Arial', 'background:rgba(10,10,10,0.7)', 'color:#fff', 'padding:8px', 'border-radius:10px', 'display:flex', 'gap:8px', 'align-items:center', 'box-shadow:0 6px 18px rgba(0,0,0,0.3)' ].join(';'); panel.innerHTML = ` <button id="tm-designmode-toggle" style="background:#fff;color:#000;border:0;padding:6px 10px;border-radius:6px;cursor:pointer;font-weight:600">开启设计模式</button> <div id="tm-designmode-status" style="font-size:12px;opacity:0.95">已关闭</div> `; document.documentElement.appendChild(panel); document.getElementById('tm-designmode-toggle').addEventListener('click', toggleDesignMode); panel.addEventListener('mousedown', startDrag); } function startDrag(e) { const panel = e.currentTarget; let startX = e.clientX, startY = e.clientY; const rect = panel.getBoundingClientRect(); const offsetX = startX - rect.left, offsetY = startY - rect.top; function onMove(ev) { panel.style.left = Math.max(6, ev.clientX - offsetX) + 'px'; panel.style.top = Math.max(6, ev.clientY - offsetY) + 'px'; panel.style.right = 'auto'; panel.style.bottom = 'auto'; } function onUp() { window.removeEventListener('mousemove', onMove); window.removeEventListener('mouseup', onUp); } window.addEventListener('mousemove', onMove); window.addEventListener('mouseup', onUp); } // ====== 设计模式控制 ====== function setDesignMode(on) { try { document.designMode = on ? 'on' : 'off'; try { document.body && document.body.focus && document.body.focus(); } catch (e) {} updatePanel(); showToast(on ? '设计模式已开启:现在可选中并复制页面所有内容(完成后请关闭或刷新)' : '设计模式已关闭(已恢复)', 2600); } catch (e) { console.error('tm: setDesignMode error', e); showToast('无法切换设计模式(浏览器限制)', 2000); } } function toggleDesignMode() { const isOn = (document.designMode && document.designMode.toLowerCase() === 'on'); setDesignMode(!isOn); } function updatePanel() { const btn = document.getElementById('tm-designmode-toggle'); const status = document.getElementById('tm-designmode-status'); if (!btn || !status) return; const isOn = (document.designMode && document.designMode.toLowerCase() === 'on'); if (isOn) { btn.textContent = '关闭设计模式'; btn.style.background = '#ffc107'; btn.style.color = '#000'; status.textContent = '已开启'; } else { btn.textContent = '开启设计模式'; btn.style.background = '#fff'; btn.style.color = '#000'; status.textContent = '已关闭'; } } // ====== 简单 toast 提示 ====== let toastTimer = null; function showToast(msg, ms = 1800) { try { const id = 'tm-designmode-toast'; let t = document.getElementById(id); if (!t) { t = document.createElement('div'); t.id = id; t.style.cssText = 'position:fixed;right:12px;bottom:84px;z-index:2147483647;background:rgba(0,0,0,0.7);color:#fff;padding:8px 12px;border-radius:8px;font-size:13px;backdrop-filter:blur(4px)'; document.documentElement.appendChild(t); } t.textContent = msg; t.style.opacity = '1'; if (toastTimer) clearTimeout(toastTimer); toastTimer = setTimeout(() => { try { t.style.opacity = '0'; } catch (e) {} }, ms); } catch (e) {} } // ====== 初始化 ====== function init() { createPanel(); updatePanel(); setInterval(updatePanel, 800); // 保持面板与 designMode 同步 } if (document.readyState === 'complete' || document.readyState === 'interactive') { setTimeout(init, 120); } else { document.addEventListener('DOMContentLoaded', init, { once: true }); } })();