Инструкция: Как автоматически решить и обойти reCAPTCHA в Puppeteer
1. Установка компонентов
Установка Puppeteer и других необходимых пакетов:
npm i puppeteer puppeteer-extra puppeteer-extra-plugin-stealth
2. Настройка расширения
Необходимо скачать архив с расширением, и распаковать его в папку ./2captcha-solver
в корне проекта.
Расширение имеет различные настройки, включая автоматическое решение указанного типа капч, поддержку proxy
, и другие настройки. Настройки доступны в файле ./common/config.js
. Для добавления настройки автоматического решения reCAPTCHA V2, необходимо открыть файл ./common/config.js
и изменить значение поля autoSolveRecaptchaV2
на true
.
Обязательной настройкой является добавление своего API key, остальные настройки опциональные.
Далее необходимо выполнить настройку расширения:
Указать свой API ключ в файле настроек расширения
./common/config.js
. В полеapiKey
напишите свой ключ. Значение своего API ключа можно посмотреть на странице.
Пример:apiKey: "8080629c1221fdd82m8080000ff0c99c"
Отключаем открытие страницы настроек расширения после установки. Для этого в файле
./manifest.json
удаляем следующие строки:
"options_ui": {
"page": "options/options.html",
"open_in_tab": true
},
3. Автоматизация браузера
Запуск и инициализация расширения в 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()
})();
3.1 Переход на страницу
Открытие необходимой страницы, и отправка капчи.
С помощью 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']")
Поздравляем, капча успешна пройдена! Полный код примера размещен на GitHub.