👨‍💻
Пробуй просто оригинальный хром запускать а не не chromium. Но всеровно нужно закрыть кучу дыр где он говорит что ним управляют. Или покупать всякие сомнительные решения за 10к$
есть такая штука как управления над браузером вообще в целом. То есть все действия происходят грубо говоря поверх браузера. По этому принципу BAS вроде как сделан, но неточно. Я когда исходники смотрел, там чет такое проскальзывало
👨‍💻
Наличие HTTP3 проверил?
попробую сейчас
👨‍💻
только понять нужно, как это проверять вообще
Null
У такого браузера к примеру отрубана видеокарта. О чем известно, отсутствуют голоса перевода и так далее. Но все зависит от задачи . Некоторым сайтам пофик на все )
Ну это понятно, это в любом случае точечно нужно обходить через подмену из JS. Универсального решения ещё ни у кого не видел.
Null
Только у него излишне алармистский настрой и кликбейтное название. Но теорию объясняет нормально.
Null
это палится в первую очередь)
Если ты знаешь что конкретный сайт проверяет, то это элементарно подменяется. Скрипты подмены отрабатывают до любого запуска скрипта с сайта.
👨‍💻
Если ты знаешь что конкретный сайт проверяет, то это элементарно подменяется. Скрипты подмены отрабатывают до любого запуска скрипта с сайта.
ну во фронте плохо разбираюсь. Чисто так, дебагер запустить могу и подмену небольшую сделать, не более
👨‍💻
Null
Проблема детектят сам факт подмены )
Если я заранее знаю что они проверяют, то я подменю именно этот кусок. Если проверяют видеокарту, то я отдам то, что отдаёт реальный браузер. У них не остаётся варианта. Такое можно обойти только если они выкатят новый код, в котором будет альтернативная проверка, обход которой у меня не реализован. Но для этого достаточно проверять хэш-сумму скриптов, и не запускать инстанс, если хэш изменился.
Null
Есть пример того, о чём вы говорите? Какой к примеру код для проверки вы считаете нельзя обойти?
👨‍💻
заходя на этот сайт два запроса всего и оба TLS 1.3, но показывает мой айпи
👨‍💻
Наличие HTTP3 проверил?
то есть можно сделать вывод, что данного протокола нет. Проверял так await page.setRequestInterception(true); page.on('response', (response) => { const securityDetails = response.securityDetails(); console.log(securityDetails!.protocol()); });
Null
Я собрал свою версию браузера с нужными мне подменами на более низком уровне. В итоге в js ниче менять не нужно .
Ну это круто конечно, я в плюсах не разбираюсь чтобы писать такое. Да и мне нравится что я из UI на уровне JS могу новые подмены делать :)
Null
заходя на этот сайт два запроса всего и оба TLS 1.3, но показывает мой айпи
Это ты версию TLS (шифрование) смотришь. А нужен протокол. Я посмотрел, у них HTTP2. Так что норм.
👨‍💻
Это ты версию TLS (шифрование) смотришь. А нужен протокол. Я посмотрел, у них HTTP2. Так что норм.
а ну да, tls это же шифровка обычная.. чет я перегрелся с самого утра уже сидеть
👨‍💻
в общем-то, не работает ваш прокси.. пойду в баги писать им. Печально конечно
Null
в общем-то, не работает ваш прокси.. пойду в баги писать им. Печально конечно
Не понимаю с чего ты решил что в прокси проблема. Судя по логам через прокси запрос шёл. Ты в своём прокси можешь логи включить и посмотреть идут запросы или нет.
ISergey
Вод для тестов https://www.hyatt.com/ На сайт под управлением просто так не зайдешь . Там относительно не плохой антифрод .
Ну вот на этом сайте антифрод (kasada) вся магия у него в Нутри виртуальной машины (сходу понять что ни проверяют крайне сложно) строки кое-как достать можно, а вот девиртуалищировать их байт-код не тривиально .
Null
Или зайди из этого браузера на whoer.net и сделай скрин IP, который он видит.
ISergey
Ток хотел скинуть )
Null
:)
ISergey
Из интересно эти товарищи при помощи console.clear детектили что открыт девтулс или к браузеру приконектились по сдп
👨‍💻
Или зайди из этого браузера на whoer.net и сделай скрин IP, который он видит.
мой айпи видит, чуть выше писал уже как раз об этом
ISergey
А прокси сервер идет на другой upstream ?
👨‍💻
const proxyServer = httpProxy.createProxyServer({}); const server = http.createServer((req, res) => { // For HTTP requests proxyServer.web(req, res, { target: `http://${req.headers.host}`, changeOrigin: true, secure: false // This depends on your SSL/TLS requirements }); }); server.on('connect', (req, cltSocket, head) => { // Listen to the `connect` event for HTTPS requests const { port, hostname } = new URL(`http://${req.url}`); const srvSocket = net.connect(+port || 443, hostname, () => { cltSocket.write('HTTP/1.1 200 Connection Established\r\n' + 'Proxy-agent: Node.js-Proxy\r\n' + '\r\n'); srvSocket.write(head); srvSocket.pipe(cltSocket); cltSocket.pipe(srvSocket); }); srvSocket.on('error', (e) => { console.error(`Proxy to ${hostname}:${port} error: ${e}`); cltSocket.end(); }); }); server.listen(port, '0.0.0.0', () => { console.log(`Proxy server listening on port ${port}`); }); вот полностью мой тунель, который чисто перенаправлять должен
ISergey
Так это точно не работает ? https://blog.apify.com/how-to-make-headless-chrome-and-puppeteer-use-a-proxy-server-with-authentication-249a21a79212/
ISergey
Ну console.clear так же легко подменяется и проблема решена :)
Это понятно , просто сам факт такого детекта был интересен ))
👨‍💻
теперь может, работает и ssl трафик в том числе. Буду сейчас браузер чекать
если я делаю запрос https, то он устанавливает соедение и проходит успешно его
Null
Это понятно , просто сам факт такого детекта был интересен ))
Мне больше понравилось статья у Антуана Вастеля (из Datadome), он там разбирает способ, в котором скрипт сайта подменяет некоторые внутренние методы, такие как querySelector и другие и когда их вызывает кто-то из puppeteer, то он создаёт ошибку, берёт её стэк и видит там строчку "puppeteer". После такого внутренние методы вообще лучше не трогать, чтобы не спалиться. Либо находить такие проверки и вырезать их.
👨‍💻
в общем, стало только хуже после proxy-chain
👨‍💻
Чем хуже?
интанс браузера получил, но вот дальше загружать перестал страницу
👨‍💻
хз, где тут накосячить можно было const server = new ProxyChain.Server({ port: port, host: 'localhost', verbose: true, prepareRequestFunction: ({ request, username, password, hostname, port, isHttp, connectionId }) => { return { requestAuthentication: false, upstreamProxyUrl: fullProxy, failMsg: 'Bad username or password, please try again.', }; }, }); server.listen();
👨‍💻
как будто бы застревает.. хз, че за приколы
ISergey
А сами прокси то работают ? Для теста возьми как-то еще прокси сервер . И его в качестве апстрима укажи. ( чтобы просто увидеть что оно побежало )
Null
как будто бы застревает.. хз, че за приколы
Как выше через curl проверял, попробуй. Покажи что в логах будет: curl -vvv --proxy http://parsebot:8080 https://example.com
👨‍💻
запрос через curl работает
👨‍💻
а вот pupputer не грузит
Null
а вот pupputer не грузит
А ты точно из одного контейнера проверяешь?
Null
Обычный http-прокси без аутентификации, не должно быть никаких проблем с хромом.
👨‍💻
А ты точно из одного контейнера проверяешь?
из разных конетйнеров проверяю, в этом и суть проверки как раз
👨‍💻
parsebot-1 | ProxyServer[8080]: 3 | !!! Handling CONNECT example.com:443 HTTP/1.1 parsebot-1 | ProxyServer[8080]: 3 | Using upstream proxy http://UMLDs3SL:<redacted>@166.1.213.213:64130/ parsebot-1 | ProxyServer[8080]: 3 | Using HandlerTunnelChain => example.com:443 parsebot-1 | Connection 3 closed parsebot-1 | { parsebot-1 | srcTxBytes: 6032, parsebot-1 | srcRxBytes: 1472, parsebot-1 | trgTxBytes: 1494, parsebot-1 | trgRxBytes: 6032 parsebot-1 | }
👨‍💻
это логи на curl -vvv --proxy http://parsebot:8080 https://example.com и они отрабатывают и я получаю обратно страницу html
Null
из разных конетйнеров проверяю, в этом и суть проверки как раз
Так у тебя контейнер с хромом может не видеть ip прокси твоего. Из этого же контейнера проверь курлом что выдаст.
👨‍💻
👨‍💻
из под самого себя
👨‍💻
но browserless браузер не хочет конектится
👨‍💻
ну я все еще склоняюсь, что это баг
Null
но browserless браузер не хочет конектится
Попробуй для начала из системы браузер запустить с этим прокси, чтобы убедиться что проблема не в хроме а в докере.
👨‍💻
Попробуй для начала из системы браузер запустить с этим прокси, чтобы убедиться что проблема не в хроме а в докере.
запускал. Ну тот, что хром тестинг, котоырй автоматом с пупетиром скачивается, все работает отлично
👨‍💻
ну с прокси чейном не запускал, но абсолютно такая же логика работы была с http-proxy. через курл запросы шли, проходили на ура, а браузлесс пупетир не хотел идти
👨‍💻
все работает в обычном хроме c --proxy-server=${proxy}
👨‍💻
отставить. Не работает с такой же настройкой
Null
отставить. Не работает с такой же настройкой
Ну вот, смотри что не так настроил в проксичейне.
👨‍💻
Ну вот, смотри что не так настроил в проксичейне.
ну так запросы он передает), а пупетир отказывается. звучит как сказка
👨‍💻
это примерно вот так выглядит. То есть проксичейн видит запросы, но дальше где-то зависает без причины
ISergey
У тебя puppeteer connect .
ISergey
А браузер с какими аргументами запущен ?
👨‍💻
У тебя puppeteer connect .
нет const browser = IS_PRODUCTION === 'production' ? await puppeteer.connect({ // browserWSEndpoint: `${process.env.BROWSERLESS_CHROME}?launch=${launchArgs}` browserWSEndpoint: process.env.BROWSERLESS_CHROME + `?--proxy-server=${proxy}`, }) : await puppeteer.launch(launcnOptions); const launcnOptions = { headless: false, timeout: 99999999, args: [ '--lang=de', '--no-sandbox', '--disable-setuid-sandbox', `--proxy-server=${'http://localhost:8080'}` ] }
Null
это примерно вот так выглядит. То есть проксичейн видит запросы, но дальше где-то зависает без причины
Значит прокси такой. Я только что взял дефолтный скрипт проксичейна, вставил туда фришный прокси. Сначала сделал запрос через курл, он отработал нормально, потом так же запустил хром с прокси.
👨‍💻
где фришгные чекнуть можно ?