如何在Electron中自动禁用Chromium的“使用浏览器默认User-Agent”设置以修复特定网站加载失败问题
我来帮你解决这个问题!从你的排查过程能看出来,核心矛盾是:你通过webRequest修改了网络请求的User-Agent,但Electron(Chromium)内部页面环境里的navigator.userAgent还是默认带Electron标识的版本——这两个UA不一致,才导致网站JS处理时出现split、length这类报错。手动关闭DevTools的“使用浏览器默认User-Agent”本质上是让页面使用你自定义的UA,和网络请求保持统一。
下面给你几个自动实现UA统一的可靠方案,比去修改DevTools设置更稳定:
方案1:创建窗口时直接设置全局自定义UA(推荐)
这是最省心的方法,直接在创建BrowserWindow时指定自定义UA,这样网络请求和页面内部navigator.userAgent会完全一致,从根源避免不一致问题。
修改你的窗口创建代码,在webPreferences里加入userAgent配置:
const { BrowserWindow, app } = require('electron'); const { getUserAgentForURL } = require('./user-agent'); function createMainWindow() { // 先生成你需要的自定义UA(可以针对目标网站提前生成,或者用默认规则) const baseUA = app.userAgentFallback; const targetUA = getUserAgentForURL(baseUA, 'https://你的目标游戏网站.com'); const mainWindow = new BrowserWindow({ width: 1200, height: 800, webPreferences: { userAgent: targetUA, // 这里直接设置自定义UA nodeIntegration: false, // 按你的需求配置其他webPreferences contextIsolation: true } }); mainWindow.loadURL('https://你的目标游戏网站.com'); } app.whenReady().then(createMainWindow);
这样设置后,所有网络请求和页面JS获取到的UA都是同一个,不需要再单独修改webRequest的请求头(当然如果需要动态修改不同网站的UA,可以结合方案2)。
方案2:动态根据URL修改UA(多网站适配场景)
如果你的应用需要给不同网站设置不同UA,可以结合webContents.setUserAgent和webRequest拦截,确保每次导航时,页面内部UA和网络请求UA同步:
const { BrowserWindow, session } = require('electron'); const { getUserAgentForURL } = require('./user-agent'); function createMainWindow() { const mainWindow = new BrowserWindow({ width: 1200, height: 800, webPreferences: { nodeIntegration: false, contextIsolation: true } }); // 1. 监听导航事件,提前设置页面UA mainWindow.webContents.on('will-navigate', (event, url) => { const baseUA = app.userAgentFallback; const modifiedUA = getUserAgentForURL(baseUA, url); mainWindow.webContents.setUserAgent(modifiedUA); }); // 2. 保留你的webRequest拦截,确保网络请求UA和页面UA一致 session.defaultSession.webRequest.onBeforeSendHeaders((details, callback) => { const originalUA = details.requestHeaders['User-Agent']; const modifiedUA = getUserAgentForURL(originalUA, details.url); details.requestHeaders['User-Agent'] = modifiedUA; callback({ cancel: false, requestHeaders: details.requestHeaders }); }); mainWindow.loadURL('https://你的初始网站.com'); }
这个方案会在每次页面导航前,动态设置当前页面的UA,同时网络请求也用同一个UA,完美解决不一致的问题。
为什么不推荐修改DevTools设置?
Chromium本身没有公开的命令行开关或Electron API直接控制DevTools的“使用浏览器默认User-Agent”选项——这个是DevTools的用户偏好设置,存储在本地的用户数据目录里,路径和键名可能随Electron/Chromium版本变化,稳定性很差。所以优先保证UA全局统一才是根本解决思路。
结合你之前的测试结果:用Chrome插件修改UA无效,也是因为插件可能只修改了网络请求UA,而页面内部UA还是默认的,导致同样的不一致问题。而你手动修改DevTools设置后,页面UA和网络请求UA同步了,所以游戏正常加载,这也验证了我们的结论。
备注:内容来源于stack exchange,提问作者August

