Очень часто по работе сталкиваюсь с различными сервисами для упрощения работы в различных сферах. Речь сейчас не про сервисы, типа Кей Коллектор или Ахрефс, а про Zennoposter или BAS — я не являюсь профессором в области автоматизации, объясню просто, как я понимаю — указанные сервисы это своего рода сложная многоуровневая оболочка, на базе которой можно создавать любые боты и скрипты, которые могут решать практически любые задачи без человеческого вмешательства. То есть нейросеть на минималках. И кстати, появились подобные сервисы еще задолго до того, как использование нейросети для повседневных задач стало мейнстримом.
Теперь к теме: Копаясь в недрах BAS я столкнулся с такой ситуацией, что многие разработчики, которые занимаются разработкой скриптов по BAS (смешно получилось — разработчики занимаются разработкой) идеализируют распознавание капчи кликами.
Вероятно надо пояснить — речь идет про картинные и визуальные капчи (те, где нужно выбирать изображения на экране или кликать по картинкам (иконкам) в нужном порядке. Примеры картинных и визуальных капч — reCAPTCHA V2, hCaptcha, GeeTest CAPTCHA, Rotate CAPTCHA.
Так вот, эти капчи можно решитьдвумя способами — метод токенов и метод кликов.
Кстати, если хочется погрузиться в методы распознавания капчи глубже, вот отличная статья — Распознавание капчи — разбираемся в сложном для понимания процессе максимально просто
Возвращаясь к идеализации метода кликов у разработчиков, пишущих скрипты и ботов под BAS, следует отметить, что этот метод действительно может быть проще в реализации и внедрении и для его внедрения может быть намного меньше препонов со стороны капча сервисов, которые эти самые капчи разрабатывают. Повторюсь, я не считаю себя гуру автоматизации, просто транслирую свой опыт и он мне показал, что решение капчи токеном быстрее и эффективнее, чем решение капчи кликами.
Теперь к фактам:
Дано — демо страница reCAPTCHA V2;
Что необходимо сделать — сравнить скорость распознавания капчи (в нашем случае reCAPTCHA V2) двумя методами.
За основу взято два расширения с Гитхаба (я хотел чтобы это были коробочные версии, но пришлось немного доработать под свою задачу).
Расширение для распознавания капчи с использованием puppeteer — 2captcha‑solver‑in‑puppeteer
Расширение для распознавания капчи методом кликов (также с использованием puppeteer) — puppeteer‑recaptcha‑solver‑using‑clicks
По факту, сравнение можно было бы закончить на первом расширении, так как там можно решать и токеном и кликами, но так как я в принципе начал сравнивать со второго и получил неоднозначный результат, решил добавить и второе расширение, для более наглядной демонстрации скорости решения капчи кликами.
Подготовка к распознаванию капчи (точечная настройка распознавателя капчи)
Опишу тут сразу все виды подготовки распознавателя капчи, чтобы далее к этому не возвращаться.
Подготовка к распознаванию капчи токеном
Так как оба распознавателя капчи настроены по дефолту на распознавание капчи с демо страницы сервиса который эти расширения и написал, я решил, что объективнее будет решать капчу на демо странице Гугла. Там и капча может быть посложнее, да и очков в пользу предвзятости отнимет (я надеюсь).
Итак, в первом расширении для того, чтобы расширение корректно работало и решало капчу токеном необходимо внести следующие изменения:
В файле config.js
(он расположен тут — \2captcha-solver\common
) в 11 строке убедится что напротив типа нашей капчи установлен метод token
и подставить в 4 строку ваш ключ АПИ (см фото, может со временем что то поменяется, нумерация строк, как пример).
В файле manifest.js
(он расположен на папку выше предыдущего файла) необходимо удалить из кода эту строчку.
"options_ui": {
"page": "options/options.html",
"open_in_tab": true
},
Ну и в индексном файле нужно изменить УРЛ страницы, где располагается капча (как я сказал, по дефолту там стоит демо страницы с сервиса 2капчи, в моем случае я туда поставил демо страницы Гугла).
Ниже (когда я писал этот текст это была 35 строка), в этом же файле, нужно поменять эту строчку
await page.click("button[type='submit']")
На вот такую
await page.click('#recaptcha-demo-submit')
Это необходимо, для того, чтобы решатель капчи смог отыскать кнопку “submit”
, так как классы у них на демо странице Гугла и демо странице 2капчи немного отличаются.
Важное уточнение - естественно для использования подобного распознавателя капчи в своих целях потребуется доработать его (или как минимум протестировать работоспособность).
Подготовка к распознаванию капчи кликами через первый распознаватель капчи
Для решения капчи кликами через первое расширение необходимо внести изменения следующего плана:
В файле config.js
в виде метода решения капчи выбираем “click”
— место где менять метод описано выше. Ключ АПИ остается тот же.
И важное уточнение — я закомментировал часть кода в файле index.js
, так как решатель капчи отказывался дорешивать капчу, так как не мог найти кнопку. В моем случае мне не сложно было и самому кликнуть на кнопку submit
и я просто закомментировал проблемную часть. А если нужно будет распознать капчу через это же расширение, вам потребуется его немного допилить.
Итак, закомментировал я следующий код (с 25 по 37 строку).
// ждем пока появится элемент с CSS селектором ".captcha-solver"
await page.waitForSelector('.captcha-solver')
// кликаем по элементу с указанным селектором
await page.click('.captcha-solver')
// По умолчанию waitForSelector ожидает в течении 30 секунд, так как этого времени зачастую не достаточно, то указываем значение timeout вручную вторым параметром.
// Значение timeout указывается в "ms".
await page.waitForSelector(`.captcha-solver[data-state="solved"]`, {timeout: 150000})
// После решения капчи выполняем необходимые действия, в нашем случае нажимаем на кнопку "check".
await page.click('#recaptcha-demo-submit')
// await browser.close();
В итоге у меня получилось вот так.
// // ждем пока появится элемент с CSS селектором ".captcha-solver"
// await page.waitForSelector('.captcha-solver')
// // кликаем по элементу с указанным селектором
// await page.click('.captcha-solver')
// // По умолчанию waitForSelector ожидает в течении 30 секунд, так как этого времени зачастую не достаточно, то указываем значение timeout вручную вторым параметром.
// // Значение timeout указывается в "ms".
// await page.waitForSelector(`.captcha-solver[data-state="solved"]`, {timeout: 150000})
// // После решения капчи выполняем необходимые действия, в нашем случае нажимаем на кнопку "check".
// await page.click('#recaptcha-demo-submit')
// // await browser.close();
Все теперь расширение готово решать капчу кликами.
Подготовка второго расширения для распознавания капчи для решения кликами
Тут пришлось немного повозиться, но не сильно долго. Все исполняемые файлы расположены в корне, так что прыгать по папкам не нужно, чисто небольшая уточняющая работа с кодом. Я подставил свой ключ АПИ и поменял УРЛ страницы, где мне нужно решить Google reCAPTCHA и немного повозился с кодом, в частности с селекторами. На странице Гугла селекторы отличаются от селекторов на демо странице 2капча, поэтому расширение изначально не хотело работать. Расписывать подробно, что именно было изменено и как не буду, так как второе расширение представлено чисто в ознакомительных целях.
Если хотите поработать с ним, есть целая статья в первоисточнике — Как обойти и автоматически решить reCAPTCHA с использованием Puppeteer
Итак, все расширения готовы к тестированию, запускаем!
Распознавание капчи методом токенов или методом кликов - что быстрее?
Я сделал запись экрана во время работы расширений при решении токеном и при решении кликами и совместил их в одном видео, и перед тем, как показать результаты - несколько очевидных (для кого-то может и неочевидных) замечаний.
Скорость распознавания капчи. ее сложность и т.п. будут зависеть от заспамленности вашего ip адреса, поэтому, если хотите решать капчу быстрее, дополнительно понадобятся прокси, которые также могут взять на себя часть трат.
Говорят что если у вас хорошие прокси вообще может не потребоваться обходить капчу. Ну это только в том случае, если капча не стоит на странице по дефолту, а не появляется при наличии у системы подозрений, что вы, батенька (матушка) бот…
В целом же, хорошие прокси позволяют решать капчу быстрее. Я использовал свои домашний ip адрес.
В первом случае я сравнил скорость распознавания гугл капчи в рамках одного расширения и результат таков, что решение токеном быстрее, и судя по всему качественнее, результат вы можете видеть ниже.
По итогу токен решился за 18 секунд, а кликами за 1 минуту 10 секунд. И в дальнейшем у меня пару раз токеном даже получилось решить еще быстрее, а вот решить быстрее кликами, увы, уже не вышло…
Ну и в качестве сравнения я решил проверить как решает капчу кликами второе расширение, и в целом ситуация повторилась, скорость решения была достаточно низкая, при условии, что дело не в сервисе распознавания капчи, а в выбранном методе. Сервис отдавал ответ достаточно быстро, что можно увидеть на скринкасте, но вот рекапча снова и снова просила повторить.
Примечание — я намеренно ускорил время для второго расширения, так как рекапча была решена в итоге за 4 минуты.
Таким образом, для своих задач я бы всеж предпочел токен, по крайней мере если использовать puppeteer, с Селениумом попробую в следующий раз.