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
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
========================
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\""
}
========================
这是当未在WebContents或会话级别设置用户代理时使用的用户代理。这对于确保您的整个应用具有相同的用户代理很有用。在应用程序的初始化中尽早设置为自定义值,以确保使用您的覆盖值。
Source:电子文档