Ruslan
Ruslan
Всем спасибо за попытку помочь
Светлана
Приветы
чет навскидку не гуглится, ну или у меня руки не из плеч:
можно ли модифицировать ответы с некоторых урлов? не заменять полностью, а именно немножко допиливать напильником?
по голому requestfinished с интерсепшном валится по ТО, без интерсепшна - логично матерится, что «дэвушка, он мне нужен», если на request смотреть, то там response еще null. Самой из ноды кинуть - там оч жестко ориджины ограничены.
можно, конечно, открыть вторую вкладку, кинуть оттуда фетч, доставать ответ и радоваться, но это звучит как тот еще костыль
вдруг я просто какой ивент не знаю, который сделает мне хорошо (=
Bogdan
Приветы
чет навскидку не гуглится, ну или у меня руки не из плеч:
можно ли модифицировать ответы с некоторых урлов? не заменять полностью, а именно немножко допиливать напильником?
по голому requestfinished с интерсепшном валится по ТО, без интерсепшна - логично матерится, что «дэвушка, он мне нужен», если на request смотреть, то там response еще null. Самой из ноды кинуть - там оч жестко ориджины ограничены.
можно, конечно, открыть вторую вкладку, кинуть оттуда фетч, доставать ответ и радоваться, но это звучит как тот еще костыль
вдруг я просто какой ивент не знаю, который сделает мне хорошо (=
ничего не понял
🦋noteee
Приветы
чет навскидку не гуглится, ну или у меня руки не из плеч:
можно ли модифицировать ответы с некоторых урлов? не заменять полностью, а именно немножко допиливать напильником?
по голому requestfinished с интерсепшном валится по ТО, без интерсепшна - логично матерится, что «дэвушка, он мне нужен», если на request смотреть, то там response еще null. Самой из ноды кинуть - там оч жестко ориджины ограничены.
можно, конечно, открыть вторую вкладку, кинуть оттуда фетч, доставать ответ и радоваться, но это звучит как тот еще костыль
вдруг я просто какой ивент не знаю, который сделает мне хорошо (=
Как с puppeteer дела обстоят не подскажу, а так вообще ты поднимаешь express локально, как системные прокси указываешь адрес до express.
Все запросы с браузера теперь идут на express. Модифицируешь их и отправляешь далее, куда они изначально должны были пойтищс помощью fetch.
Будет проблема, что https сайты не будут работать. Как исправить — не знаю. Возможно самоподписной ssl сертификат. Мне не помог. Решишь проблему - отпишись пожалуйста
Bogdan
Alhimik
Приветы
чет навскидку не гуглится, ну или у меня руки не из плеч:
можно ли модифицировать ответы с некоторых урлов? не заменять полностью, а именно немножко допиливать напильником?
по голому requestfinished с интерсепшном валится по ТО, без интерсепшна - логично матерится, что «дэвушка, он мне нужен», если на request смотреть, то там response еще null. Самой из ноды кинуть - там оч жестко ориджины ограничены.
можно, конечно, открыть вторую вкладку, кинуть оттуда фетч, доставать ответ и радоваться, но это звучит как тот еще костыль
вдруг я просто какой ивент не знаю, который сделает мне хорошо (=
Можно.
1. Перехватываешь запрос
2. Делаешь запрос сторонним http-клиентом (url + headers у тебя уже есть)
3. Делаешь req.respond() и подставляешь туда заголовки ответа + тело (модифицируешь при необходимости)
🦋noteee
Alhimik
Приветы
чет навскидку не гуглится, ну или у меня руки не из плеч:
можно ли модифицировать ответы с некоторых урлов? не заменять полностью, а именно немножко допиливать напильником?
по голому requestfinished с интерсепшном валится по ТО, без интерсепшна - логично матерится, что «дэвушка, он мне нужен», если на request смотреть, то там response еще null. Самой из ноды кинуть - там оч жестко ориджины ограничены.
можно, конечно, открыть вторую вкладку, кинуть оттуда фетч, доставать ответ и радоваться, но это звучит как тот еще костыль
вдруг я просто какой ивент не знаю, который сделает мне хорошо (=
await page.setRequestInterception(true);
page.on("request", async (req) => {
if (req.method() === "GET" && req.url().endsWith(".js")) {
const res = await needle("GET", req.url(), {
headers: req.headers(),
});
const newBody = 'console.log(1);';
// модифицируем заголовки при необходимости
res.headers["content-length"] = Buffer.from(newBody, "utf8").length;
await req.respond({
status: 200, // тоже нужно взять из ответа нашего клиента
contentType: 'application/javascript; charset=utf-8', // и это
body: newBody,
headers: res.headers,
});
} else {
await req.continue();
}
});
Bogdan
а какой лучший способ импортировать либу в evaluate?
Bogdan
Bogdan
интересно в целом
Bogdan
я щас тоже через cdn кидаю, без него нельзя никак?)
Bogdan
путь до либы нужно в ином случае указывать в зависимостях?
Alhimik
Alhimik
Если у тебя локальный файл.
Alhimik
Alhimik
Например, вот два эквивалентных подключения (но один в сети, второй локальный файл):
await page.addScriptTag({
url: "https://cdn.jsdelivr.net/npm/underscore@1.13.4/underscore-umd-min.js",
});
await page.addScriptTag({
path: "./underscore-umd-min.js",
});
Alhimik
Попробовал на example.com, оба варианта работают. Но если попробовать на ya.ru, к примеру, то там из-за CSP нельзя подключить. Нужно с заголовками шаманить.
Bogdan
вообще лучше в evaluate не кидать зависимости похоже, но у меня легаси уже…
Bogdan
промежуточные результаты лучше каждый раз забирать на ноду из evaluate
Bogdan
и там уже либы и тд
Alhimik
Ну вообще да, я не смог придумать для чего бы мне могли понадобиться либы внутри evaluate.
Bogdan
WEB
Коллеги, доброго утра!
Подскажите пожалуйста, как мне загрузить файл если это <a>text</a>, а не импут
Bogdan
Bogdan
Хотя нельзя и hidden и file одновременно. Значит file тип ищи, возможно там display none стоит
WEB
Коллеги, подскажите, я использую waitForSelector но замечаю, что интерфейс еще не прогрузился, но из-за того, что код уже есть, то puppeteer уже выполняет дальше по алгоритму, как мне например сделать после того, как он выждал селектор еще паузу поставить, например 2-3 секунды или пока не отоброзится интерфейс?
Alex*
Коллеги, подскажите, я использую waitForSelector но замечаю, что интерфейс еще не прогрузился, но из-за того, что код уже есть, то puppeteer уже выполняет дальше по алгоритму, как мне например сделать после того, как он выждал селектор еще паузу поставить, например 2-3 секунды или пока не отоброзится интерфейс?
Может быть не по феншую, но часто выручает банальное:
while (condition || true){
if ( element появился или другие условия ) {
делаем, что-то или break;
}
}
WEB
я могу в await page.focus использовать full xpath ?
WEB
WEB
за ответ
Alex*
Alex*
один page.waitForTimeout - не всегда хорошо работают
Alex*
Alex*
1
Действительно, не выдаст ошибку 👍
Alex*
Еще это удобно в том случае, когда сложно ( или лень )) ) подобрать селектор для элемента из массива с похожими атрибутами, но все таки разными. Тогда делаешь page.$$(".blabla") и уже массив выбранных элементов препарируешь и выбираешь нужный.
WEB
Вот еще какой вопрос. Я использую focus() чтобы вписать, но дело в том, что я в фокус указываю селекторы, которые на странице существуют 2 шт, мне нужно не в первую, а во вторую, как мне реализовать, чтобы обратиться именно ко второй, нужно указать порядковый номер как в массиве по сути?
WEB
Или мне в самому фокусе указывать порядковый номер
WEB
по типу selector:nth-child(2)
Alex*
const elements = await page.$$(selectorElemens)
console.log(elements[1])
WEB
он не будет жаловаться? а то я похожую конструкцию делал
WEB
мне жаловался мол не может присвоить
Alex*
Я думаю можно сразу без focus
await element.type('string')
WEB
ааа даже так, спасибо
Alex*
Для моего примера
await elements[1].type('string')
Alex*
Если элементы не совсем идентичны, желательно проверить атрибуты элемента.
Alex*
Например, виден ли он
Alex*
const buttonRequest_ = await page.$(buttonRequest)
const isVisibleHandle = await page.evaluateHandle((e) => {
const style = window.getComputedStyle(e);
return (style && style.display !== 'none' &&
style.visibility !== 'hidden' && style.opacity !== '0');
}, buttonRequest_);
WEB
@ppirks Спасибо, помогло!
Angga
Hello good morning all
Angga
I want to ask you, how to use puppeteer to open whatsapp web (keep signin user after close). Currently, i have problem with scan QR again every apps shutdown (In case development mode)
Angga
Any idea?
artem
ребята как я могу установить скорость печати в пупетире быстрее чем самая стандартная меня интересует?
Bogdan
artem
Копи паст типо?
ну можно и копи паст только чтобы это происходило локально в браузере
artem
не комбинацией клавиш получается
artem
я такого не нашел
artem
просто хотел type delay менять а он стандартный вроде и так самый низкий поэтому быстрее печатать его заставить не получается
Bogdan
await setSelectVal('#select_id', 'newValue')
Bogdan
Вроде так
Bogdan
Попозже могу точно сказать
artem
ну это он контент меняет в штмл элементе
artem
а мне надо именно эмулировать клавиатуру
Bogdan
Да там можно было через Клавиатуру. Я просто не помню на память.
Bogdan
Вроде так page.keyboard.sendCharacter(text)
Bogdan
artem
artem
работает как надо, спасибо
Slava
Добрый вечер. Помогите с кодом? Пытаюсь увязать puppeteer, каптчу vk и сервис anti-captcha.com.
Вот так работает API Anticaptch'и:
const captcha = fs.readFileSync('captcha.png', { encoding: 'base64' });
ac.solveImage(captcha, true)
.then(text => console.log('captcha text: '+text))
.catch(error => console.log('test received error '+error));
вот так я пытаюсь получить тело картинки, присланной ВК, изнутри evaluate:
const captcha = await tab.evaluate((fs, captchaUrl) => {
let result = fs.readFileSync(captchaUrl, {encoding: 'base64'});
return result;
}, fs, captchaUrl);
получаю Error: Evaluation failed: TypeError: fs.readFileSync is not a function
гуглил-перегуглил, ничего не подошло
Slava
Вот доки API Антикаптчи
https://anti-captcha.com/ru/apidoc/task-types/ImageToTextTask