// ==UserScript== // @name 抖音优化 // @namespace https://github.com/WhiteSevs/TamperMonkeyScript // @version 2025.1.14 // @author WhiteSevs // @description 视频过滤,包括广告、直播或自定义规则,伪装登录、屏蔽登录弹窗、自定义清晰度选择、未登录解锁画质选择、禁止自动播放、自动进入全屏、双击进入全屏、屏蔽弹幕和礼物特效、手机模式、修复进度条拖拽、自定义视频和评论区背景色等 // @license GPL-3.0-only // @icon data:image/png;base64,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 // @supportURL https://github.com/WhiteSevs/TamperMonkeyScript/issues // @match *://*.douyin.com/* // @match *://*.iesdouyin.com/* // @require https://update.greasyfork.org/scripts/494167/1413255/CoverUMD.js // @require https://fastly.jsdelivr.net/npm/@whitesev/utils@2.5.8/dist/index.umd.js // @require https://fastly.jsdelivr.net/npm/@whitesev/domutils@1.4.8/dist/index.umd.js // @require https://fastly.jsdelivr.net/npm/@whitesev/pops@1.9.7/dist/index.umd.js // @require https://fastly.jsdelivr.net/npm/qmsg@1.2.8/dist/index.umd.js // @connect * // @grant GM_deleteValue // @grant GM_getResourceText // @grant GM_getValue // @grant GM_info // @grant GM_registerMenuCommand // @grant GM_setValue // @grant GM_unregisterMenuCommand // @grant GM_xmlhttpRequest // @grant unsafeWindow // @run-at document-start // ==/UserScript== (function (Qmsg, Utils, DOMUtils, pops) { 'use strict'; var __defProp = Object.defineProperty; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); var _a; var _GM_deleteValue = /* @__PURE__ */ (() => typeof GM_deleteValue != "undefined" ? GM_deleteValue : undefined)(); var _GM_getResourceText = /* @__PURE__ */ (() => typeof GM_getResourceText != "undefined" ? GM_getResourceText : undefined)(); var _GM_getValue = /* @__PURE__ */ (() => typeof GM_getValue != "undefined" ? GM_getValue : undefined)(); var _GM_info = /* @__PURE__ */ (() => typeof GM_info != "undefined" ? GM_info : undefined)(); var _GM_registerMenuCommand = /* @__PURE__ */ (() => typeof GM_registerMenuCommand != "undefined" ? GM_registerMenuCommand : undefined)(); var _GM_setValue = /* @__PURE__ */ (() => typeof GM_setValue != "undefined" ? GM_setValue : undefined)(); var _GM_unregisterMenuCommand = /* @__PURE__ */ (() => typeof GM_unregisterMenuCommand != "undefined" ? GM_unregisterMenuCommand : undefined)(); var _GM_xmlhttpRequest = /* @__PURE__ */ (() => typeof GM_xmlhttpRequest != "undefined" ? GM_xmlhttpRequest : undefined)(); var _unsafeWindow = /* @__PURE__ */ (() => typeof unsafeWindow != "undefined" ? unsafeWindow : undefined)(); var _monkeyWindow = /* @__PURE__ */ (() => window)(); const KEY = "GM_Panel"; const ATTRIBUTE_INIT = "data-init"; const ATTRIBUTE_KEY = "data-key"; const ATTRIBUTE_DEFAULT_VALUE = "data-default-value"; const ATTRIBUTE_INIT_MORE_VALUE = "data-init-more-value"; const PROPS_STORAGE_API = "data-storage-api"; const UISelect = function(text, key, defaultValue, data, callback, description) { let selectData = []; if (typeof data === "function") { selectData = data(); } else { selectData = data; } let result = { text, type: "select", description, attributes: {}, props: {}, getValue() { return this.props[PROPS_STORAGE_API].get(key, defaultValue); }, callback(event, isSelectedValue, isSelectedText) { let value = isSelectedValue; log.info(`选择:${isSelectedText}`); this.props[PROPS_STORAGE_API].set(key, value); if (typeof callback === "function") { callback(event, value, isSelectedText); } }, data: selectData }; Reflect.set(result.attributes, ATTRIBUTE_KEY, key); Reflect.set(result.attributes, ATTRIBUTE_DEFAULT_VALUE, defaultValue); Reflect.set(result.props, PROPS_STORAGE_API, { get(key2, defaultValue2) { return PopsPanel.getValue(key2, defaultValue2); }, set(key2, value) { PopsPanel.setValue(key2, value); } }); return result; }; const UISwitch = function(text, key, defaultValue, clickCallBack, description, afterAddToUListCallBack) { let result = { text, type: "switch", description, attributes: {}, props: {}, getValue() { return Boolean( this.props[PROPS_STORAGE_API].get(key, defaultValue) ); }, callback(event, __value) { let value = Boolean(__value); log.success(`${value ? "开启" : "关闭"} ${text}`); this.props[PROPS_STORAGE_API].set(key, value); }, afterAddToUListCallBack }; Reflect.set(result.attributes, ATTRIBUTE_KEY, key); Reflect.set(result.attributes, ATTRIBUTE_DEFAULT_VALUE, defaultValue); Reflect.set(result.props, PROPS_STORAGE_API, { get(key2, defaultValue2) { return PopsPanel.getValue(key2, defaultValue2); }, set(key2, value) { PopsPanel.setValue(key2, value); } }); return result; }; const afterEnterDeepMenuCallBack = (formConfig, container) => { let $oneClickOpen = container.sectionBodyContainer.querySelector( ".keyboard-oneClickOpen" ); let $oneClickClose = container.sectionBodyContainer.querySelector( ".keyboard-oneClickClose" ); let clickCallBack = (isOpen) => { var _a2; (_a2 = container.sectionBodyContainer) == null ? undefined : _a2.querySelectorAll(".pops-panel-switch").forEach(($ele) => { let $input = $ele.querySelector( ".pops-panel-switch__input" ); let $checkbox = $ele.querySelector( ".pops-panel-switch__core" ); if (isOpen) { if (!$input.checked) { $checkbox.click(); } } else { if ($input.checked) { $checkbox.click(); } } }); }; domUtils.on($oneClickOpen, "click", (event) => { utils.preventEvent(event); clickCallBack(true); }); domUtils.on($oneClickClose, "click", (event) => { utils.preventEvent(event); clickCallBack(false); }); }; const AutoOpenOrClose = { text: ( /*html*/ ` 一键开启
一键关闭 ` ), afterEnterDeepMenuCallBack }; const PanelCommonConfig = { id: "panel-config-common", title: "通用", forms: [ { text: "", type: "forms", forms: [ { text: "Toast配置", type: "deepMenu", forms: [ { text: "", type: "forms", forms: [ UISelect( "Toast位置", "qmsg-config-position", "bottom", [ { value: "topleft", text: "左上角" }, { value: "top", text: "顶部" }, { value: "topright", text: "右上角" }, { value: "left", text: "左边" }, { value: "center", text: "中间" }, { value: "right", text: "右边" }, { value: "bottomleft", text: "左下角" }, { value: "bottom", text: "底部" }, { value: "bottomright", text: "右下角" } ], (event, isSelectValue, isSelectText) => { log.info("设置当前Qmsg弹出位置" + isSelectText); }, "Toast显示在页面九宫格的位置" ), UISelect( "最多显示的数量", "qmsg-config-maxnums", 3, [ { value: 1, text: "1" }, { value: 2, text: "2" }, { value: 3, text: "3" }, { value: 4, text: "4" }, { value: 5, text: "5" } ], undefined, "限制Toast显示的数量" ), UISwitch( "逆序弹出", "qmsg-config-showreverse", false, undefined, "修改Toast弹出的顺序" ) ] } ] } ] }, { type: "forms", text: "", forms: [ { text: "功能", type: "deepMenu", forms: [ { text: "", type: "forms", forms: [ UISwitch( "伪装登录", "disguiseLogin", false, undefined, "使用随机UID进行伪装" ), UISwitch( "initial-scale=1", "dy-initialScale", false, undefined, "可配合手机模式放大页面" ), UISwitch( "移除 apple-itunes-app", "dy-apple-removeMetaAppleItunesApp", true, undefined, "Safari使用,移除顶部横幅【Open in the 抖音 app】" ), UISwitch( "监听Router改变", "dy-common-listenRouterChange", true, undefined, "功能重载" ), UISwitch( "移除某些Cookie", "dy-cookie-remove__ac__", false, undefined, "阻止触发验证弹窗(maybe)" ) ] }, { text: "Url重定向", type: "forms", forms: [ UISwitch( "重定向/home", "douyin-redirect-url-home-to-root", false, undefined, "/home => /" ) ] } ] }, { type: "deepMenu", text: "快捷键禁用", afterEnterDeepMenuCallBack: AutoOpenOrClose.afterEnterDeepMenuCallBack, forms: [ { type: "forms", text: AutoOpenOrClose.text, forms: [ UISwitch( "赞|取消赞", "dy-keyboard-hook-likeOrDislike", false, undefined, "Z" ), UISwitch( "评论", "dy-keyboard-hook-comment", false, undefined, "X" ), UISwitch( "开启/关闭弹幕", "dy-keyboard-hook-danmaku-enable", false, undefined, "B" ), UISwitch( "收藏/取消收藏", "dy-keyboard-hook-collect-enable", false, undefined, "C" ), UISwitch( "复制分享口令", "dy-keyboard-hook-copyShareLink", false, undefined, "V" ), UISwitch( "清屏", "dy-keyboard-hook-clearScreen", false, undefined, "J" ), UISwitch( "自动连播", "dy-keyboard-hook-automaticBroadcast", false, undefined, "K" ), UISwitch( "视频信息", "dy-keyboard-hook-videoInfo", false, undefined, "I" ), UISwitch( "不感兴趣", "dy-keyboard-hook-notInterested", false, undefined, "R" ), UISwitch( "进入作者主页", "dy-keyboard-hook-enterAuthorHomePage", false, undefined, "F" ), UISwitch( "关注/取消关注", "dy-keyboard-hook-follow", false, undefined, "G" ), UISwitch( "抖音搜索", "dy-keyboard-hook-search", false, undefined, "Shift+F" ), UISwitch( "一键关闭当前页", "dy-keyboard-hook-closeTheCurrentPageWithOneClick", false, undefined, "Shift+Q" ), UISwitch( "上下翻页", "dy-keyboard-hook-pageUpAndDown", false, undefined, "↑↓" ), UISwitch( "快进快退", "dy-keyboard-hook-fastForwardAndFastBack", false, undefined, "← →" ), UISwitch( "暂停", "dy-keyboard-hook-pause", false, undefined, "空格" ), UISwitch( "网页内全屏", "dy-keyboard-hook-fullScreenInsideThePage", false, undefined, "Y" ), UISwitch( "全屏", "dy-keyboard-hook-fullScreen", false, undefined, "H" ), UISwitch( "稍后再看", "dy-keyboard-hook-watchItOutLater", false, undefined, "L" ), UISwitch( "音量调整", "dy-keyboard-hook-volumeAdjustment", false, undefined, "Shift + / Shift -" ), UISwitch( "呼出快捷键列表", "dy-keyboard-hook-listOfCallShortcutKeys", false, undefined, "?" ), UISwitch( "关闭快捷键列表", "dy-keyboard-hook-closeTheShortcutKeyList", false, undefined, "ESC" ), UISwitch( "相关推荐", "dy-keyboard-hook-relevantRecommendation", false, undefined, "N" ) ] } ] } ] }, { text: "", type: "forms", forms: [ { text: "布局屏蔽-全局", type: "deepMenu", afterEnterDeepMenuCallBack: AutoOpenOrClose.afterEnterDeepMenuCallBack, forms: [ { type: "forms", text: AutoOpenOrClose.text, forms: [ UISwitch( "【屏蔽】登录弹窗", "watchLoginDialogToClose", true, undefined, "屏蔽元素且自动等待元素出现并关闭登录弹窗" ), UISwitch( "【屏蔽】底部?按钮", "shieldBottomQuestionButton", true, undefined, "屏蔽元素" ) ] } ] }, { text: "布局屏蔽-左侧导航栏", type: "deepMenu", afterEnterDeepMenuCallBack: AutoOpenOrClose.afterEnterDeepMenuCallBack, forms: [ { type: "forms", text: AutoOpenOrClose.text, forms: [ UISwitch( "【屏蔽】左侧导航栏", "shieldLeftNavigator", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】首页", "shieldLeftNavigator-tab-home", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】推荐", "shieldLeftNavigator-tab-recommend", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】关注", "shieldLeftNavigator-tab-follow", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】朋友", "shieldLeftNavigator-tab-friend", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】我的", "shieldLeftNavigator-tab-user_self", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】喜欢", "shieldLeftNavigator-tab-user_self_like", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】收藏", "shieldLeftNavigator-tab-user_self_collection", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】观看历史", "shieldLeftNavigator-tab-user_self_record", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】看奥运", "shieldLeftNavigator-tab-olympics", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】直播", "shieldLeftNavigator-tab-live", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】放映厅", "shieldLeftNavigator-tab-vs", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】短剧", "shieldLeftNavigator-tab-series", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】知识", "shieldLeftNavigator-tab-channel_300203", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】游戏", "shieldLeftNavigator-tab-channel_300205", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】二次元", "shieldLeftNavigator-tab-channel_300206", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】音乐", "shieldLeftNavigator-tab-channel_300209", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】美食", "shieldLeftNavigator-tab-channel_300204", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】美好跨年季", "shieldLeftNavigator-tab-activity_2644292", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】2025新春环游记", "shieldLeftNavigator-tab-activity_2643710", false, undefined, "屏蔽元素" ) ] } ] }, { text: "布局屏蔽-顶部导航栏", type: "deepMenu", afterEnterDeepMenuCallBack: AutoOpenOrClose.afterEnterDeepMenuCallBack, forms: [ { text: AutoOpenOrClose.text, type: "forms", forms: [ UISwitch( "【屏蔽】顶部导航栏", "shieldTopNavigator", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】右侧菜单栏", "shield-topNav-rightMenu", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】客户端提示", "shieldClientTip", true, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】充钻石", "shieldFillingBricksAndStones", true, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】客户端", "shieldClient", true, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】快捷访问", "shieldQuickAccess", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】通知", "shieldNotifitation", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】私信", "shieldPrivateMessage", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】投稿", "shieldSubmission", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】壁纸", "shieldWallpaper", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】更多", "shield-topNav-rightMenu-more", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】登录头像", "shield-topNav-rightMenu-loginAvatar", false, undefined, "屏蔽元素" ) ] } ] }, { text: "布局屏蔽-搜索", type: "deepMenu", afterEnterDeepMenuCallBack: AutoOpenOrClose.afterEnterDeepMenuCallBack, forms: [ { text: AutoOpenOrClose.text, type: "forms", forms: [ UISwitch( "【屏蔽】搜索框", "shieldSearch", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】搜索框的提示", "shieldSearchPlaceholder", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】猜你想搜", "shieldSearchGuessYouWantToSearch", false, undefined, "屏蔽元素" ), UISwitch( "【屏蔽】抖音热点", "shieldSearchTiktokHotspot", false, undefined, "屏蔽元素" ) ] } ] }, { type: "deepMenu", text: "布局屏蔽-鼠标悬浮提示", afterEnterDeepMenuCallBack: AutoOpenOrClose.afterEnterDeepMenuCallBack, forms: [ { type: "forms", text: AutoOpenOrClose.text + "
视频区域-右侧工具栏", forms: [ UISwitch( "进入作者主页", "dy-video-mouseHoverTip-rightToolBar-enterUserHome", false ), UISwitch( "关注", "dy-video-mouseHoverTip-rightToolBar-follow", false ), UISwitch( "点赞", "dy-video-mouseHoverTip-rightToolBar-addLike", false ), UISwitch( "评论", "dy-video-mouseHoverTip-rightToolBar-comment", false ), UISwitch( "收藏", "dy-video-mouseHoverTip-rightToolBar-collect", false ), UISwitch( "分享", "dy-video-mouseHoverTip-rightToolBar-share", false ), UISwitch( "看相关", "dy-video-mouseHoverTip-rightToolBar-seeCorrelation", false ) ] }, { type: "forms", text: "视频区域-底部工具栏", forms: [ UISwitch( "自动连播", "dy-video-mouseHoverTip-bottomToolBar-automaticBroadcast", false ), UISwitch( "清屏", "dy-video-mouseHoverTip-bottomToolBar-clearScreen", false ), UISwitch( "稍后再看", "dy-video-mouseHoverTip-bottomToolBar-watchLater", false ), UISwitch( "网页全屏", "dy-video-mouseHoverTip-bottomToolBar-pageFullScreen", false ), UISwitch( "全屏", "dy-video-mouseHoverTip-bottomToolBar-fullScreen", false ) ] } ] } ] } ] }; const DouYinDanmuFilter = { key: "douyin-live-danmu-rule", $data: { rule: [], isFilterAttrName: "data-is-filter" }, init() { this.resetRule(); this.initRule(); }, /** * 初始化解析规则 */ initRule() { let localRule = this.get().trim(); let localRuleSplit = localRule.split("\n"); localRuleSplit.forEach((item) => { if (item.trim() == "") return; item = item.trim(); let itemRegExp = new RegExp(item.trim()); this.$data.rule.push(itemRegExp); }); }, /** * 重置规则数据 */ resetRule() { this.$data.rule = []; }, /** * 通知弹幕改变(可能是新增) */ change() { var _a2, _b, _c, _d, _e, _f, _g; let danmakuQueue = Array.from( $$("xg-danmu.xgplayer-danmu > div > div") ); if (!danmakuQueue.length) { return; } for (let messageIndex = 0; messageIndex < danmakuQueue.length; messageIndex++) { let $danmuItem = danmakuQueue[messageIndex]; if ($danmuItem.hasAttribute(this.$data.isFilterAttrName)) { continue; } let $messageObj = (_d = (_c = (_b = (_a2 = utils.getReactObj($danmuItem)) == null ? undefined : _a2.reactFiber) == null ? undefined : _b.return) == null ? undefined : _c.memoizedProps) == null ? undefined : _d.message; let message = ((_e = $messageObj == null ? undefined : $messageObj.payload) == null ? undefined : _e.content) || ((_g = (_f = $messageObj == null ? undefined : $messageObj.payload) == null ? undefined : _f.common) == null ? undefined : _g.describe); for (let index = 0; index < this.$data.rule.length; index++) { const ruleRegExp = this.$data.rule[index]; if (typeof message === "string") { if (ruleRegExp.test(message)) { log.info("过滤弹幕: " + message); $danmuItem.setAttribute(this.$data.isFilterAttrName, "true"); domUtils.hide($danmuItem); break; } } } } }, set(value) { _GM_setValue(this.key, value); }, get() { return _GM_getValue(this.key, ""); } }; const DouYinLiveDanmuku = { /** * 弹幕过滤 */ filterDanmu() { utils.waitNode("xg-danmu.xgplayer-danmu", 1e5).then(($danmu) => { if (!$danmu) { log.error("xg-danmu.xgplayer-danmu获取失败"); return; } log.success("弹幕过滤"); DouYinDanmuFilter.init(); utils.mutationObserver($danmu, { config: { childList: true, subtree: true }, callback: () => { DouYinDanmuFilter.change(); } }); }); } }; const ReactUtils = { /** * 等待react某个属性并进行设置 */ async waitReactPropsToSet($target, propName, needSetList) { function getTarget() { let __target__ = null; if (typeof $target === "string") { __target__ = document.querySelector($target); } else if (typeof $target === "function") { __target__ = $target(); } else if ($target instanceof HTMLElement) { __target__ = $target; } return __target__; } if (typeof $target === "string") { let $ele = await utils.waitNode($target, 1e4); if (!$ele) { return; } } if (!Array.isArray(needSetList)) { needSetList = [needSetList]; } needSetList.forEach((needSetOption) => { if (typeof needSetOption.msg === "string") { log.info(needSetOption.msg); } function checkObj() { let target = getTarget(); if (target == null) { return false; } let targetObj = utils.getReactObj(target); if (targetObj == null) { return false; } let targetObjProp = targetObj[propName]; if (targetObjProp == null) { return false; } let needOwnCheck = needSetOption.check(targetObjProp); return Boolean(needOwnCheck); } utils.waitPropertyByInterval( () => { return getTarget(); }, checkObj, 250, 1e4 ).then(() => { let target = getTarget(); if (target == null) { return; } let targetObj = utils.getReactObj(target); if (targetObj == null) { return; } let targetObjProp = targetObj[propName]; if (targetObjProp == null) { return; } needSetOption.set(targetObjProp, target); }); }); } }; const CommonUtil = { /** * 添加屏蔽CSS * @param args * @example * addBlockCSS("") * addBlockCSS("","") * addBlockCSS(["",""]) */ addBlockCSS(...args) { let selectorList = []; if (args.length === 0) { return; } if (args.length === 1 && typeof args[0] === "string" && args[0].trim() === "") { return; } args.forEach((selector) => { if (Array.isArray(selector)) { selectorList = selectorList.concat(selector); } else { selectorList.push(selector); } }); return addStyle(`${selectorList.join(",\n")}{display: none !important;}`); }, /** * 设置GM_getResourceText的style内容 * @param resourceMapData 资源数据 * @example * setGMResourceCSS({ * keyName: "ViewerCSS", * url: "https://example.com/example.css", * }) */ setGMResourceCSS(resourceMapData) { let cssText = typeof _GM_getResourceText === "function" ? _GM_getResourceText(resourceMapData.keyName) : ""; if (typeof cssText === "string" && cssText) { addStyle(cssText); } else { CommonUtil.loadStyleLink(resourceMapData.url); } }, /** * 添加标签 * @param url * @example * loadStyleLink("https://example.com/example.css") */ async loadStyleLink(url) { let $link = document.createElement("link"); $link.rel = "stylesheet"; $link.type = "text/css"; $link.href = url; domUtils.ready(() => { document.head.appendChild($link); }); }, /** * 添加