// ==UserScript== // @name 🚫🔞 防沉迷终结者 🕺🎮 // @description [❤️支持全面] 支持 4399 (部分网页游戏到点不踢),7k7k,17yy,37,9377,游戏狗,u7u9,7724,07073,4366 [😱别怕大人] 大人来了就按"大人键" [🕶 手动破解] 防沉迷破解不成功? 对着防沉迷弹窗按快捷键 [😵‍💫万能规则] 误杀率高, 几乎没卵用的功能 // @namespace https://fcmsb250.github.io/ // @version 5.0.0 // @icon https://dsy4567.github.io/logo.svg // @author dsy4567 https://greasyfork.org/zh-CN/users/822325 | https://github.com/dsy4567 // @run-at document-start // @license GPL-3.0 // @compatible firefox firefox + tampermonkey 测试通过 // @compatible chrome chrome/360安全浏览器 + tampermonkey 测试通过 // @compatible edge edge + tampermonkey 测试通过 // @match *://*.17yy.com/* // @match *://*.4399.com/* // @match *://*.7k7k.com/* // @match *://*.aiwan4399.com/* // @match *://*.iwan4399.com/* // @match *://*.zxwyouxi.com/* // @match *://*.5054399.net/* // @match *://*.5054399.com/* // @match *://h5.07073.com/* // @match *://*.7724.com/* // @match *://*.u7u9.com/* // @match *://*.9377.com/* // @match *://*.37.com/* // @match *://*.4366.com/* // @grant GM_addStyle // @grant GM_addValueChangeListener // @grant GM_getValue // @grant GM_info // @grant GM_notification // @grant GM_openInTab // @grant GM_registerMenuCommand // @grant GM_setValue // @grant GM_unregisterMenuCommand // @grant unsafeWindow // @homepageURL https://fcmsb250.github.io/ // @supportURL https://github.com/dsy4567/Fucking-Anti-Indulgence/ // @installURL https://github.com/dsy4567/Fucking-Anti-Indulgence/raw/main/Fucking-Anti-Indulgence.user.js // ==/UserScript== "use strict"; let D = new Date(); function setValue(value, defaultValue, callback) { if (GM_getValue(value, defaultValue) == "1") { GM_setValue(value, "0"); } else if (GM_getValue(value, defaultValue) == "0") { GM_setValue(value, "1"); } else { GM_setValue(value, defaultValue); } if (callback) { callback(); } } function initStorage(value, defaultValue, callback) { if (GM_getValue(value, null) == null) { GM_setValue(value, defaultValue); } if (callback) { callback(); } } function checkValue(value) { if (GM_getValue(value) == "1") { return "✅已启用 "; } else if (GM_getValue(value) == "0") { return "❌已停用 "; } else { return "⚠️配置错误 "; } } /** @returns {HTMLCanvasElement | HTMLScriptElement | HTMLIFrameElement} */ function qs(选择器) { return document.querySelector(选择器); } function qsa(选择器) { return document.querySelectorAll(选择器); } initStorage("安装日期", String(Math.floor(D.getTime() / 1000 / 60 / 60 / 24))); initStorage("停用快捷键", "0"); initStorage("开发环境", "0"); var daysUsed = Math.ceil(D.getTime() / 1000 / 60 / 60 / 24) - Number(GM_getValue("安装日期")); let pageLoaded = false; let popupStyle = { remove: () => {} }; let lastMenuId = 0; let realAddress_17yy = ""; /** @type {Function} */ let _playLoading; let devConfig = {}; let succeeded = false; let gamePlatform = ""; const locationHref = location.href; const host = location.host; const pathname = location.pathname; const U = new URL(location.href); if (GM_getValue("开发环境") == "1") { devConfig.EnableConsoleOutput = 1; devConfig.EnableDebugging = 1; // devConfig.DisableAutomaticCracking = 1; devConfig.exportVariables = 1; } else { devConfig.EnableConsoleOutput = 0; devConfig.EnableDebugging = 0; devConfig.DisableAutomaticCracking = 0; devConfig.exportVariables = 0; } (() => { const a = host.split("."); for (let i = 0; i < a.length; i++) { const ss = a[i]; if (ss === "com" || ss === "cn") { gamePlatform = a[i - 1]; break; } } })(); const /** @type {Record void)[]>} */ rules = { 4399: [ // 使防沉迷尝试读取某些全局变量时报错 // https://www.4399.com/flash/223745_2.htm () => { Object.defineProperty(unsafeWindow, "smevent", { value: null, writable: false, }); Object.defineProperty(unsafeWindow, "PageWebApiSdk", { value: null, writable: false, }); Object.defineProperty(unsafeWindow, "getBizid", { value: null, writable: false, }); }, // https://h.4399.com/zzy/236117.htm () => { if ( host !== "h.4399.com" || (host === "h.4399.com" && !pathname.includes("/play/")) ) return; if (devConfig.EnableDebugging) { debugger; } log(["4399 手机端防沉迷"]); if (devConfig.EnableDebugging) { debugger; } const url = unsafeWindow.webServer + unsafeWindow.gameiframe; if (url && unsafeWindow.webServer && unsafeWindow.gameiframe) { succeeded = 1; location.href = url; } }, // https://www.4399.com/flash/209443.htm () => { if ( host !== "h.api.4399.com" || (host === "h.api.4399.com" && pathname !== "/g.php") ) return; if (devConfig.EnableDebugging) { debugger; } log(["4399 h5页游防沉迷(h.api.4399.com/g.php)"]); const gameId = U.searchParams.get("gameId"); if (!gameId) return; fetch("https://h.api.4399.com/intermodal/user/grant2", { method: "POST", body: `gameId=${gameId}&authType=cookie&cookieValue=${getMiddleString( "Pauth=", ";", document.cookie )}`, headers: { "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", }, }) .then(res => res.json()) .then(resp => { log([resp]); if (resp.data.game.gameUrl) location.href = resp.data.game.gameUrl; else throw new Error("[防沉迷终结者] gameUrl 为空"); }) .catch(err => console.error(err)); succeeded = 1; }, ], // 4399 在线玩 zxwyouxi: [ // https://www.zxwyouxi.com/g/100057159 () => { if ( host !== "www.zxwyouxi.com" || (host === "www.zxwyouxi.com" && !pathname.startsWith("/g/")) ) return; if (devConfig.EnableDebugging) { debugger; } log(["4399 h5页游防沉迷(www.zxwyouxi.com/g/)"]); fetch("https://h.api.4399.com/intermodal/user/grant2", { method: "POST", body: `gameId=${getMiddleString( "/g/", "", locationHref, "3" )}&authType=token&userId=${getMiddleString( "4399_HTML5_PREVIEW_USERID=", ";", document.cookie )}&accessToken=${getMiddleString( "HTML5_ACCESS_TOKEN=", ";", document.cookie )}`, headers: { "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", }, }) .then(res => res.json()) .then(resp => { log([resp]); if (resp.data.game.gameUrl) location.href = resp.data.game.gameUrl; else throw new Error("[防沉迷终结者] gameUrl 为空"); }) .catch(err => console.error(err)); succeeded = 1; }, ], "7k7k": [ // http://www.7k7k.com/swf/205652.htm () => { if (!unsafeWindow.play22) return; if (devConfig.EnableDebugging) { debugger; } log(["7k7k防沉迷"]); unsafeWindow.play22.playLoading(); if (!_playLoading) { _playLoading = unsafeWindow.play22.playLoading; } unsafeWindow.play22.playLoading = () => {}; // 防止重复调用 succeeded = 1; }, // http://m.7k7k.com/flash/205652.htm () => { if ( host !== "m.7k7k.com" || (host === "m.7k7k.com" && !pathname.includes("/flash/") && host === "m.7k7k.com" && !pathname.includes("/swf/")) ) return; if (devConfig.EnableDebugging) { debugger; } log(["7k7k手机端防沉迷"]); unsafeWindow.open = null; const f = () => { removeListeners("div.gameInfo_begin.jsbegin"); qs("div.gameInfo_begin.jsbegin").addEventListener( "click", () => fetch(unsafeWindow.gameInfo.gameUrl) .then(res => res.text()) .then(html => { location.href = getMiddleString( 'gameUrl: "', '",', html, "1" ); }) ); }; pageLoaded ? f() : addEventListener("DOMContentLoaded", f); succeeded = 1; }, // http://h5.7k7k.com/mb/mb2/5b5dd7da8ad23b748f9ea32a7a3cedfa.html?gid=f5c4dbf7fb41d89d76a333332f33f853&tid=94606&qs=1 () => { if ( host !== "m.7k7k.com" || (host === "m.7k7k.com" && !pathname.includes("/web/H5GAMES.html")) ) return; if (devConfig.EnableDebugging) { debugger; } log(["7k7k h5页游防沉迷"]); fetch( `//h5.7k7k.com/api_redirect/game/start/?client=0&account=${getMiddleString( "userid=", ";", document.cookie, "2" )}&appkey=${getMiddleString( "gid=", "&", locationHref, "2" )}&uid=${getMiddleString( "userid=", ";", document.cookie, "2" )}&tid=${getMiddleString("tid=", "&", locationHref, "2")}` ) .then(res => res.json()) .then(json => { location.href = json.url; }); succeeded = 1; }, () => { if ( !host.includes("h5.7k7k.com") || (host.includes("h5.7k7k.com") && !pathname.includes("/game/")) ) return; if (devConfig.EnableDebugging) { debugger; } log(["7k7k h5页游(手机端)防沉迷"]); fetch( `//h5.7k7k.com/api_redirect/game/start/?client=0&account=${getMiddleString( "userid=", ";", document.cookie, "2" )}&appkey=${unsafeWindow.gid[0]}&uid=${getMiddleString( "userid=", ";", document.cookie, "2" )}&tid=${unsafeWindow.tid}` ) .then(res => res.json()) .then(json => { location.href = json.url; }); succeeded = 1; }, ], "17yy": [ // https://www.17yy.com/f/play/246085.html // https://www.17yy.com/f/play/246568.html () => { if ( host !== "www.17yy.com" || (host === "www.17yy.com" && !pathname.startsWith("/f/play")) ) return; if (devConfig.EnableDebugging) { debugger; } log(["17yy防沉迷"]); try { if (qs("#flashgame").src === realAddress_17yy) return; } catch (e) {} try { if (qs("#flash_frame").src === realAddress_17yy) return; } catch (e) {} fetch("//www.17yy.com/e/payapi/vip_ajax.php", { method: "POST", body: `action=getStatus&id=${getMiddleString( "/f/play/", ".html", locationHref, "3" )}`, headers: { "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", }, }) .then(res => res.json()) .then(resp => { try { qs("#flashgame").src = realAddress_17yy = "//" + unsafeWindow.server + "/" + unsafeWindow.classes + "/" + unsafeWindow.date + "/" + resp.data.game_path; } catch (e) {} try { qs("#flash_frame").src = realAddress_17yy = "//" + unsafeWindow.server + "/" + unsafeWindow.classes + "/" + unsafeWindow.date + "/" + resp.data.game_path; } catch (e) {} }); succeeded = 1; }, ], 7724: [ // https://www.7724.com/XuanCaiTuXing/ () => { if ( host !== "i.7724.com" || (host === "i.7724.com" && !locationHref.includes("/user/danjilogin?url=")) ) return; if (devConfig.EnableDebugging) { debugger; } log(["7724防沉迷"]); let url = getMiddleString( "danjilogin?url=", undefined, locationHref, "1" ); location.href = url; succeeded = 1; }, ], 4366: [ // http://wvw.4366.com/game_login.php?game=bscq&server=new () => { if ( !host.includes("wvw.4366.com") || (host.includes("wvw.4366.com") && !pathname.includes("/game_login.php")) ) return; if (devConfig.EnableDebugging) { debugger; } log(["4366防沉迷"]); fetch(locationHref) .then(res => res.text()) .then(html => { let url = getMiddleString( 'align="left" id="iframe" src="', '" name="mainFrame" scrolling="auto"', html, "1" ); location.href = url; }); succeeded = 1; }, ], 37: [ // https://game.37.com/server_list_901.html () => { if ( !host.includes("game.37.com") || (host.includes("game.37.com") && !pathname.includes("/play.php")) ) return; if (devConfig.EnableDebugging) { debugger; } log(["37防沉迷"]); fetch(locationHref) .then(res => res.text()) .then(html => { let url = getMiddleString( 'src="//gameapp.37.com/controller/enter_game.php', '" id="mainFrame"', html, "1", "//gameapp.37.com/controller/enter_game.php" ); location.href = url; }); succeeded = 1; }, ], 9377: [ // http://www.9377.com/bscq/ () => { if ( !host.includes("wvw.9377.com") || (host.includes("wvw.9377.com") && !pathname.includes("/game_login.php")) ) return; if (devConfig.EnableDebugging) { debugger; } log(["9377防沉迷"]); fetch(locationHref) .then(res => res.text()) .then(html => { let url = getMiddleString( 'id="iframe" src="', '" name="mainFrame" scrolling="auto"', html, "1" ); location.href = url; }); succeeded = 1; }, ], }; const blackList = [ "#addiv", "#anti-indulge", "#anti-indulge-prompt", "#Anti_mask", "#Anti_open", "#app > div > div.cover.splash", "#chCoverDiv", "#codepop6", "#cover", "#div_dialog", "#easyDialogBox", "#fcmIframe", "#Guide", "#loginCertify", "#messageBox", "#overlay", "#page_wallpaper > div.xiaowei.xiaowei-orange > div.xw-left > div.xw-game > div.xw-top > div > div", "#pop2", "#pusher", "#shadow", "#swfdiv > div.box", "#tc100", "#yx_log", ".codegs", ".cmMask", ".fixedModal", ".mask", ".play_load", ".popup-c", ".realName", ".sdkDialog", ".toolDialog", ".ui-forbidden", ".webtipss", "body > div.show_box.popup_bg", "div[style*='z-index: 99999']", ]; /** * 为某个字符串获取两个字符串中间的字符串(不包括那两个字符串) * @param {String} begin * @param {String} end (可以是空字符串) * @param {String} target * @param {String | undefined} type "1": 网址, "2": 字母 + 数字, "3": 数字 (可选) * @param {String | undefined} append 在匹配到字符串, 判断字符串类型之前, 给匹配到的字符串前面追加指定的字符串 (可选) * @returns {String} */ function getMiddleString(begin, end, target, type, append) { target = target.substring(target.indexOf(begin) + begin.length); if (end) { target = decodeURI(target.substring(0, target.indexOf(end))); } if (append) { target = append + target; } switch (type) { case "1": if (!(/^https?:\/\//gi.test(target) || target.startsWith("//"))) { throw new Error("[防沉迷终结者] 不正确的字符串类型"); } break; case "2": if (!/^[0-9a-zA-Z]*$/g.test(target)) { throw new Error("[防沉迷终结者] 不正确的字符串类型"); } break; case "3": if (isNaN(Number(target))) { throw new Error("[防沉迷终结者] 不正确的字符串类型"); } break; default: break; } return target; } function removeListeners(selector) { qsa(selector).forEach(oldElement => { const newElement = oldElement.cloneNode(true); oldElement.parentNode.replaceChild(newElement, oldElement); }); } function capitalizeFirstLetter(str) { str = str[0].toUpperCase() + str.substring(1, str.length); return str; } /** @param {any[]} data */ function log(data) { if (devConfig.EnableConsoleOutput) console.log("[防沉迷终结者]", ...data, locationHref); } function useGeneralRules() { const idOrClassNameOfGame = [ "flash", "game", "play", "youxi", "swf", "flash", ]; const idOrClassNameOfAnti = [ "anti", "fcm", "verify", "mask", "certify", "dialog", "popup", "login", "cover", ]; let temp = []; let style = ""; idOrClassNameOfGame.forEach(str => { temp.push( "iframe[id*='" + str + "'],", "iframe[class*='" + str + "'],", "iframe[id*='" + str.toUpperCase() + "'],", "iframe[class*='" + str.toUpperCase() + "'],", "iframe[id*='" + capitalizeFirstLetter(str) + "'],", "iframe[class*='" + capitalizeFirstLetter(str) + "']," ); }); temp.forEach(str => { style += str; }); style += `#qwqawaqaq { display: block !important; left: 0 !important; top: 0 !important; position: absolute !important; z-index: 999999 !important; }`; temp = []; idOrClassNameOfAnti.forEach(str => { temp.push( "[id*='" + str + "'],", "[class*='" + str + "'],", "[id*='" + str.toUpperCase() + "'],", "[class*='" + str.toUpperCase() + "'],", "[id*='" + capitalizeFirstLetter(str) + "'],", "[class*='" + capitalizeFirstLetter(str) + "']," ); }); temp.forEach(str => { style += str; }); style += `#qwqawaqaq { display: none !important; min-width: 0 !important; width: 0 !important; max-width: 0 !important; min-height: 0 !important; height: 0 !important; max-height: 0 !important; z-index: -999 !important; font-size: 0 !important; overflow: hidden !important; }`; temp = []; GM_addStyle(style); } function registerMenuCommand() { const menus = [ [ "⚠️沉迷于游戏不利于身心健康,请合理安排游戏时间,适度游戏⚠️", undefined, undefined, ], ["❤️您已尽情欢乐" + daysUsed + "天", undefined, undefined], [ "👉再次破解(alt + 鼠标中键)", () => { succeeded = 0; if (_playLoading) { unsafeWindow.play22.playLoading = _playLoading; } crackAnti(); removeMask(); }, undefined, ], [ "👉大人来了(shift + 鼠标中键)(解除请使用再次破解)", () => { hideGame(); }, undefined, ], [ "👉手动破解(鼠标指向防沉迷弹窗, 然后按 shift + alt + 鼠标右键)", () => { alert("请将鼠标指向防沉迷弹窗, 然后按 shift + alt + 鼠标右键"); }, undefined, ], [ "👉万能规则(不保证实用性)", () => { GM_setValue("使用万能规则", Math.random()); }, undefined, ], [ checkValue("停用快捷键") + " 停用快捷键", () => { setValue("停用快捷键", "0", () => { registerMenuCommand(); }); }, undefined, ], [ "👍 给个好评/📝 反馈问题", () => { GM_openInTab( "https://greasyfork.org/zh-CN/scripts/437233/feedback" ); }, undefined, ], [ "⛔解决访问错误", () => { location.href = location.href; }, undefined, ], [ "⛔7k7k强制登录", () => { location.href = "http://www.7k7k.com/swf/204220.htm#fai-doLogin"; }, undefined, ], ]; lastMenuId = lastMenuId || 0; // TM for ( let menuId = lastMenuId - menus.length * 2; menuId < lastMenuId + menus.length * 2; menuId++ ) { GM_unregisterMenuCommand(menuId); } // VM menus.forEach(menu => { GM_unregisterMenuCommand(menu[0]); }); GM_unregisterMenuCommand("✅已启用 停用快捷键"); GM_unregisterMenuCommand("❌已停用 停用快捷键"); GM_unregisterMenuCommand("⚠️配置错误 停用快捷键"); menus.forEach(menu => { const displayName = menu[0]; const func = menu[1]; const accessKey = menu[2]; lastMenuId = GM_registerMenuCommand(displayName, func, accessKey); }); } function hideGame() { log(["大人来了"]); try { popupStyle.remove(); log(["已去除样式"]); } catch (err) {} popupStyle = GM_addStyle( '*{margin:0;padding:0}ul{list-style:none;}.fl{float:left;}.fr{float:right;}.mysdkDialog{position:absolute;left:50%;top:50vh;margin:-210px 0 0 -309px;width:618px;z-index:20020}.mysdkDialog .myfcmdialog{color:black;position:absolute;left:0;top:0;width:620px;padding-bottom:30px;font-family:"microsoft yahei";font-size:14px;background:#fff;border-radius:8px;}.mysdkDialog .myfcmdialog .close-btn{position:absolute;right:0;top:0;width:40px;height:40px;background-color:red;line-height:40px;cursor:pointer;display:none}.mysdkDialog .myfcmdialog .title{line-height:30px;text-align:center;font-size:22px;font-weight:700;padding:25px 0 0;margin:0 40px;color:#454545;border:0;height:auto;float:none;width:auto;text-indent:0;}.mysdkDialog .myfcmdialog .stitle{text-align:left;line-height:1.6;margin:15px 40px 0;font-size:16px;}.mysdkDialog .myfcmdialog .stitle span{color:#ffa92d;}.mysdkDialog .myfcmdialog .mod-tip{margin:20px 40px 0;background:#F0F0F0;padding:12px 15px;border-radius:4px;color:#333;text-align:left}.mysdkDialog .myfcmdialog .tip-title{font-size:16px;font-weight:400;}.mysdkDialog .myfcmdialog .tip-info{margin-top:5px;line-height:26px;font-size:14px;}.mysdkDialog .myfcmdialog .tip-info li{font-size:16px;line-height:26px}.mysdkDialog .myfcmdialog .tip-info a{color:#FAA61B;text-decoration:underline;margin:0 4px;cursor:pointer;}.mysdkDialog .myfcmdialog .mod-btn{text-align:center;font-size:0;line-height:0;margin:25px 40px 0;}.mysdkDialog .myfcmdialog .mod-btn .btn-fcmprimary{display:inline-block;width:140px;height:38px;line-height:38px;border:1px solid #69bb01;color:#69bb01;font-size:14px;margin:0 15px;border-radius:5px;cursor:pointer;}.mysdkDialog .myfcmdialog .mod-btn .fr,.mysdkDialog .myfcmdialog .mod-btn .fl{width:250px;margin:0;}.mysdkDialog .myfcmdialog .mod-btn .btn-fcmprimary:hover{-webkit-filter:brightness(1);filter:brightness(1)}.mysdkDialog .myfcmdialog .mod-btn .btn-identity{background-color:#69bb01;color:#f8ffef}.fcmIframe{position:absolute;left:50%;top:270px;margin:0 0 0 -309px;width:618px;height:354px;z-index:2019;border:0 none;background-color:#000}.countDown{background:#eee;border-radius:3px;padding:10px;text-align:center;margin:20px 40px 0;font-size:16px;color:#666}.countDown .txt1{font-size:16px;height:28px;line-height:28px;color:#717171;}.countDown .txt2{height:40px;line-height:40px;font-size:26px;font-weight:bold;color:#54ba3d;}.mycmMask{display:none;width:100%;position:absolute;left:0;top:0;background:rgb(0,0,0);}' ); const popup = document.createElement("div"); popup.className = "mysdkDialog"; popup.innerHTML += '
关闭

