Electron设置User-Agent

44次阅读
没有评论

webContents | Electron

方法 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 团队出于以下原因移除了该选项:

  1. ​安全性​​:防止恶意代码通过 webPreferences 注入伪造的 UA。
  2. ​一致性​​:强制开发者使用更明确的 webContents 或 session API。
  3. ​维护成本​​:减少 webPreferences 的冗余配置项。

在 Electron 中,webPreferences​不能直接设置 userAgent​,但可以通过其他方式修改 User-Agent。以下是 ​​正确方法​​ 和 ​​常见误区​​:


​✅ 正确方法:使用 sessionwebContents 设置 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​​,避免踩坑!🚀

正文完
 0
wujingquan
版权声明:本站原创文章,由 wujingquan 于2025-06-04发表,共计4063字。
转载说明:Unless otherwise specified, all articles are published by cc-4.0 protocol. Please indicate the source of reprint.
评论(没有评论)