You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动