禁用鼠标离开网页/窗口失焦监听

通过多种方式阻止网页检测鼠标离开页面、窗口失去焦点或页面可见性变化,并包含活动模拟,旨在保护用户操作不被意外中断或记录。

作者
MyOxygen U're
今日安裝
3
安裝總數
29
評價
0 0 0
版本
0.4.2
建立日期
2025-04-01
更新日期
2025-05-04
尺寸
8.0 KB
授權條款
AGPL3.0
腳本執行於

脚本说明:禁用鼠标离开网页/窗口失焦监听

禁用鼠标离开网页/窗口失焦监听脚本


注意事项:这是一个浏览器用户脚本,需要配合 Tampermonkey 或 Greasemonkey 等用户脚本管理器使用。
此脚本旨在通过技术手段阻止网页检测用户鼠标是否离开、窗口是否失焦或页面可见性变化,并模拟用户活动,
以防止在某些场景下(如在线学习、考试)因切换窗口、最小化窗口或长时间不操作而导致学习进度暂停、弹出提示甚至被记录为消极行为。
请仅在您有权使用的网站上合理使用此脚本。由于网页技术不断更新,网站可能会采取新的反制措施,脚本效果可能随时间推移受影响,未来可能需要更新。
此脚本主要根据 <code>@match</code> 规则应用于特定的学习平台和网站(如学习通、中国大学MOOC等),您可以通过编辑脚本的 <code>@match</code> 规则来增删适用的网站地址。

功能说明:


  1. 拦截特定事件监听器被添加 (addEventListener 拦截)


    脚本在页面自身的 JavaScript 代码有机会添加事件监听器之前(利用 <code>@run-at document-start</code>),
    通过重写 <code>EventTarget.prototype.addEventListener</code> 方法,
    对尝试向 <code>window</code> 或 <code>document</code> 对象添加的事件监听器进行拦截。
    如果事件类型属于需要阻止的列表(<code>mouseout</code>, <code>mouseleave</code>, <code>blur</code>, <code>focusout</code>, <code>visibilitychange</code>),
    则阻止其添加。这是一种主动防御手段,确保相关检测逻辑无法通过标准事件监听器实现。


  2. 伪造页面可见性状态 (Page Visibility API 属性重写)


    脚本通过 <code>Object.defineProperty</code> 方法,重写了 <code>document</code> 对象上与页面可见性相关的属性。
    <ul>
    <li>强制 <code>document.visibilityState</code> 属性始终返回 'visible'。</li>
    <li>强制 <code>document.hidden</code> 属性始终返回 <code>false</code>。</li>
    <li>同时处理了浏览器可能使用的带前缀的属性 (如 <code>webkitVisibilityState</code>, <code>mozHidden</code> 等)。</li>
    </ul>
    这使得依赖 Page Visibility API 检测用户是否切换标签页或最小化窗口的网站无法获取真实状态,从而“认为”页面始终在前台可见。


  3. 伪造文档焦点状态 (<code>document.hasFocus()</code> 方法重写)


    脚本重写了 <code>document.hasFocus</code> 方法,使其无论何时被调用,都强制返回 <code>true</code>。
    这针对那些使用此方法来判断当前文档是否拥有焦点(即窗口是否激活)的网站检测机制。


  4. 阻止旧式 <code>window.onblur</code> / <code>window.onfocus</code> 等属性赋值


    为了兼容一些使用旧式事件处理代码的网站,脚本通过 <code>Object.defineProperty</code> 将 <code>window.onblur</code>、<code>window.onfocus</code>、<code>window.onfocusout</code> 和 <code>window.onfocusin</code> 等属性设为不可写且其值为 <code>null</code>。
    这可以阻止页面脚本通过直接给这些属性赋值的方式来设置窗口失焦/聚焦的事件处理函数。


  5. 定期模拟鼠标移动事件 (用户活动模拟)


    脚本设置了一个定时器(默认为每 30 秒),通过 <code>dispatchEvent</code> 方法在页面的 <code>document</code> 对象上触发一个模拟的 <code>mousemove</code> 事件。
    虽然这不直接阻止窗口失焦检测,但这种模拟的用户活动(鼠标移动)可能有助于欺骗一些基于用户输入设备长时间无活动来判断用户是否闲置或离开的检测机制。

初始化:

脚本已在页面加载初期(<code>document-start</code> 阶段)成功运行,并完成了对相关事件监听和属性的修改。您可以查看浏览器开发者工具的控制台(如果脚本的 <code>DEBUG</code> 设为 <code>true</code>)获取更多日志信息。