Пример для разгадывания reCAPTCHA 2 без установки плагина в браузер

Решение рекапчи для headless браузерных движков без установки расширения AntiCaptcha. Инициализация API ключа, подключение исполняемого кода.

Для тех, кто пользуется headless, браузерными движками или просто не могут/не хотят ставить наш плагин на браузер мы придумали подключаемый JS файл, который позволяет решать капчу. Сейчас это только решение Рекапчи, капчи-картинки пока не решаются.

Данный подключаемый JS файл годится в том числе для приложения iMacros, отличается только способ его подключения, он рассмотрен на странице Решение reCAPTCHA 2 в приложении iMacros без плагина.

Инициализация API ключа Anti-Captcha.com

Перед подключением кода, решающего Рекапчу, необходимо указать свой AntiCaptcha API ключ, который просто помещается в DIV элемент при помощи следующего кода:

(function(){ // ... var d = document.getElementById("anticaptcha-imacros-account-key"); if (!d) { d = document.createElement("div"); d.innerHTML = "YOUR-ANTI-CAPTCHA-API-KEY"; d.style.display = "none"; d.id = "anticaptcha-imacros-account-key"; document.body.appendChild(d); } // ... })();

В нем необходимо поменять YOUR-ANTI-CAPTCHA-API-KEY на значение вашего ключа.

Ничего криминального, этот код просто создает невидимый элемент с id=anticaptcha-imacros-account-key, помещает в него ключ и добавляет этот элемент на целевую страницу, впоследствии данный ключ будет считан JS кодом, решающим рекапчу.

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

Подключение файла решения рекапчи

Далее подключаем уже собственно скрипт, который будет решать капчу:

(function(){ // ... var s = document.createElement("script"); s.src = "https://cdn.antcpt.com/imacros_inclusion/recaptcha.js?" + Math.random(); document.body.appendChild(s); // ... })();

Этот код создает SCRIPT элемент с адресом https://cdn.antcpt.com/imacros_inclusion/recaptcha.js и помещает в DOM. Рекомендуется всегда подгружать этот JS файл с нашего сервера, так вы будете уверены, что имеете последнюю версию скрипта со всеми исправлениями и дополнениями.

На выходе в сухом остатке имеем следующие строки:

(function(){ // ... var d = document.getElementById("anticaptcha-imacros-account-key"); if (!d) { d = document.createElement("div"); d.innerHTML = "YOUR-ANTI-CAPTCHA-API-KEY"; d.style.display = "none"; d.id = "anticaptcha-imacros-account-key"; document.body.appendChild(d); } var s = document.createElement("script"); s.src = "https://cdn.antcpt.com/imacros_inclusion/recaptcha.js?" + Math.random(); document.body.appendChild(s); // ... })();

На некоторых сайтах при помощи заголовка Content-Security-Policy запрещается подключение всех сторонних скриптов, в том числе таких как упомянутый выше recaptcha.js .

В таком случае весь код JS файла по решению Рекапчи можно вставить разом одной линией. Вместо создания SCRIPT элемента в свой код вы помещаете содержимое следующего файла
https://cdn.antcpt.com/imacros_inclusion/recaptcha.ai-sl.js .
Весь код решения капчи и модулей зашит в одну большую-большую строку. Это неудобно, некрасиво и не рекомендуется. Но иногда другого пути просто нет.

Пример решения Рекапчи для Headless Chrome с использованием Puppeteer

Puppeteer — библиотека на NodeJS, которая обеспечивает высокоуровневое API для контроля хеадлесс Chrome или Chromium при помощи DevTools Protocol. Может звучать страшно, но на деле оказывается хорошей штукой для автоматизации действий в хедлесс Хроме, позволяет делать многое разными способами. Смотрите в документации способ установки и базовые примеры.

Приведенный ниже код заходит на страницу с тестовой Рекапчей, решает ее и отправляет форму. Далее делается скриншот для большей наглядности. Для решения Рекапчи как всегда создается DIV, в который помещается AntiCaptcha API ключ, а затем подключается уже знакомый нам https://cdn.antcpt.com/imacros_inclusion/recaptcha.js файл.

const puppeteer = require('puppeteer'); puppeteer.launch().then(async (browser) => { const page = await browser.newPage(); // устанавлицаем размер окна page.setViewport({ width: 1024, height: 768 }); // выводим дебаг информацию от anti-captcha solver page.on('console', msg => { for (let i = 0; i < msg.args().length; ++i) { console.log(`${i}: ${msg.args()[i]}`); } }); page.once('load', async () => { // Записываем Anti-Captcha API ключ в элемент DIV#anticaptcha-imacros-account-key element await page.evaluate(() => { var antcptAccountKeyDiv = document.getElementById("anticaptcha-imacros-account-key"); if (!antcptAccountKeyDiv) { antcptAccountKeyDiv = document.createElement("div"); // Поместите сюда ваш Anti-Captcha API ключ antcptAccountKeyDiv.innerHTML = "YOUR-ANTI-CAPTCHA-API-KEY"; antcptAccountKeyDiv.style.display = "none"; antcptAccountKeyDiv.id = "anticaptcha-imacros-account-key"; document.body.appendChild(antcptAccountKeyDiv); } }); // Подключение recaptcha.js файла с функционалом разгадывания рекапчи await page.addScriptTag({ url: 'https://cdn.antcpt.com/imacros_inclusion/recaptcha.js'}); // Заполняем текстовое поле тестовым значением await page.$eval('input[name=demo_text]', el => el.value = 'Test message'); // Самая важная чаcть: ждем 120 секунд пока индикатор антикаптчи с классом antigate_solver // не получит класс solved, что означает что рекапча решена await page.waitForSelector('.antigate_solver.solved', { timeout: 120 * 1000 }); // Отправляем форму и ждем загрузки страницы const navigationPromise = page.waitForNavigation(); page.click(['input[type=submit]']); await navigationPromise; // Проверяем все ли правильно мы сделали await page.screenshot({ path: 'screenshot_solved.png' }); // Закрываем браузер await browser.close(); }); // Переходим на тестовую страницу await page.goto('https://antcpt.com/rus/information/demo-form/recaptcha-2.html'); });