Nodejs Electron 中使用 webRequest.onBeforeRequest 重定向请求 URL 失败

发布于 1周前 作者 h691938207 来自 nodejs/Nestjs

Nodejs Electron 中使用 webRequest.onBeforeRequest 重定向请求 URL 失败

如题,我想用 Electron 中 webRequest.onBeforeRequest 重定向某个网站的 swf 资源。之前用 Chrome 插件实现时,用 chrome.webRequest.onBeforeRequest.addListener 成功达到想要的效果,但是用 Electron 实现时,console.log(“Test Passed.”)这句话可以被正常触发,但是最终加载的资源却仍然是原地址的资源。

const { app, BrowserWindow } = require('electron')
const { resolve } = require('path')
app.commandLine.appendSwitch('ppapi-flash-path', resolve(__dirname, 'pepflashplayer64_32_0_0_314.dll'))
app.commandLine.appendSwitch('ppapi-flash-version', '32.0.0.314')

function createWindow() {
    win = new BrowserWindow({
		autoHideMenuBar: true,
		show: false,
		fullscreen: false,
		webPreferences: {plugins: true}
	})
	win.maximize()
	win.webContents.openDevTools()
	win.webContents.session.webRequest.onBeforeRequest(async ({url}, callback) => {
		var reg = new RegExp("http://<source-domain>/test~[0-9]*.swf", 'g')
		if(reg.test(url)) console.log("Test Passed.")
		callback(reg.test(url) ? {redirectURL: "http://<target-domain>/test.swf"} : {})
	})
	win.loadURL('http://<source-domain>')
    win.on('closed', () => {win = null})
}
app.on('ready', createWindow)

2 回复

把调试输出那句注释掉就 work 了,神奇。


在 Node.js 和 Electron 中使用 webRequest.onBeforeRequest 来重定向请求 URL 时,如果遇到失败的情况,通常可能是因为配置不正确或者某些细节被忽略。以下是一个基本的示例代码,展示如何正确配置 webRequest.onBeforeRequest 来重定向 URL。

首先,确保你已经在 Electron 主进程中引入了 session 模块,并使用了 webRequest 拦截器。

const { app, BrowserWindow, session } = require('electron');

app.on('ready', () => {
    const mainWindow = new BrowserWindow({ webPreferences: { nodeIntegration: true } });

    const filter = {
        urls: ['*://*/*'] // 拦截所有请求
    };

    session.defaultSession.webRequest.onBeforeRequest(filter, (details, callback) => {
        if (details.url.includes('old-url')) {
            // 重定向到新的 URL
            callback({ redirectURL: 'https://new-url.com' });
        } else {
            // 允许请求继续
            callback({});
        }
    });

    mainWindow.loadURL('https://example.com');
});

在上述代码中,我们创建了一个 Electron 应用,并在主进程中设置了 webRequest.onBeforeRequest 监听器。这个监听器会检查请求的 URL 是否包含 'old-url',如果包含,则将其重定向到 'https://new-url.com'。否则,请求将继续进行。

如果重定向失败,请检查以下几点:

  1. 确保 filter 配置正确,能够匹配到你想要拦截的 URL。
  2. 确保 details.url 中包含你期望的字符串。
  3. 检查是否有其他中间件或代理影响了请求。
  4. 查看 Electron 和 Node.js 的版本是否兼容。
回到顶部