未成年限制登录提醒

您使用的是未成年账号,仅周五、周六、周日及法定节假日晚上8:00-9:00可以游戏!当前已被限制!

下次可玩游戏时段

本周五晚上8:00-9:00

温馨提示:

更换账号确定
'; document.body.appendChild(popup); const mask = document.createElement("div"); mask.className = "mycmMask"; mask.style.cssText = "height: " + document.documentElement.offsetHeight + "px; z-index: 9999; display: block"; mask.innerHTML = ""; document.body.appendChild(mask); } function crackAnti() { let /** @type {(() => void)[]} */ rule; Object.keys(rules).forEach(ruleName => { if (gamePlatform.includes(ruleName)) rule = rules[ruleName]; }); if (succeeded || !rule) { return log(["破解被取消或未匹配规则"]); } const begin = new Date().getTime(); for (const func of rule) { try { func(); if (succeeded) break; } catch (e) { console.error(e); } } log(["破解结束, 用时" + (new Date().getTime() - begin) + "ms"]); } function removeMask() { try { for (let i = 0; i < blackList.length; i++) { const element = blackList[i]; qsa(element)?.forEach(el => { el.remove(); log(["-破解成功- " + element]); }); } [".mycmMask", ".myfcmdialog", ".mysdkDialog"].forEach(element => { qsa(element)?.forEach(el => { el.remove(); log(["-解除大人来了成功- " + element]); }); }); try { popupStyle.remove(); log(["已去除样式"]); } catch (err) {} } catch (err) { console.error(err); } } // 添加加样式表 if (!devConfig.DisableAutomaticCracking) { let css = ""; for (let i = 0; i < blackList.length; i++) { const element = blackList[i]; css += element + ","; } css += `#qwqawaqaq { display: none !important; min-width: 0 !important; width: 0 !important; max-width: 0 !important; min-height: 0 !important; height: 0 !important; max-height: 0 !important; z-index: -999 !important; font-size: 0 !important; overflow: hidden !important; }`; GM_addStyle(css); log(["添加样式表成功"]); } if (devConfig.exportVariables) { unsafeWindow.exportVariables = () => { // GM_* unsafeWindow._GM_addStyle = GM_addStyle; unsafeWindow._GM_getValue = GM_getValue; unsafeWindow._GM_info = GM_info; unsafeWindow._GM_notification = GM_notification; unsafeWindow._GM_openInTab = GM_openInTab; unsafeWindow._GM_registerMenuCommand = GM_registerMenuCommand; unsafeWindow._GM_setValue = GM_setValue; unsafeWindow._GM_unregisterMenuCommand = GM_unregisterMenuCommand; // 普通变量 unsafeWindow._D = D; unsafeWindow._lastMenuId = lastMenuId; unsafeWindow._succeeded = succeeded; unsafeWindow._devConfig = devConfig; unsafeWindow._blackList = blackList; // 自定函数 unsafeWindow._setValue = setValue; unsafeWindow._initStorage = initStorage; unsafeWindow._checkValue = checkValue; unsafeWindow._registerMenuCommand = registerMenuCommand; unsafeWindow._hideGame = hideGame; unsafeWindow._crackAnti = crackAnti; unsafeWindow._removeMask = removeMask; unsafeWindow._popupStyle = popupStyle; }; unsafeWindow.exportVariables(); } // 一些不着急执行的代码 setTimeout(() => { GM_addValueChangeListener("使用万能规则", () => { useGeneralRules(); }); // 快捷键 document.addEventListener( "mousedown", e => { if (GM_getValue("停用快捷键") == "0") { if (e.button == 1 && e.shiftKey && !e.altKey) { hideGame(); } if (e.button == 2 && e.shiftKey && e.altKey) { let el = document.elementFromPoint(e.x, e.y); log([ "-手动破解成功- ." + el.className + " #" + el.id + " <" + el.tagName + ">", ]); el.style.display = "none"; } if (e.button == 1 && e.altKey && !e.shiftKey) { succeeded = 0; crackAnti(); removeMask(); } } }, true ); if (location.host === "www.7k7k.com") { try { document.querySelector("div.login_no").title = "✨防沉迷终结者支持7k7k强制登录, 请移步至脚本菜单"; } catch (e) {} if (location.href.includes("fai-doLogin")) document .querySelector("div.login_no > div.h_login.login_btn > span") .click(); } if (qs("script[src*='chpenmljpdpkebnohfbbdpfelabcnlnp']")) { GM_registerMenuCommand( "⚠️您已经安装了防沉迷终结者浏览器扩展, 不推荐二者同时使用" ); } registerMenuCommand(); }); addEventListener("DOMContentLoaded", () => { pageLoaded = true; setTimeout(() => { qsa("canvas").forEach(element => { element.addEventListener( "mousedown", e => { if (GM_getValue("停用快捷键") == "0") { if (e.button == 1 && e.shiftKey) { hideGame(); } if (e.button == 1 && e.altKey) { succeeded = 0; crackAnti(); removeMask(); } } }, true ); }); }, 5000); }); addEventListener("load", () => { !devConfig.DisableAutomaticCracking && crackAnti(); }); !devConfig.DisableAutomaticCracking && crackAnti(); log(["脚本执行完毕, 用时" + (new Date().getTime() - D.getTime()) + "ms "]);