Инструкция: Как автоматически решить и обойти 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.
