方法 1:通过 webContents.setUserAgent()
(动态、推荐)
const win = new BrowserWindow();
win.webContents.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36');
win.loadURL('https://www.xianyu.com'); // 必须在 loadURL 前调用!
或
mainWindow.loadURL('https://www.wujingquan.com/', {
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0'
})
注意:这种设置方式,只是针对当前Window,如果新开窗口,比方<a href="https://example.com" target="_blank">Example</a>
那么新开的窗口就Electron默认的UserAgent
尝试过以下两种动态方式来设置UserAgent均无效
webContents.setWindowOpenHandler
来拦截新窗口的打开并设置UserAgent方式(无效)
mainWindow.webContents.setWindowOpenHandler(({ url }) => {
return {
action: 'allow', // 允许新窗口打开
overrideBrowserWindowOptions: {
webPreferences: {
// 这里可以设置新窗口的 webPreferences
nodeIntegration: false,
contextIsolation: true,
userAgent: '...' // 无效,会报错
},
},
};
});
监听新窗口创建事件,并在加载前设置 UserAgent(无效)
mainWindow.webContents.on('did-create-window', (newWindow) => {
console.log('新窗口', newWindow)
newWindow.webContents.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0');
newWindow.loadURL('https://www.baidu.com'); // 可选:如果需要在创建后加载 URL
});
方法 2:通过 session
全局设置
const { session } = require('electron');
app.whenReady().then(() => {
session.defaultSession.webRequest.onBeforeSendHeaders((details, callback) => {
details.requestHeaders['User-Agent'] = '你的UA字符串';
callback({ requestHeaders: details.requestHeaders });
});
});
partition 隔离问题
使用 partition 时(如 persist:xianyu),会创建独立的会话存储,可能导致默认的 webRequest 监听失效。
session 作用域错误
在非默认会话(如自定义 session.fromPartition())中注册 webRequest 时,可能未正确覆盖目标请求。
非默认会话监听,需要正确关联session和partition
如果必须用 partition
,需在 同一会话 中注册监听器:
const customSession = session.fromPartition('persist:xianyu');
app.whenReady().then(() => {
// ✅ 在自定义会话中注册监听
customSession.webRequest.onBeforeSendHeaders(
{ urls: ['*://*.xianyu.com/*'] },
(details, callback) => {
details.requestHeaders['User-Agent'] = 'Mozilla/5.0 (你的UA)';
callback({ requestHeaders: details.requestHeaders });
}
);
});
// 创建窗口时指定相同的 session
new BrowserWindow({
webPreferences: {
session: customSession, // 关键!使用匹配的 session
partition: 'persist:xianyu'
}
});
验证步骤
检查监听器是否注册到正确会话
console.log('当前会话:', session.defaultSession === customSession); // 应为 false
打印所有活跃会话(调试用)
console.log('所有会话:', session.getAllSessions());
方法 3:通过 webPreferences.userAgent
全局设置(该方法在Electron10已经废弃)
const win = new BrowserWindow({
width: 1200,
height: 800,
webPreferences: {
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', // 设置 User-Agent
},
});
废弃方法:
❌ 为什么 webPreferences.userAgent
不再有效?
Electron 团队出于以下原因移除了该选项:
- 安全性:防止恶意代码通过
webPreferences
注入伪造的 UA。 - 一致性:强制开发者使用更明确的
webContents
或session
API。 - 维护成本:减少
webPreferences
的冗余配置项。
在 Electron 中,webPreferences
不能直接设置 userAgent
,但可以通过其他方式修改 User-Agent
。以下是 正确方法 和 常见误区:
✅ 正确方法:使用 session
或 webContents
设置 User-Agent
1. 在 BrowserWindow
加载前设置(推荐)
const { app, BrowserWindow } = require('electron');
app.whenReady().then(() => {
const win = new BrowserWindow({
webPreferences: { /* 其他配置 */ }
});
// ✅ 正确:在加载URL前设置 User-Agent
win.webContents.setUserAgent('你的User-Agent字符串');
win.loadURL('https://www.xianyu.com');
});
2. 全局修改默认 User-Agent
(适用于所有窗口)
const { session } = require('electron');
app.whenReady().then(() => {
// ✅ 修改所有窗口的默认 User-Agent
session.defaultSession.webRequest.onBeforeSendHeaders((details, callback) => {
details.requestHeaders['User-Agent'] = '你的User-Agent字符串';
callback({ requestHeaders: details.requestHeaders });
});
});
❌ 常见误区
1. 错误:在 webPreferences
中直接设置 userAgent
// ❌ 错误:webPreferences 中没有 userAgent 选项
const win = new BrowserWindow({
webPreferences: {
userAgent: '...' // 无效!会报错
}
});
报错信息:TypeError: Invalid value for webPreferences: userAgent
2. 错误:在 loadURL
之后设置 User-Agent
const win = new BrowserWindow();
win.loadURL('https://www.xianyu.com');
win.webContents.setUserAgent('...'); // ❌ 太晚了,已加载页面
问题:
此时修改 User-Agent
对 已加载的页面无效,必须 在 loadURL
前调用。
📌 总结
场景 | 正确方法 |
---|---|
单个窗口修改 User-Agent | win.webContents.setUserAgent() 在 loadURL 前调用 |
全局修改所有窗口的 User-Agent | session.defaultSession.webRequest 拦截请求头 |
无效方法 | webPreferences: { userAgent: ... } (直接报错) |
按照上述方法,你可以 正确设置 Electron 的 User-Agent,避免踩坑!🚀