Как подменить IP сервера в запросах puppeteer?
Имеется какой либо сайт и puppeteer.
Как перехватить определенные запросы? И сделать тоже самое, что делает файл hosts в операционных системах, т.е. перенаправить запрос на другой сервер без модификаций его параметров.
Я пробовал что-то вроде такого, но не получилось:
let puppeteer = require('puppeteer');
puppeteer.launch({headless: false}).then(async(browser) => {
const page = await browser.newPage();
const ip = '192.168.100.110';
await page.setRequestInterception(true).then(async() => {
await page.setRequestInterception(true);
page.on('request', async (request) => {
const url = new URL(request.url());
if (request.url().includes('sub.example.org')) {
request.continue({
url: `http://${ip}${url.pathname}`,
headers: {
'Host': url.host //Вызывает ошибку
}
});
} else {
request.continue();}
});
await page.goto('https://sub.example.org', {
timeout: 0,
waitUntil: ['networkidle0','load']
});
});
})
UPD: код обновлен, но есть проблемы с исключением net::ERR_INVALID_ARGUMENT при попытке замены хоста.
Ответы (1 шт):
Автор решения: nörbörnën
→ Ссылка
// @ts-check
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
headless: false,
ignoreHTTPSErrors: true,
args: [
'--disable-setuid-sandbox',
'--no-sandbox',
'--disable-web-security'
]
});
const page = await browser.newPage();
await page.setRequestInterception(true);
page.on('request', (request) => {
if (request.url().includes('cs.pikabu.ru')) {
const url = new URL(request.url());
url.protocol = 'http';
url.host = '5.187.0.220';
request.continue({
url: url.toString(),
headers: {
referer: 'cs.pikabu.ru',
}
});
} else {
request.continue();
}
});
await page.goto('https://pikabu.ru', {
timeout: 0,
waitUntil: ['networkidle0', 'load']
});
})();