Electron框架下如何向网页伪造可检测的屏幕分辨率?
解决Electron中伪造网页检测到的屏幕分辨率问题
我来给你分享几个靠谱的方法,帮你在Electron里伪造网页能检测到的屏幕分辨率,亲测有效:
方法1:通过预加载脚本重写screen对象(推荐,安全且稳定)
预加载脚本会在网页加载前运行,能安全地覆盖浏览器原生的screen属性,而且符合Electron的安全最佳实践(开启上下文隔离)。
首先创建一个预加载文件preload.js:
// 重写screen的核心属性,伪造你想要的分辨率 Object.defineProperty(window.screen, 'width', { get: () => 1920 // 自定义虚假宽度 }); Object.defineProperty(window.screen, 'height', { get: () => 1080 // 自定义虚假高度 }); // 别忘了覆盖可用区域属性,很多网页会检测这个 Object.defineProperty(window.screen, 'availWidth', { get: () => 1920 }); Object.defineProperty(window.screen, 'availHeight', { get: () => 1040 // 模拟减去任务栏后的高度,更真实 });
然后在主进程的BrowserWindow配置里指定这个预加载脚本(记得先引入path模块):
const { BrowserWindow } = require('electron'); const path = require('path'); let win = new BrowserWindow({ width: 900, height: 800, webPreferences: { preload: path.join(__dirname, 'preload.js'), contextIsolation: true, // 开启上下文隔离,安全最佳实践 nodeIntegration: false } }); win.on('closed', () => { win = null }); win.loadURL("http://***.com/detail.asp?bhcp=1");
方法2:在页面加载时注入脚本直接覆盖
如果不想单独写预加载文件,可以监听网页的加载事件,直接在页面上下文注入代码修改screen属性:
const { BrowserWindow } = require('electron'); let win = new BrowserWindow({ width: 900, height: 800, webPreferences: { contextIsolation: false // 注意:关闭上下文隔离会降低安全性,仅在必要时使用 } }); // 在网页开始加载时注入修改代码 win.webContents.on('did-start-loading', () => { win.webContents.executeJavaScript(` // 伪造分辨率属性 Object.defineProperty(window.screen, 'width', { get: () => 1280 }); Object.defineProperty(window.screen, 'height', { get: () => 720 }); Object.defineProperty(window.screen, 'availWidth', { get: () => 1280 }); Object.defineProperty(window.screen, 'availHeight', { get: () => 680 }); `); }); win.on('closed', () => { win = null }); win.loadURL("http://***.com/detail.asp?bhcp=1");
额外注意点
- 有些网页可能会用其他API检测屏幕信息(比如
window.devicePixelRatio),如果需要的话,你可以在上述脚本里一并覆盖这个属性:Object.defineProperty(window, 'devicePixelRatio', { get: () => 1 }); - 方法1的上下文隔离模式更安全,建议优先使用;方法2关闭了上下文隔离,存在一定安全风险,适合临时测试场景。
内容的提问来源于stack exchange,提问作者ibamboo




