Распознавание капчи токеном vs кликами: сравнение скорости решений

Я часто сталкиваюсь с различными инструментами, которые облегчают работу в разных областях. Сейчас речь не о таких сервисах, как Key Collector или Ahrefs, а о Zennoposter или BAS. Я не эксперт в автоматизации, но понимаю, что эти сервисы представляют собой сложные многоуровневые оболочки. На их основе можно создавать любые боты и скрипты, способные выполнять практически любые задачи без участия человека. Это своего рода нейросети в упрощенном виде. Интересно, что подобные сервисы появились задолго до того, как использование нейросетей в повседневных задачах стало массовым явлением.

Перейдем к сути: исследуя возможности BAS, я заметил, что многие разработчики скриптов для этого сервиса идеализируют распознавание капчи методом кликов.

Распознавание капчи токеном vs кликами: сравнение скорости решений

Поясню: речь идет о графических и визуальных капчах, где нужно выбирать изображения на экране или кликать по иконкам в определенном порядке. Примеры таких капч: reCAPTCHA V2, hCaptcha, GeeTest CAPTCHA, Rotate CAPTCHA.

Эти капчи можно обойти двумя способами: с помощью токенов и методом кликов.

Если хотите глубже разобраться в методах распознавания капчи, рекомендую отличную статью: "Распознавание капчи – разбираемся в сложном для понимания процессе максимально просто".

Возвращаясь к вопросу об идеализации метода кликов среди разработчиков скриптов для BAS, стоит отметить, что этот метод действительно может быть проще в реализации и интеграции (спойлер - нет, он не проще). Для его внедрения может быть меньше препятствий со стороны сервисов капчи, которые их разрабатывают. Однако мой опыт показывает, что решение капчи с помощью токена быстрее и эффективнее, чем методом кликов.

Теперь к фактам:

Имеется демо-страница reCAPTCHA V2.

Задача: сравнить скорость распознавания капчи (в нашем случае reCAPTCHA V2) двумя методами.

В качестве основы взяты два расширения с GitHub (хотя хотелось использовать готовые версии, пришлось немного доработать под свои нужды).

Расширение для распознавания капчи с использованием Puppeteer: 2captcha-solver-in-puppeteer.

Расширение для распознавания капчи методом кликов (также с использованием Puppeteer): puppeteer-recaptcha-solver-using-clicks.

В принципе, сравнение можно было бы закончить на первом расширении, так как оно позволяет решать капчу и токеном, и кликами. Но поскольку результаты со вторым расширением были неоднозначными, я решил его тоже включить для более наглядной демонстрации скорости решения капчи кликами.

Подготовка к распознаванию капчи (настройка распознавателя)

Опишу сразу все этапы подготовки распознавателя капчи, чтобы больше к этому не возвращаться.

Подготовка к распознаванию капчи токеном

Поскольку оба распознавателя капчи по умолчанию настроены на демо-страницы сервиса, который их разработал, я решил, что объективнее будет решать капчу на демо-странице Google. Там капча может быть сложнее, да и фактор предвзятости уменьшается.

Итак, в первом расширении для корректной работы и решения капчи токеном необходимо внести следующие изменения:

  • В файле config.js (находится в \2captcha-solver\common) убедиться, что напротив типа нашей капчи установлен метод token и в 4-й строке подставить ваш API-ключ (см. фото, возможно, со временем что-то изменится, нумерация строк приведена для примера).
Распознавание капчи токеном vs кликами: сравнение скорости решений
  • В файле manifest.js (расположен на уровень выше предыдущего файла) необходимо удалить из кода следующие строки:

"options_ui": { "page": "options/options.html", "open_in_tab": true },
Распознавание капчи токеном vs кликами: сравнение скорости решений

В файле index.js нужно изменить URL страницы с капчей (по умолчанию там указана демо-страница 2captcha; я заменил на демо-страницу Google).

Распознавание капчи токеном vs кликами: сравнение скорости решений

Ниже, в этом же файле, нужно изменить строку:

await page.click("button[type='submit']")

На вот такую

await page.click('#recaptcha-demo-submit')

Это необходимо, чтобы решатель капчи смог найти кнопку "submit", так как классы на демо-страницах Google и 2captcha немного отличаются.

