interceptBufferProtocol已弃用,我将如何利用protocol.handle来拦截http和https?

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

在我的电子应用程序中,我想创建一个验证码收割机弹出窗口,我遇到了一个 git 存储库,特别是这个 https://github.com/sashapisdets/Captcha-Solver 并且在克隆后新鲜,它可以工作很好,但问题是,它使用的是非常旧的 Electron 版本,而我的个人应用程序使用的是最新版本。 Harvester 中的一个主要核心功能是它拦截 http 协议并有一个回调来显示 html,但是在新版本的 Electron 中,interceptBufferProtocol 已被弃用并被 .handle 取代,但无论我做什么,我都可以似乎无法使用protocol.handle拦截http协议,有人对我如何更新它有任何想法吗?

原创功能

function SetupIntercept() {
    protocol.interceptBufferProtocol('http', (req, callback) => {
        if(req.url == 'https://www.google.com/recaptcha/api2/demo') {
            fs.readFile(__dirname + '/captcha.html', 'utf8', function(err, html){
                callback({mimeType: 'text/html', data: Buffer.from(html)});
            });
        }else{
            const request = net.request(req)
            request.on('response', res => {
                const chunks = []
    
                res.on('data', chunk => {
                    chunks.push(Buffer.from(chunk))
                })
    
                res.on('end', async () => {
                    const file = Buffer.concat(chunks)
                    callback(file)
                })
            })
    
            if (req.uploadData) {
                req.uploadData.forEach(part => {
                    if (part.bytes) {
                        request.write(part.bytes)
                    } else if (part.file) {
                        request.write(readFileSync(part.file))
                    }
                })
            }
    
            request.end()
        }
    })
};

更新功能

function SetupIntercept() {
    protocol.handle('http', async (req) => {
        if (req.url === 'http://supremenewyork.com/') {
            try {
                const html = await fs.promises.readFile(__dirname + '/captcha.html', 'utf8');
                return {
                    mimeType: 'text/html',
                    data: Buffer.from(html),
                };
            } catch (err) {
                console.error('Error reading captcha.html:', err);
                return {
                    mimeType: 'text/plain',
                    data: Buffer.from('Error loading page'),
                };
            }
        } else {
            return new Promise((resolve, reject) => {
                const request = net.request(req);
                request.on('response', (res) => {
                    const chunks = [];
        
                    res.on('data', (chunk) => {
                    chunks.push(Buffer.from(chunk));
                    });
        
                    res.on('end', () => {
                    const file = Buffer.concat(chunks);
                    resolve({ data: file });
                    });
        
                    res.on('error', (error) => {
                    console.error('Error in response:', error);
                    reject({
                        mimeType: 'text/plain',
                        data: Buffer.from('Error loading page'),
                    });
                    });
                });
        
                if (req.uploadData) {
                    req.uploadData.forEach((part) => {
                    if (part.bytes) {
                        request.write(part.bytes);
                    } else if (part.file) {
                        request.write(readFileSync(part.file));
                    }
                    });
                }
        
                request.end();
            });
        }
    });
}
javascript node.js electron
1个回答
0
投票

我自己找到了解决方案,因为interceptBufferProtocol已被弃用,您可以使用

protocol.handle('http, (req) => {})

或者如果您正在使用分区

session.protocol.handle('http, (req) => {})

你也更新这个

return {
   mimeType: 'text/html',
   data: Buffer.from(html),
};

return new Response(Buffer.from(html), { headers: { 'Content-Type': 'text/html' } });
© www.soinside.com 2019 - 2024. All rights reserved.