Очень часто по работе сталкиваюсь с различными сервисами для упрощения работы в различных сферах. Речь сейчас не про сервисы, типа Кей Коллектор или Ахрефс, а про Zennoposter или BAS — я не являюсь профессором в области автоматизации, объясню просто, как я понимаю — указанные сервисы это своего рода сложная многоуровневая оболочка, на базе которой можно создавать любые боты и скрипты, которые могут решать практически любые задачи без человеческого вмешательства. То есть нейросеть на минималках. И кстати, появились подобные сервисы еще задолго до того, как использование нейросети для повседневных задач стало мейнстримом.

Теперь к теме: Копаясь в недрах BAS я столкнулся с такой ситуацией, что многие разработчики, которые занимаются разработкой скриптов по BAS (смешно получилось — разработчики занимаются разработкой) идеализируют распознавание капчи кликами. 

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

Так вот, эти капчи можно решитьдвумя способами — метод токенов и метод кликов. 

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

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

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

Дано — демо страница reCAPTCHA V2;

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

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

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

  2. Расширение для распознавания капчи методом кликов (также с использованием 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, с Селениумом попробую в следующий раз.

Комментарии (2)


  1. kentavr009
    14.11.2024 08:31

    Решение кликами по идее должно быть быстрее, чем токеном и менее палевное, там ведь иммитируешь поведение человека. Хотя...


    1. Markus_automation Автор
      14.11.2024 08:31

      Ну вот как на практике вышло по итогу. Тоже казалось кликами решать быстрее, как минимум те кто под BAS пишут скрипты именно кликами решают в 80% случаев, ну либо навыков не хватает разобраться с токеном, хотя казалось бы че там разбираться, если кликами смог решить - то токеном точно решишь. Ну короче вот как то так.