Важно отметить, что для использования этого распознавателя капчи в своих целях потребуется его доработать или хотя бы протестировать работоспособность.

Подготовка к распознаванию капчи кликами через первое расширение

Для решения капчи кликами через первое расширение необходимо внести следующие изменения:

В файле config.js в методе решения капчи выбрать click (место, где менять метод, описано выше). API-ключ остается тот же.

Распознавание капчи токеном vs кликами: сравнение скорости решений

Я закомментировал часть кода в файле index.js, так как решатель капчи отказывался завершать решение, не находя кнопку. Мне было проще самому кликнуть на кнопку "submit", поэтому я закомментировал проблемный участок. Если вам нужно распознать капчу через это же расширение, потребуется его немного доработать.

Я закомментировал следующий код (строки с 25 по 37):

// ожидаем появления элемента с селектором ".captcha-solver" await page.waitForSelector('.captcha-solver') // кликаем по элементу с указанным селектором await page.click('.captcha-solver') // ожидаем решения капчи await page.waitForSelector(`.captcha-solver[data-state="solved"]`, {timeout: 150000}) // нажимаем на кнопку "check" await page.click('#recaptcha-demo-submit') // await browser.close();

В итоге код выглядит так:

// // ожидаем появления элемента с селектором ".captcha-solver" // await page.waitForSelector('.captcha-solver') // // кликаем по элементу с указанным селектором // await page.click('.captcha-solver') // // ожидаем решения капчи // await page.waitForSelector(`.captcha-solver[data-state="solved"]`, {timeout: 150000}) // // нажимаем на кнопку "check" // await page.click('#recaptcha-demo-submit') // // await browser.close();

Теперь расширение готово решать капчу кликами.

Подготовка второго расширения для решения капчи кликами

Здесь потребовалось немного больше усилий, но ничего сложного. Все файлы находятся в корневой папке, поэтому переходить по каталогам не нужно. Я добавил свой API-ключ, изменил URL страницы с Google reCAPTCHA и немного поработал с кодом, особенно с селекторами. На странице Google селекторы отличаются от селекторов на демо-странице 2captcha, поэтому расширение изначально не работало. Подробно расписывать изменения не буду, так как второе расширение представлено для ознакомления.

Если хотите поработать с ним, есть подробная статья: "Как обойти и автоматически решить reCAPTCHA с использованием Puppeteer".

Итак, все расширения готовы к тестированию. Запускаем!

Распознавание капчи токеном или кликами: что быстрее?

Я записал экран во время работы расширений при решении токеном и кликами и объединил их в одном видео. Перед тем как показать результаты, несколько замечаний:

  • Скорость распознавания капчи, ее сложность и другие факторы зависят от "заспамленности" вашего IP-адреса. Поэтому для быстрого решения капчи могут потребоваться прокси, которые также могут увеличить расходы.
Распознавание капчи токеном vs кликами: сравнение скорости решений
  • Говорят, что с хорошими прокси можно вообще избежать необходимости обходить капчу, если она не стоит на странице по умолчанию.
  • В целом, хорошие прокси позволяют решать капчу быстрее. Я использовал свой домашний IP-адрес.

В первом случае я сравнил скорость распознавания Google reCAPTCHA в рамках одного расширения. Результат показал, что решение токеном быстрее и, вероятно, качественнее. Вы можете увидеть это на видео ниже.

В итоге токен был решен за 18 секунд, а методом кликов — за 1 минуту 10 секунд. В дальнейшем мне даже удалось решить токеном еще быстрее, а вот ускорить решение кликами не получилось.

Для сравнения я проверил, как решает капчу кликами второе расширение. В целом ситуация повторилась: скорость решения была достаточно низкой, и дело не в сервисе распознавания капчи, а в выбранном методе. Сервис отдавал ответ быстро, что видно на скринкасте, но reCAPTCHA снова и снова просила повторить.

Примечание: я намеренно ускорил видео для второго расширения, так как капча была решена за 4 минуты.

Таким образом, для своих задач я бы предпочел метод токена, по крайней мере при использовании Puppeteer. С Selenium попробую разобраться в следующий раз.

Начать дискуссию