Найти тему

Как автоматически решить и обойти reCAPTCHA в Puppeteer

Продолжаю паразитировать на гайдах из интернета, в этот раз тестирую гайд который также «любезно» предоставлен сервисом 2капча, а вернее был взят мною с их лендинга, переведен на русский язык и адаптирован под мой стиль.

Собственно сама англоязычная статья тут.

В статье описывается использование плагина «puppeteer-extra-plugin-stealth» для обхода reCAPTCHA в Puppeteer.

Краткий экскурс, что же такое puppeteer это инструмент написанный под Node. js для автоматизации браузера.

Основное преимущество Puppeteer то, что его можно использовать в headless режиме. А сам факт автоматизации браузера можно скрыть используя специальные плагины.

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

Что необходимо

Сразу оговорюсь — в данном тексте не будет описания предмета и субъекта исследования, ровно как и описания причин сотворения мира — просто немного полезной информации про то, как обойти капчу в Puppeteer. Дальше вы уже сами решайте, как вы будете использовать прочитанную информацию.

По старой доброй традиции для начала все подготовим.

Нам потребуется

  • сервис решения капч (было бы странно, если бы тут не было рефки, правда) — 2капча;
  • cобственно сам puppeteer;
  • puppeteer-extra легкая оболочка для Puppeteer;
  • puppeteer-extra-plugin-stealth дополнение к puppeteer-extra, предназначенное для скрытия следов автоматизации.

Установка необходимых компонентов

Для начала установим Puppeteer и перечисленные выше пакеты:

Открываете консоль и вставляете там следующий код;

npm i puppeteer puppeteer-extra puppeteer-extra-plugin-stealth

2. Настройка расширения

Настроим непосредственно расширение, которое будет решать капчу

1. Нужно просто скачать архив с расширением, и распаковать его в папку. /2captcha-solver в корне проекта.

Расширение имеет несколько настроек, например

  • автоматическое решение капчи определенного типа
  • поддержка proxy
  • другие настройки

Настройки можно изменять через файле. /common/config.js.

Так как мы будем решать recaptcha V2, давайте изменим настройки под нее. Открываем файл ./common/config.js и меняем значение поля autoSolveRecaptchaV2 на true.

Обязательно добавьте свой API key (его возьмем из личного кабинета сервиса 2капча), остальные настройки опциональные.

Пример АПИ ключа — "35b9d7b7d407b126b8649128a264120e"

Ключ АПИ обязательно должен быть в кавычках, в противном случае скрипт будет выдавать ошибку

Отключаем открытие страницы настроек расширения после установки. Для этого в файле. /manifest.json удаляем следующие строки:

"options_ui":
{ "page": "options/options.html",
"open_in_tab": true
},

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

Автоматизация браузера

Запуск и инициализация расширения в Puppeteer:

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
const { executablePath } = require('puppeteer');
(async () => {
const pathToExtension = require('path').join(__dirname, '2captcha-solver');
puppeteer.use(StealthPlugin())
const browser = await puppeteer.launch({
headless: false,
args: [
`--disable-extensions-except=${pathToExtension}`,
`--load-extension=${pathToExtension}`,
],
executablePath: executablePath()
});
const [page] = await browser.pages()
})();

Переход на страницу

С помощью page. goto() мы переходим на необходимую страницу. Далее необходимо отправить капчу для решения, это можно сделать вручную или автоматически.

В нашем примере мы будем отправлять капчу вручную, для этого ждем пока отобразится кнопка расширения с CSS селектором «.captcha-solver», после этого нажимаем на эту кнопку. После нажатия на кнопку, капча отправится в сервис для решения.

// переходим по указанному адресу await
page.goto('https://2captcha.com/demo/recaptcha-v2')
// ждем пока появится элемент с CSS селектором
".captcha-solver" await page.waitForSelector('.captcha-solver')
// кликаем по элементу с указанным селектором
await page.click('.captcha-solver')

3.2 Отслеживание решения капчи

После получения ответа от сервиса, у кнопки расширения «.captcha-solver' изменится значение дата-атрибута data-state. С помощью значения этого атрибута data-state, вы можете отслеживать состояние расширения. После решения капчи, значение этого атрибута изменится на "solved».

Доступны следующие варианты атрибута data-state:

АтрибутОписаниеdata-state=«ready"Расширение готово к работе. Для отправки капчи необходимо нажать на кнопку.data-state="solving"Капча решается.data-state="solved"Капча успешно решена.data-state="error»Капча не решена.

На этом шаге необходимо подождать пока капча будет решена, после этого значение атрибута изменится на «solved», что будет сигнализировать об успешном решении капчи. После этого шага можно выполнять необходимые действия.

// По умолчанию waitForSelector ожидает в течение 30 секунд, но этого времени обычно не достаточно, поэтому указываем значение timeout вручную вторым параметром. Значение timeout указывается в "ms".
await page.waitForSelector(`.captcha-solver[data-state="solved"]`, {timeout: 180000})

4. Запуск

После решения капчи, переходим к выполнению необходимых на странице действий. В нашем примере мы нажмём на кнопку «Check", для проверки корректности полученного решения капчи. После успешного прохождения проверки, отобразится сообщение »Captcha is passed successfully!".

// После решения капчи выполняем необходимые действия, в нашем случае нажимаем на кнопку "Check", для проверки решения.
await page.click("button[type='submit']")

Рабочий файл можно скачать по ссылке ниже

Ссылка на скачивание

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

Удачного распознавания капчи, лайк приветсвуется!