Slavik
Это скрипт
Murod
(function(){ window._cf_chl_opt={ cvId: '3', cZone: 'challenges.cloudflare.com', cTplV: 5, chlApivId: '0', chlApiWidgetId: 'kz1ae', chlApiSitekey: '0x4AAAAAAAVrOwQWPlm3Bnr5', chlApiMode: 'managed', chlApiSize: 'normal', chlApiRcV: '1/ULFbROfiTVNV4oY', chlApiTimeoutEncountered: 0, chlApiOverrunBudgetMs: 10000, chlTimeoutMs: 120000, cK: "visitor-time", cType: 'chl_api_m', cNounce: '20835', cRay: '893fda3e1ca69924', cHash: '591096e64a06eb5', cFPWv: 'g', cLt: 'n', cRq: { ru: 'aHR0cDovL2NoYWxsZW5nZXMuY2xvdWRmbGFyZS5jb20vY2RuLWNnaS9jaGFsbGVuZ2UtcGxhdGZvcm0vaC9nL3R1cm5zdGlsZS9pZi9vdjIvYXYwL3JjdjAvMC9rejFhZS8weDRBQUFBQUFBVnJPd1FXUGxtM0JucjUvYXV0by9ub3JtYWw=', ra: 'TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NDsgcnY6MTI3LjApIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvMTI3LjA=', rm: 'R0VU', d: 'jPx1A69x0xRlL2dSDMIW3VvDZjLpPX2FfU+ZYSCxOGoFqxc2NGxiKTQDXl6P9pEGmex9JzK8AUMGfQHqnnhwmpXeyzpS5SYj0d/SuIWMxQRTdEs+ZIy5JJiPZpQ5iSe+BNU/BFOosPcHv7eVnk1NI+tHHpeW6eghRUZ8DDDt4YfmN5SjFAqTr+VUQg5jTQhM0MpU+ZoRWztYCztA6P6noOJNm1XgUxT7iWwgGrwj1LPuWS2GyYQHIU9qw2s4YZUSs+jgDjrDhNKtOFkaJA/p0LEaWRBfH5TX1S0jIk93wgmw7E4HuRAIDsIQAv0jvexzJtxMUykWi4qr8TlJ5+t3DVKWLHRXA+XB/AvhPto/w8QvRtDDy0icmjL86kxEfdcw2Ljfz7VmhG9HShl95C/5HCMTv72HL1H0BdODvSmFsQRYaqnGKWYZ/CIMEydjXRuAsWu7ALCCjLstmK83e2smKUMqWzseLW2VsPPUQ+LRWaOAB3XARnrucUzXGyiv2zM91tSz5prI10Mx/DuDJ0y4vh4VVGl1JA7ZF1zGc7csoTeU25z0p+u+vZ8Q28lL4WAShB275ymIrA7SSZK0IayFdTnjrvlFbpExpfAMPFQyRXep1zsDEQlGlY8xGvJBNzU5jYczVMHyG7uzPdNztNeZJdDlf/qrkdVilQM/E9YGZyMsHsOJcOBeN/hjZJXuvBY86GJ7JC7uhVyBSBqTmM3l0ff16rZ6McVkCfmtmRM0OsIFMBFOZPqHNABXSi78WaI0tw+CEo/A0OdkWvPp6quwid9jQBzVQzbre1VTdXFuIRg=', t: 'MTcxODQyNjExNi44Mjc=', m: 'i8hez2XqzQxa5c7whBGkoJbKgrJq5VnpJUlte/6Ifz4=', i1: 'oyHtJgZ6IC++KHXwejkfIQ==', i2: 'SENg6TyJ0ZohGABikWcHbA==', uh: 'm9HTIG1MjO6HgIMNioWp91gU2l38tPvkTIRzmRdqdFM=', hh: 'WCiLdNo2uN2aXsfJJhG2HFkP3bOo0fw8tsFAppLisvs=', zh: '9D+zbxCfwBPyr1pF5Wb5E9kRItcGU2xCgzO1zGTKToQ=', }, refresh: function(){ if(window['parent']){ window['parent'].postMessage({ source: 'cloudflare-challenge', widgetId: 'kz1ae', nextRcV: '1/ULFbROfiTVNV4oY', event: 'reloadRequest', }, "*"); } } }; var handler = function(event) { var e = event.data; if (e.source && e.source === 'cloudflare-challenge' && e.event === 'meow' && e.widgetId === window._cf_chl_opt.chlApiWidgetId) { if(window['parent']){ window['parent'].postMessage({ source: 'cloudflare-challenge', widgetId: window._cf_chl_opt.chlApiWidgetId, event: 'food', seq: e.seq, }, "*"); } } } if (window.addEventListener) { window.addEventListener('message', handler); } else { window.attachEvent('onmessage', handler); } }());
@slavicck
Slavik
@slavicck
Так это все равно зашифровано
Slavik
Тип толку от того что ты вытащишь нет
Slavik
Если у тебя нет дешифратора
Murod
Если у тебя нет дешифратора
тогда что можно делать ?
Murod
В плане?
задача: - получить sitekey на странице - отправить запрос к 2captcha.com - заменить значение в cf-response-token - сделать submit form
Slavik
Если тебе просто вытащить символы шифрованные надо, то вот тебе строка window._cf_chl_opt ? window._cf_chl_opt.chlApiSitekey : null
Katerina
🔥Ищем Node.js разработчика🔥 с опытом автоматизации с использованием Puppeteer ‼️Обязанности: 🔝 Разработка, поддержка решений для автоматизации веб-страниц с использованием Puppeteer. 👀 Мониторинг, устранение неполадок и улучшение процессов автоматизации для повышения эффективности и надежности системы. ‼️Требования: ✨ 1 год коммерческого опыта в автоматизации с использованием Puppeteer. ✨ Подтвержденный опыт автоматизации, парсинга веб-страниц и извлечения данных с помощью Puppeteer. ✨ Уверенные навыки работы с базами данных, включая PostgreSQL. ✨ Умение программировать и писать скрипты на Node.js. ✨ Базовые навыки системного администрирования Linux. Будет плюсом: ➕ Опыт реверс-инжиниринга и анализа веб-приложений. Опыт работы с AWS. Знание NoSQL баз данных. Подтвержденный опыт преодоления систем защиты от ботов. Пиши нам @HR_Katerinaa
Elon
‼️Ищем в молодую команду: Node.js разработчика с опытом автоматизации с использованием Puppeteer, который готов расти и развиваться вместе с нами. 💠Обязанности: — Разработка, поддержка решений для автоматизации веб- страниц с использованием Puppeteer. — Мониторинг, устранение неполадок и улучшение процессов автоматизации для повышения эффективности и надежности системы. 🔸Требования: — 1 год коммерческого опыта в автоматизации с использованием Puppeteer. — Подтвержденный опыт автоматизации, парсинга веб- страниц и извлечения данных с помощью Puppeteer. — Уверенные навыки работы с базами данных, включая PostgreSQL. — Умение программировать и писать скрипты на Node.js. Базовые навыки системного администрирования Linux. 🔸Будет плюсом: — Опыт реверс-инжиниринга и анализа веб-приложений. — Опыт работы с AWS. — Знание NoSQL баз данных. — Подтвержденный опыт преодоления систем защиты от ботов. Заинтересовали? За подробностями пишите в личку - @yield_gg
Null
@HR_Katerinaa, @yield_gg, вы бы хоть объём работы и зарплатную вилку указали.
1
Подскажите, раньше такой вариант работал, массив селекторов await page.waitForSelector([sel1, sel2, sel3]) а в новых версия PPTR выдаёт ошибку if (selector.startsWith(prefix)) { TypeError: selector.startsWith is not a function
Лешка
селекторСтарВитз?
Лешка
я тебе что строка?
1
селекторСтарВитз?
Что-то поменялось в новых версия? В pptr 13 прекрасно работает такая связка, а в pptr 22 выдаёт ошибку.
Лешка
а при чем тут пупитр
Лешка
selector
Лешка
это что?
1
const sel1 = '#a1' const sel2 = '#a2' const sel3 = '#a3'
Лешка
if (selector.startsWith(prefix)) { TypeError: selector.startsWith is not a function
Лешка
тут селектор не строка
Лешка
стартвиз это метод строк
Captain Maslori
if (selector.startsWith(prefix)) { TypeError: selector.startsWith is not a function
автор вопроса подразумевает, что это ошибка не из его кода а из сурсов puppeteer, и она вызывана тем, что он в своем коде передал в waitForSelector не строку а массив (что удобно и раньше (с его слов) работало, а сейчас нет)
Лешка
а
Лешка
ну если так то обертку сделать можно
Лешка
Пример не приведёте?
async function waitSelectors(page: Page, selectors: string[]) { const promises = []; for (const selector of selectors) { promises.push(page.waitForSelector(selector)); } await Promise.all(promises); }
Лешка
не включал но логика такая
Лешка
попробуй в общем
Captain Maslori
посмотрел доку. ни в 15, ни в 22 такое поведение не заложено
предположу что какая-то библиотека использовалась
1
посмотрел доку. ни в 15, ни в 22 такое поведение не заложено
В 13 точно работает, до сих пор, сейчас попробовал обновить версию и столкнулся с такой ошибкой
Captain Maslori
посмотрел доку. ни в 15, ни в 22 такое поведение не заложено
но там прям типы в обеих прописаны что там должно быть что-то типа строки
Лешка
async function waitSelectors(page, selectors) { const promises = []; for (const selector of selectors) { promises.push(page.waitForSelector(selector)); } await Promise.all(promises); }
Лешка
если js
Captain Maslori
Пример не приведёте?
я лично устал бороться с api функциями-обертками и сделал свои классы-обертки на Browser и Page с новыми методами (что на самом деле упростило жизнь) но функцию предложил бы такую (page: Page, selectors: string[]) => Promise.all(selectors.map(s => page.waitForSelector(s))
1
Нашел ещё такой вариант const sel1 = '#a1' const sel2 = '#a2' const sel3 = '#a3' const watchDog = [ page.waitForSelector(sel1), page.waitForSelector(sel2), page.waitForSelector(sel3) ] await await Promise.race(watchDog)
Лешка
ты функцию хотел а не костыль
Лешка
помоему
Лешка
притом промис рейс вернет тебе промис
Лешка
тоесть он не будет ждать всех трех
1
Нужно дождаться любой из 3-х
Лешка
а ну тогда твой вариант)
1
Хрен знает, зачем они убрали такой вариант, просто и удобно было await page.waitForSelector([sel1, sel2, sel3])
Лешка
так сиди на 13 версии?
1
Решил в ногу со временем пойти и обновить версию, но поменять не проблема изменения, главное понять, где ёщё сюрпризы ждать
Null
Что-то поменялось в новых версия? В pptr 13 прекрасно работает такая связка, а в pptr 22 выдаёт ошибку.
Какая именно версия pptr стоит? В 13.0.0 (первая 13-ая) не вижу такого. В 13.7.0 (последняя 13-ая) тоже не вижу. Либо в доках не указывали такую возможность.
Desaparecer
Anyone know how to emulate a pull to refresh (touch) with Puppeteer?
Wudu
Привет всем. const fileChooser = await page.waitForFileChooser(); Почему то не срабатывает этот метод в ifame, открывает окно выбора файла и зависает на этом, далее просто выдает Waiting for `FileChooser` failed: 30000ms exceeded Пробовал оборачивать в Промис всё const [fileChooser] = await Promise.all([ frame.page().waitForFileChooser(), frame.click(selector),]); await fileChooser.accept([file]); Кто нибудь сталкивался или есть решение?
Лешка
ты не пробывал просто в инпут файл кидать
Лешка
Wudu
Там нет инпута =( На div повешан обработчик
Лешка
а если не верю
Лешка
// Getting the image file input element handle const fileInput = await page.$('input[type=file]'); // Preparing the image file to upload const fileToUpload = 'image.jpg'; // Uploading the image file await fileInput.uploadFile(fileToUpload);
Лешка
чото подобное использовал
Wudu
Лешка
https://hayageek.com/upload-file-with-puppeteer/
Лешка
тогда так попробуй
Лешка
посложнее конечно
Wudu
Всё равно встает, попробовал page.once('filechooser', async (fileChooser) => { await fileChooser.accept(['/path/to/file.txt']); });
Wudu
Yeah, it looks like newer file/directory dialog APIs are not really supported by CDP. The FileChooser only really supports the input[type=file] cases.
Wudu
Ммм, пока дочитал до этого, но похоже кукловод не поддерживает никакие вводы кроме input[type=file]
Лешка
Null
Ммм, пока дочитал до этого, но похоже кукловод не поддерживает никакие вводы кроме input[type=file]
Можешь создать песочницу с минимумом кода, чтобы повторить сценарий? Или есть публичная страница где-то, где можно посмотреть на проблему?
BЕLый
Всем привет, в firefox, с кастомным конфигом не отрабатывает page.authenticate, мб кто-то сталкивался или знает какие поля в настройках(pref.js) могут на это влиять?
BЕLый
Или кто-нибудь знает как авторизовать прокси без page.authenticate
Null
Или кто-нибудь знает как авторизовать прокси без page.authenticate
const puppeteer = require('puppeteer'); const proxyChain = require('proxy-chain'); async function main() { // Подготовка const realProxyUrl = 'http://user:pass@host:port'; const tempProxyUrl = await proxyChain.anonymizeProxy(realProxyUrl); // tempProxyUrl like "http://127.0.0.1:45678" // Использование const browser = await puppeteer.launch({ args: [`--proxy-server=${tempProxyUrl}`], }); const [page] = await browser.pages(); await page.goto('https://www.example.com'); await page.screenshot({ path: 'screenshot.png' }); await browser.close(); // Очистка await proxyChain.closeAnonymizedProxy(tempProxyUrl, true); } main();
BЕLый
но я попробую библиотеку эту, спасибо
Null
в firefox это не работает, args: [`--proxy-server=${tempProxyUrl}`] вот эта запись это для chrome
Ну как-то же ты прокси передаёшь в firefox, вот туда и передавай этот временный прокси. Он без аутентификации.
BЕLый
Да я понимаю, попробую это решение
Wudu
Привет всем! Как запретить геолокацию в браузере?
Wudu
Null
Привет всем! Как запретить геолокацию в браузере?
https://pptr.dev/api/puppeteer.browsercontext.overridepermissions/
Wudu
Кстати, решил проблему?
Я нашел input, но он не хотел принимать методы puppeteer, поэтому написал на ванильном js чтоб он загружал туда картинку)