Bogdan
и каждый уже у себя верифицирует
🅰️nimeCoder
Ну гугл похоже хочет у себя верифицировать 😁
🅰️nimeCoder
Хз что он с ним делает если не сравнивает
Bogdan
отстойно, что так можно. У меня сайт был тяжелый несколько мегабайт страница, и там капча, я ее на отдельный прокси нормальный закидывал чтобы трафик не жрало на загрузку обычной страницы а только капчу.
Bogdan
работало все отлично, но кто-то может и воспользоваться.
🅰️nimeCoder
отстойно, что так можно. У меня сайт был тяжелый несколько мегабайт страница, и там капча, я ее на отдельный прокси нормальный закидывал чтобы трафик не жрало на загрузку обычной страницы а только капчу.
Несколько мегабайт, прям типикал сайт с защитой от алибабы их collina залупой , весит я ебал, а если много бразцеров с али запускать жрёт тоже я ебал эта обфускация там цпу в сотку долбит
🅰️nimeCoder
Туда сюда строки пересобирвет и бинарку туда сюда перегоняет
🅰️nimeCoder
В сотни тыс итераций
Bogdan
да уж над прокси ферму ставить
Alhimik
Я правда не знаю почему
Возможно из-за того что ключ действует минуту вроде бы. И есть вероятность что пользователь запросит капчу с одного IP, и в течении минуты перейдёт с мобильного интернета, к примеру, на Wi-Fi и ответ пришлёт уже с другого IP. Или перескакивания с одной базовой станции на другую, хотя я не помню меняется ли тогда IP. Хоть это и маловероятные кейсы, но вполне могут создавать проблемы.
Pavel
кто-нибудь сталкивался с подобным?
🅰️nimeCoder
с чем
Pavel
В общем выяснил, что капчту дискорд просит капчту, если пытаться логиниться через прокси
Pavel
На скрине она просто не отобразилась
Alex
Какие нынче топ атидетект плагины?
🅰️nimeCoder
🅰️nimeCoder
решит большинство проблем в принципе, остальное сам уже)
🅰️nimeCoder
можшь попробовать https://github.com/dedol/PrivacyShield мы с другом писали под подобное дело
🅰️nimeCoder
в принципе он хоть и под фф, можешь портировать куда угодно, основной код inject.js
🅰️nimeCoder
deviceinfo.me можешь для чека использовать
Oz
да уж, на что не пойдешь ради обратной совместимости (
Oz
Nñ pp mm
Pavel
Полно таких сервисов, тот же rucaptcha.com (он же 2captcha.com) решает Гугл капчу, у них даже есть готовый код для node https://www.npmjs.com/package/rucaptcha-2captcha
А пробовали этот сервис вообще? У меня выдается ошибка при запуске примера PuppeteerExtraPluginRecaptcha: An error occured during "getRecaptchaSolutions": { ex_1 | _vendor: 'recaptcha', ex_1 | provider: '2captcha', ex_1 | id: '1p3wtzfdjl6h', ex_1 | requestAt: 2022-07-05T22:38:17.586Z, ex_1 | error: 'Error: 2captcha error: ERROR_BAD_PARAMETERS' ex_1 | }
Pavel
Хорошо, спасибо. Опробую
1
Хорошо, спасибо. Опробую
Напишите им в поддержку они направят, помогут.
Alex
Подскажите, как pptr cluster можно обрабатывать очередь в редисе. Просто взять из очереди url, открыть страницу, и вернуть тайтл обратно в редис.
Alex
может в воркер pptr добавить
Это позволит скажем держать 10 инстансов в ожидании очереди?
Pavel
Это позволит скажем держать 10 инстансов в ожидании очереди?
смотря сколько ты воркеров сможешь держать, браузер в отдельном контейнере можно запускать
Alex
смотря сколько ты воркеров сможешь держать, браузер в отдельном контейнере можно запускать
Мне много не нужно, достаточно по инстансу на ядро. В отдельном контейнере, это как? В докере?
Bogdan
Подскажите, как pptr cluster можно обрабатывать очередь в редисе. Просто взять из очереди url, открыть страницу, и вернуть тайтл обратно в редис.
Может почему нет. Ты просто делаешь вызов. Единственное backpressure нужно сделать, чтобы кластер не захлебнулся, но это просто.
Alex
Может почему нет. Ты просто делаешь вызов. Единственное backpressure нужно сделать, чтобы кластер не захлебнулся, но это просто.
Видимо я не так сформулировал, и кластер не подходит. Так понимаю он параллелит заведомо известный пул кратно канкаренси.
Alex
Есть очередь в редисе, она может быть пустая. Инстансы стартуют как только в очереди есть таски, ибо в самих тасках аргументы для самого инстанса.
Alex
Нужно лупить очередь, и если она не пустая стартовать инстанс с аргументом из таски. И все это крано канкаренси скажем =8
Andrey
всегда интересовало, почему все привязываются к этому concurrency? это же никак не вяжется на максимальную производительность
Andrey
почему
Alex
почему
переключение контекста дорогая операция + кеши проца,в которых предиктивная модель, свопит последние 5,,6 инструкций. да и бегать по адресному пространству тоже не дешего в рамках межпроцессных взаимодействий
Alex
то ли дело поток аллоцировать для процесса, в его адресном пространстве. выделение дешевое, менеджеру памяти легче это сделать. освободить чуть дороже и все. и процу легче молотить сегмент в рамках одной страницы памяти, не нужно бегать по таблицам
Andrey
это из 90х отмаза) да, правильно все написано, но к современным процессорам и ОС мало относится. У меня винда и сейчас запущено 278 процессов/3449 потоков. Слабым местом, если мы обсуждается инстанс браузера, будет память, выделяемая под процесс - ресурсы, а так же скорость интернета - самое слабое место. А теперь вернемся к моему вопросу - почему кратно количество ядер надо запускать)
Andrey
при этом сам хром запускает на каждую вкладку и бекграунд задачи свой (внимание) процесс
Alex
чтобы равномерно утилизировать ядра, очевидно же
Andrey
равномерно в браузере?)
Andrey
не в алгоритмически сложных, оптимизированных задача - а в браузере
Alex
равномерно в браузере?)
Изначально вопрос же про канкаренси процессов был?
Alex
В любом случае хоть винда, хоть линукс, мы с юзерспейса влиять на тредпулл и таск менеджер не можем если ты про это. Они сами там очереди сформируют
Andrey
поэтому и нет смысла никакого привязывать к цифрам
Alex
Есть....
Alex
Знание что есть кеши ...
Andrey
да пофиг на кеши, на переключение контекста, когда у тебя сайт отвечает 500 мс
Alex
да пофиг на кеши, на переключение контекста, когда у тебя сайт отвечает 500 мс
Ты про мантру что пофик на оптимизации когда 80% у нас IO?
Alex
Для хоум поделок да, пофик в целом.
Alex
поэтому и нет смысла никакого привязывать к цифрам
Давно винду не трогал, но на сколько помню там есть чекбокс, отдавать приоритет службам/сервисам или приложениям. На серверных билдах по умолчанию службы, на десктопе приложениям. Чекни в режиме приоритета службам, io стек должно забустить, им больше проца давать будет.
Andrey
ой эта галка даже не знаю в какой версии была)
Alex
Ну думаю в реестре под нее ключ еще будет долго.
Bogdan
Нужно лупить очередь, и если она не пустая стартовать инстанс с аргументом из таски. И все это крано канкаренси скажем =8
Ну из того что ты описал кластер подходит. Я использую кластер с очередью rabbitmq тебе нужно просто backpressure сделать как я выше сказал.
Andrey
плохие у тебя представления и винде)
Andrey
сейчас никто таким не пользуется
Andrey
но вообще приоритет любого процесса можно выбрать из 6 значений
Andrey
я из гугла узнал)
Andrey
да я даже не подумал бы никогда, что понадобится туда лезть, вообще не нужная информация)
Alex
Что за решение?
https://javascript.plainenglish.io/how-to-build-a-scalable-scrawler-service-with-puppeteer-8e08905ed7e3
Bogdan
И я контрой конкуренции не нашёл
Bogdan
Там
Bogdan
const maxConcurrency = 4; let currentConcurrency = 0; const backpressure = async () => { await delay(550, 750); if (currentConcurrency >= maxConcurrency) { return await backpressure(); } currentConcurrency = currentConcurrency + 1; console.log(`Current Concurency: ${currentConcurrency}`); return console.log('Ready to run job'); };
Bogdan
вот это тебе нужно просто гдето в конце консумера поставить
Bogdan
чтобы он не фетчил из очереди пока новый воркер не освободится
Alex
чтобы он не фетчил из очереди пока новый воркер не освободится
ну наверное можно завелосипедить и через setInterval + promise + свой примитивный аля мьютекс.
Bogdan
ну наверное можно завелосипедить и через setInterval + promise + свой примитивный аля мьютекс.
ну а как ты будешь это делать если у тебя в queue кластера в очередь скидывается без await
Bogdan
он просто зальет в кластер всю очередь
Bogdan
из редиса и все
Bogdan
если именно с кластером то бэпресур будет вот так выглядеть const backpressure = async () => { const queue_length = cluster.jobQueue.list.length; await delay(550); if (queue_length >= max_concurrency) { return backpressure(); } return 'Ready for queue'; };