电子块中的用户代理要求对特定域的请求 我正在构建一个基于自定义的电子浏览器,并为某些域动态修改用户代理。但是,在从用户代理中删除电子/\*以获取特定演示游戏网络...

问题描述 投票:0回答:1

main.js

这样修改了这样的用户代理:

session.defaultSession.webRequest.onBeforeSendHeaders((details, callback) => { const originalUserAgent = details.requestHeaders['User-Agent']; const newUserAgent = getUserAgentForURL(originalUserAgent, details.url); console.log('========================'); console.log('Intercepted Request:'); console.log('URL:', details.url); console.log('Original User-Agent:', originalUserAgent); console.log('Modified User-Agent:', newUserAgent); console.log('========================'); details.requestHeaders['User-Agent'] = newUserAgent; callback({ cancel: false, requestHeaders: details.requestHeaders }); });

输出输出:

当我尝试访问演示游戏网站时,我会收到以下日志:

user-agent.js

,但是,该网站不会加载并在控制台中抛出JavaScript错误:

const { app } = require('electron');

const REMOVE_ELECTRON_COMPONENTS = [
  / Electron\/([^\s]+)/g,  // Removes Electron
  ` ${app.name}/${app.getVersion()}`, // Removes app-specific info
];

function getUserAgentForURL(userAgent, url) {
  if (typeof userAgent !== 'string') {
    console.error(`Error: Expected userAgent to be a string, but got ${typeof userAgent}`);
    return userAgent || 'Mozilla/5.0';
  }

  let componentsToRemove = [...REMOVE_ELECTRON_COMPONENTS];

  // Remove Electron-specific components but keep Chrome
  componentsToRemove.forEach((x) => {
    if (userAgent) {
      userAgent = userAgent.replace(x, '');
    }
  });

  return userAgent;
}

module.exports = { getUserAgentForURL };

当我不修改用户代理时,该网站运行完美,并发送以下成功请求: ======================== Intercepted Request: URL: https://[removed-domain]/game-assets/other_resources.json Original User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) my-electron-app/1.0.0 Chrome/132.0.6834.159 Electron/34.0.2 Safari/537.36 Modified User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.6834.159 Safari/537.36 ========================

我如何成功修改用户代理?
update

I使用“ Chrome的用户代理切换器”扩展程序测试了修改用户代理。但是,游戏仍然没有加载,表明Chrome忽略了扩展的更改。
UPON进一步调查,我发现了DevTools中的“使用浏览器默认用户代理”设置→网络条件:

开放的DevTools(F12)→网络选项卡。 单击Wi-Fi图标(左下)。 找到默认情况下启用的“使用浏览器默认用户代理”。 此设置会导致不一致,因为请求使用修改后的用户代理,但是浏览器继续使用其内部默认值,可能会使JavaScript代码感到困惑。
解决这个:

CHINGECKECKECKECT“使用浏览器默认用户代理”。 手动输入修改后的用户代理。 重新加载了游戏→它工作正常。 问题: 由于此设置由Chromium控制,因此我们如何在电子中自动禁用“浏览器默认用户代理”?

电子/铬中有命令行旗或API以覆盖此设置吗?

I发现Chromium在内部强迫默认的用户代理,从而在请求和浏览器的JavaScript运行时引起不一致。修复程序是设置

[96308:0201/114327.613:INFO:CONSOLE(5657)] "Uncaught TypeError: Cannot read properties of undefined (reading 'split')", source: https://[removed-domain]/build.js (5657) [96308:0201/114327.616:INFO:CONSOLE(18588)] "Uncaught TypeError: Cannot read properties of null (reading 'length')", source: https://[removed-domain]/logo_info.js (18588)

,我在电子文档中遇到了这一点。这是一种打击的方法,但奏效了。

======================== Intercepted Request: URL: https://[removed-domain]/gs2c/ge/v4/game Method: POST Headers: { "host": "[removed-domain]", "connection": "keep-alive", "content-length": "145", "accept": "*/*", "accept-encoding": "gzip, deflate, br, zstd", "accept-language": "en-US", "content-type": "application/x-www-form-urlencoded", "origin": "https://[removed-domain]", "referer": "https://[removed-domain]/gs2c/html5Game.do?extGame=1&symbol..", "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "same-origin", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) my-electron-app/1.0.0 Chrome/132.0.6834.159 Electron/34.0.2 Safari/537.36", "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\"", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": "\"Windows\"" } ========================

javascript electron user-agent browser-detection http-toolkit
1个回答
0
投票
一个是用户代理字符串电子的字符串将用作全局后备。

这是当未在WebContents或会话级别设置用户代理时使用的用户代理。这对于确保您的整个应用具有相同的用户代理很有用。在应用程序的初始化中尽早设置为自定义值,以确保使用您的覆盖值。

Source:
电子文档

© www.soinside.com 2019 - 2025. All rights reserved.