Bogdan
ну опции не обязательно
GamiD
не по координатам хрень полная
🅰️nimeCoder
проблема еще в том, что анонимизация, фингерпринт и антидетект это противоположные вещи. Если мы хотим замаскировать бота, то желательно чтоб айпи было нормальное, куки и тд.
если хочется замаскировать бота, то нужно брать девтулзы в зубы и делать без веб драйвера, а прокси брать с большим пулом и ротацией. по типу netnut.io с оплатой по трафику. Правда если брать резиденские прокси, то цены там соответствующие, начиная от $ 300 за 20 гб на 30 дней
Назар
если хочется замаскировать бота, то нужно брать девтулзы в зубы и делать без веб драйвера, а прокси брать с большим пулом и ротацией. по типу netnut.io с оплатой по трафику. Правда если брать резиденские прокси, то цены там соответствующие, начиная от $ 300 за 20 гб на 30 дней
«девтулзы в зубы» можно пример? А прокси я думаю мне не нужно. Конкретно в моем случае я не прячу никак юзера, мне вполне подходит, чтоб сайт понимал, что это реальный я. Нужно только бота замаскировать. (пока не получилось на 100%, иногда ловят, не знаю почему)
🅰️nimeCoder
Ну обычно открывается панель разработчика, и отладчик / вкладка network, ставятся breakpoint'ы на потенциальные места. Например если это регистрация, открываешься консоль ставится presist logs, делаешь регистрацию, смотришь network, находишь запрос с введенными данными, если все просто и шифров нету - повторяешь, в ином же случае на основании формата запроса делаешь глобальный поиск по JS, находишь точку отправки, смотришь как формируется запрос, если же код обфусцирован, ставишь брейкоинты, и смотришь пошагово, что как там происходит / меняешь данные «на лету» Обычно почти все сайты очень простые, даже если там есть какой то антифрод, исключение крупные компании по типу alibaba (и все ее детища типа taobao и прочих сайтов которые использую Alibaba cloud и их технологии), ну или какой нибудь тикток (в прочем все то китайские сервисы) особенно в мобильных приложениях у них часто валом говна и шифров
🅰️nimeCoder
Источники запроса можно смотреть в вкладке стектрейса
Назар
ну это понятно, и я делал даже, ничего не нашел. А без вебдрайвера это как?
🅰️nimeCoder
ну это вот и без вебдрайвера)
🅰️nimeCoder
а что ты не нашел?
Sasha
Народ. А есть ли какие аналоги proxy-chain чтобы была возможность кешировать ssl трафик через расшифровку и подпись своим сертификатом?
Назар
а что ты не нашел?
вообще ничего не нашел. Там мало джс кода на том сайте, не знаю как ловят. Это онлайн игра, я думаю они просто видят что 1 комп играет 24х7 и на основании этого банят.
Назар
еще может потому что я не сижу в игре просто на открытой вкладке, а открываю игру, делаю дела и закрываю. Как бот кароче
GamiD
Можно выбрать select по index?
GamiD
Bogdan
Array.from(….)[index]
GamiD
Array.from(….)[index]
Ничего не дало =)
Bogdan
код покажи
GamiD
код покажи
<select id="selectID"> <option value=”GR”>Green</option> <option value=”YE”>Yellow</option> <option value=”BL”>Black</option> </select>
Bogdan
ну парсишь как?
GamiD
ну парсишь как?
var elements = await page.$x('//select');
Bogdan
await page.evaluate(() => Array.from(document.getElementById('selectID').options)[INDEX]))
GamiD
А без evaluate можно?
Bogdan
через get property
Bogdan
https://pptr.dev/#?product=Puppeteer&version=v14.4.0&show=api-jshandlegetproperties
Bogdan
https://pptr.dev/#?product=Puppeteer&version=v14.4.0&show=api-elementhandlegetproperties
GamiD
Спасибо
GamiD
await page.evaluate(() => Array.from(document.getElementById('selectID').options)[INDEX]))
await page.evaluate(self, index => {self.options(index);}, elements[atnumber], index) Вот так правильно будет?
GamiD
Array.from обязателен?
Bogdan
попробуй
Bogdan
по индексу не помню но .map например не будет работать без Array.from
Bogdan
индекс тоже поидеи не будет
Bogdan
только в начале попробуй лучше как я написал, а уже потом передавай параметром селект
Bogdan
и return не забудь)
GamiD
Не выбирает
GamiD
document.getElementById('selectvalue').options[3].selected=true
GamiD
Вот так правильно будет
GamiD
document.getElementById('selectvalue').options.selectedIndex=1 или так
Bogdan
document.getElementById("cars").options[1]
Bogdan
попробовал так работает
GamiD
document.getElementById("cars").options[1]
у меня не выбрал select
Bogdan
кстати да в таких случаях Array.from не нужен, это когда наприме Array.from($(‘ul > li’)).map(x => ….)
GamiD
const element = await page.$x("//div[@class='RNNXgb']"); await element.screenshot({path: 'google.png'});
GamiD
Что тут не так?
GamiD
Bogdan
$x -> возвращает array
Bogdan
const [element] = await page.$x("//div[@class='RNNXgb']");
Bogdan
попробуй
GamiD
await element[0].screenshot({path: './google.png', type: 'jpeg'});
GamiD
вот так работает
GamiD
Как сделать click если iframe внутри iframe? С помощью frame.click
GamiD
https://mosburnfat.biz/test2/index.html Вот пример как кликнуть внутри сайта logrocket
GamiD
var iframeHandle1 = await page.$('iframe#frame1'); var contentFrame1 = await iframeHandle1.contentFrame(); var iframeHandle2 = await contentFrame1.$('iframe#frame2'); var contentFrame2 = await iframeHandle2.contentFrame(); Есть другой метод кроме этого?
Roman
var iframeHandle1 = await page.$('iframe#frame1'); var contentFrame1 = await iframeHandle1.contentFrame(); var iframeHandle2 = await contentFrame1.$('iframe#frame2'); var contentFrame2 = await iframeHandle2.contentFrame(); Есть другой метод кроме этого?
Попробуй использовать метод puppeter - waitForFrame. Он возвратит фрейм и ты сможешь с ним работать, как с page const frame = await page.waitForFrame(async (frame) => { return frame.name() === 'Test'; });
Roman
в итоге получиться по этой же схеме
через page.frames() не пробовал?
Roman
Есть пример?
В первой строчке гугла https://www.tabnine.com/code/javascript/functions/puppeteer/Page/frames
Bogdan
А если frame внутри frame как показал в примере
Ну вначале войди в первый фрейм а из него дёрни второй фрейм таким же образом
GamiD
GamiD
Как переключиться между вкладками?
GamiD
Так же закрыть вкладку по index
GamiD
Как переключиться между вкладками?
Не работать с другими вкладками а именно переключиться так же как и руками перейдешь нажатием на вкладку
GamiD
const page1 = await browser.newPage(); await page1.goto('https://www.google.com'); const page2 = await browser.newPage(); await page2.goto('https://www.bing.com'); await page1.bringToFront(); await page2.bringToFront(); await page1.bringToFront();
GamiD
Нашел такой вариант но он не совсем подходит под мои задачи
GamiD
Нужно чтоб работал именно с одним page в selenium переключался так window_list = driver.window_handles driver.switch_to_window(window_list[index])
GamiD
Придумал вот такое решение var page2 = await browser.newPage(); var page = page2 await page.bringToFront(); await page.goto('https://www.google.com'); var page3 = await browser.newPage(); var page = page3 await page.bringToFront(); await page.goto('https://yandex.ru');
GamiD
Щас вопрос другой как переключиться к другой вкладке который открылся через click target="black"
GamiD
Нашел решение вдруг кому нужно будет var pages = await browser.pages(); var page = await pages[0] await page.bringToFront(); var page = await pages[1] await page.bringToFront(); Таким образом можно переключиться на любую вкладку по index
Британец
Посоветуйте книги по node js
Британец
Хотя наверно не по node js а просто js
Alhimik
Не работать с другими вкладками а именно переключиться так же как и руками перейдешь нажатием на вкладку
На заметку: это будет работать только в хэдфул режиме. В хэдлес режиме все вкладки считаются активными. События focus/blur/pageshow/pagehide/visibilitychange не будут генерироваться.
GamiD
Как работать с браузером в несколько потоков? Когда браузер не активный не кликается пока не будет активным что можно с этим сделать?