Null
Null
Если интересно, то вот так он получает список доступных пакетов:
https://dl.google.com/linux/chrome/deb/dists/stable/main/binary-amd64/Packages
Вот прямая ссылка на пакет:
https://dl.google.com/linux/chrome/deb/dists/stable/pool/main/g/google-chrome-beta/google-chrome-beta_123.0.6312.28-1_amd64.deb
Null
👨💻
Есть ли способ установить рандомный список шрифтов в инстанс браузера пупетира ?
https://pixelscan.net
Выдает мне мои 55 шрифтов, что скорее всего в винде или стандартным браузером установленено.
И чёт сколько не пытался, не могу понять, как обычные шрифты то рандомить при запуске браузера
Marto
всем привет. Ищу человека кто может написать скрипт под автоматический логин и валидацию данных с обратным ответом на мой сервер. Готов платить $$ за решение, просьба написать в ЛС
👨💻
page.on('request', async interceptedRequest => {
if (interceptedRequest.url() === 'https://url.com') {
console.log(interceptedRequest.response())
const responseJson = interceptedRequest.response();
data.push(responseJson);
}
interceptedRequest.continue();
});
как можно дождаться ответа от реквеста в новой версиси пупетира ?
чет как-то в доке жуть какая-то непонятная. Не получилось ее переварить
Виталий
👨💻
page.on('response', async (responce) => {
if (responce.url() === 'https://urltowait.com') {
console.log(responce.status())
const data = await responce.text()
console.log(data)
}
}) ну вроде как мне responce.status() выдает статусы 200, но при этом
const data = await responce.text() не отрабатывает, вызывая ошибку
ProtocolError: Could not load body for this request. This might happen if the request is a preflight request.
Как такое решить можно ?
Captain Maslori
Captain Maslori
могу быть неправ т.к. puppeteer не трогал уже давно
👨💻
Captain Maslori
👨💻
/
так как переменная называется пофигу, они не влияет на результат)
Captain Maslori
Я обратного и не говорил
Погуглил, да, я неправ, там объект ответа должен быть
Captain Maslori
Для дебага советую объект ответа целиком посмотреть, а не только на статус
Статус-код ничего не гарантирует, это зависит от конкретного сайта
👨💻
👨💻
Captain Maslori
👨💻
Captain Maslori
👨💻
👨💻
CdpHTTPResponse {}
CdpHTTPResponse {}
CdpHTTPResponse {}
CdpHTTPResponse {}
а потом я ищу че это за штука такая и вижу надпись
/* Excluded from this release type: CdpHTTPResponse */
И понимаю, что обречен. тип нафига вообще включать какие-либо данные и класс. тупо отрубить его с концами
Null
Null
Preflight-запросы имеют метод OPTIONS. Поэтому тебе нужно проверить его, например так:
page.on("response", async (res) => {
const method = res.request().method();
console.log(`method: ${method}`);
switch (method) {
case "OPTIONS":
// no body
break;
case "GET":
const text = await res.text();
console.log(`Response body len: ${text.length}`);
break;
case "POST":
// ...
break;
}
});
Null
Так же тебе выдаст ошибку, если ты попытаешься получить тело у редиректа: 'Response body is unavailable for redirect responses'.
Можно сделать проверку:
if (isRedirect(res)) {
return;
}
// ...
function isRedirect(res) {
for (const key in res.headers()) {
if (key.toLowerCase() == "location") {
return true;
}
}
return false;
}
Или так:
if (res.request().redirectChain().length > 0) {
return;
}
👨💻
я пока столкнулся с тем, что у class HTTPRequest нет метода ожидания ответа, а у class HTTPResponse нет проверки на метод.
то есть приходится городить через слушатели как раз сложную логику.
У меня прикол в том, что сначала как раз идет option запрос, а потом post запрос. И все пытаюсь отследить именно post запрос.
А post запрос от long-polling запрос. То есть либо сразу ошибка приходит, либо 1-2 минуты ждет и получает ответ.
И нельзя тупо сделать
const finalResponse = await page.waitForResponse(
response =>
response.url() === waitingUrl && response.method() === "POST" // method() отсутствует тупо. то есть так нельзя.
)
поэтому пришлось городить вот так
const finalResponse = await page.waitForResponse(
response =>
response.url() === waitingUrl && response.status() === 422
, {
timeout: 3000
})
.catch((error: TimeoutError) => error); чисто по статусу. А есть все же лонг полинг идет, то просто напросто тайммаут срабатывает
👨💻
👨💻
есть какие-это эффективные способы удаления текста из textarea ?
export async function clearText(page: Page) {
const textarea = await page.$('textarea[data-testid="test-text-area"]')
await textarea?.click({count: 3})
await textarea?.press('Backspace')
} такое вот оформил, но не уверен, что это лучшее решение
Null
Null
Андрей
Всем привет, кто-то с wildberries через puppeteer работал, есть там у них какие-то защиты?
Eugene
Привет. Есть скрипты на puppeteer, которые крутятся на лямбдах. Задача скриптов - делать скрины всех входящих писем на 3 почтовых сервисах.
Проблемы:
- проверка ящиков инициируется кроном, а не в момент, когда приходит письмо. Из-за этого лямбда бегает в холостую, а время ожидания между пришедшим письмом и скрином может быть долгим
- возникают проблемы со скринами. не всегда хватает нужную область. Есть проблемы с непрогрузкой изображний писем, соответсвенно кривые скрины получаются на выходе
Идеальный сценарий:
- лямбда ранается, когда в почте новое письмо
- если есть пробелма с прогрузкой, перезагрузка страницы
- если что-то упало, то письмо проходится повторно следующей лямбдой (сейчас чекаются только непрочитанные, а упасть может в момент прочтения и назад в непрочитанное не вернется)
Ищу человека, кто возьмет текущее решение и допилит до ума. Сделает его максимально стабильным. Естественно за обговариваемое заранее вознаграждение
gud3
Как вариант слушать через imap+socks входящие, при поступлении нового письма бросать ивент в sqs на триггер которого будет заасайнена лямбда.
Либо более не надёжный: всегда держать горячую сессию. Тобиш уйти с лямбды на сервер, где под каждый аккаунт будет свой браузер 24/7 обновлять страницу. Тут можно без очередей, лямбд и триггеров сразу делать скрин.
Aleksey
всем привет!
Кто-нибудь сталкивался с ситуацией, когда единственный инстанс браузера открывается с параметром --incognito, но при открытие новой страницы все равно приводит к открытию неинкогнито а обычного браузера, в котором и открывается новая вкладка?
Slavik
Aleksey
Зачем тебе режим не инкогнито?
Мне как раз он и не нужен, мне нужен режим инкогнито. Забил на открытие новой страницы, просто стал юзать ту, которая по умолчанию в режиме инкогнито открывается - этого хватило для решения задачи.
Slavik
Ребят, как я могу очистить кэш браузера и могу ли вообще это сделать?
Captain Maslori
xpath почти не знаю, но мне кажется что селектор прописан в неправильном формате (а конкретно его начало)
NO WAR!
NO WAR!
Всем привет.
Буквально сегодня начал изучать Puppeteer, поэтому прошу понять и простить.
Пытаюсь залогиниться на сайте при помощи Puppeteer. Ввожу мэйл, нажимаю кнопку, страница перебрасывает на капчу. Капчу пройти не могу, всегда пишет "неправильный ответ".
Пытаюсь залогиниться через Гугл (есть такая опция). Открывается окно с Гуглом, ввожу руками мэйл, нажимаю кнопку "Далее", Гугл пишет "возможно браузер небезопасен. Попробуйте другой браузер".
Как это обойти и залогиниться?
Sasha
Начать с решения капчи. Ловить её и пересылать в сервис решения.
👨💻
NO WAR!
Народ, нужно написать достаточно простое приложение. Думал даже сам справлюсь, но чувствую что на капчу потрачу слишком много времени.
Если кто-то готов взяться, пишите в личку.
👨💻
Сергей
try {
const selector = "#checkDoc > form > div.row > div.col-md-4 > label > img.captchaImg";
await frame.waitForSelector(selector);
const captchaElement = await frame.$(selector);
if (captchaElement) {
const capchaImg = await captchaElement.screenshot({ encoding: "base64", type: "png" });
const file = "capcha.png";
const path = appRootDir + '\\data\\sanction\\' + file;
fs.writeFileSync(path, Buffer.from(capchaImg, 'base64'));
} else {
console.error('Элемент не найден');
}
} catch (error) {
console.error('Ошибка при создании скриншота:', error);
}
Подскажите, почему screenshot не фокусируется на селекторе, а вместо этого скриншотит середину страницы.
Null
Null
try {
const selector = "#checkDoc > form > div.row > div.col-md-4 > label > img.captchaImg";
await frame.waitForSelector(selector);
const captchaElement = await frame.$(selector);
if (captchaElement) {
const capchaImg = await captchaElement.screenshot({ encoding: "base64", type: "png" });
const file = "capcha.png";
const path = appRootDir + '\\data\\sanction\\' + file;
fs.writeFileSync(path, Buffer.from(capchaImg, 'base64'));
} else {
console.error('Элемент не найден');
}
} catch (error) {
console.error('Ошибка при создании скриншота:', error);
}
Подскажите, почему screenshot не фокусируется на селекторе, а вместо этого скриншотит середину страницы.
Попробуй так:
const frameElement = await frame.frameElement();
const frameBox = await frameElement.boundingBox();
const elementBox = await captchaElement.boundingBox();
await frameElement.screenshot({
path: "screen.png",
clip: {
x: elementBox.x - frameBox.x,
y: elementBox.y - frameBox.y,
width: elementBox.width,
height: elementBox.height,
},
});
👨💻
кто-нибудь запускал puppeteer в docker ?
столкнулся с подобной задачей, но пока чет не нашел никаких решений этого
Aleksey
👨💻
Запускал
есть какие-то гайды, как это правильно сделать ?
Aleksey
есть какие-то гайды, как это правильно сделать ?
Делайте отдельный образ, который крутит браузер и присоединяйтесь к нему с другой тачки через puppeteer connect(...)
Чтобы прям совсем не заморачиваться, просто скачайте browserless образ - там уже все настроено для этого
Aleksey
https://hub.docker.com/r/browserless/chrome
👨💻
👨💻
вообще штука прикольная. Не ожидал, что настолько все легко тут будет. Установил в докер и параметр browserWSEndpoint оставил. И работай сиди.
Спасибо большое!
👨💻
но есть другая проблема))
👨💻
import puppeteer from 'puppeteer-extra';
из puppeteer extra делаю все штуки, поскольку использую много аддонов из этой либы. Но у нее просто нет такого параметра 🥲
Aleksey
Aleksey
Скачайте ее и присоединяйтесь к инстансу
Aleksey
Просто надо юзать не лаунч() а коннект()
👨💻
а как в таком случае быть с некоторые характеристиками, которые прописывались при старте ?
допустим тот же timeout
👨💻
да уж, кажется это большая проблема. Нигде нет стартовых options
👨💻
👨💻
Назар
это в документации докер image или хрома нужно искать.
Назар
https://docs.browserless.io/Docker/docker#connection-timeout
👨💻
👨💻
да уж, количество сервисов в yml файле все растет и растет
👨💻
немного тут поглядел, законектится не может в общем.
А где пробемы понять не могу.
мой ymlfile такой вот
services:
browserless:
image: browserless/chrome
restart: always
ports:
- "9222:3000"
environment:
PUPPETEER_EXECUTABLE_PATH: /usr/bin/chromium-browser
TIMEOUT: 999999999999
networks:
- pictures_picture-generating-network
parsebot:
build: ./parsebot
restart: always
# have a single instance of the parsebot service accessible on multiple ports
ports:
- "3060-3200:3060"
environment:
server_host: server
serverport: 3060
instances: 5
BROWSERLESS_CHROME: ws://browserless:9222
networks:
- pictures_picture-generating-network
depends_on:
- browserless
- server
что-то в нем неправильно ?
Назар