Решение капчи для
Puppeteer
Проходите проверку прямо в ходе запуска, а не проваливайте задание. Рабочий пример на Node.js и три фактора, от которых зависит, будет ли принят ваш токен.
import puppeteer from "puppeteer";
const CAPTCHANO_KEY = "cn-YOUR_API_KEY";
async function solve(task) {
const headers = {
Authorization: `Bearer ${CAPTCHANO_KEY}`,
"Content-Type": "application/json",
};
const res = await fetch("https://api.captchano.com/v1/solve?wait=60", {
method: "POST",
headers,
body: JSON.stringify(task),
});
let data = await res.json();
// A solve can outlast the 60 s wait: poll the task until it finishes.
while (data.status === "queued" || data.status === "solving") {
await new Promise((r) => setTimeout(r, 5000));
const poll = await fetch(`https://api.captchano.com/v1/task/${data.id}`, { headers });
data = await poll.json();
}
if (data.status !== "ready") throw new Error(JSON.stringify(data.error ?? data));
return data.solution; // { token, userAgent }
}
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto("https://example.com/signup");
const sitekey = await page.$eval("[data-sitekey]", (el) => el.getAttribute("data-sitekey"));
const { token, userAgent } = await solve({ type: "turnstile", sitekey, url: page.url() });
// Turnstile binds the token to a user agent: replay the one it was minted with.
if (userAgent) await page.setUserAgent(userAgent);
await page.evaluate((t) => {
document.querySelector('[name="cf-turnstile-response"]').value = t;
}, token);
await page.click('button[type="submit"]');От чего зависит, будет ли принят токен
- Передавайте свой прокси. Токен должен быть получен с того же исходящего IP, с которого он отправляется. Для систем с оценкой сессии это обязательное условие, а не оптимизация.
- Совпадение user agent. Turnstile и ряд антибот-систем привязывают токен к user agent. Мы возвращаем использованный user agent, чтобы вы могли воспроизвести его в точности.
- Запрашивайте как можно позже. Токены истекают примерно через 120 секунд. Запрашивайте токен, когда будете готовы к отправке.
Блокирующий вызов или опрос
В примере используется ?wait=60, поэтому вызов возвращает готовое решение, и шаг в Puppeteer остаётся линейным. Если не хотите держать соединение, уберите параметр, сохраните полученный id и опрашивайте GET /v1/task/{id} каждые пять секунд. Оплаченный токен можно получить в течение десяти минут, так что обрыв соединения не стоит вам решения.
Стоимость
$0.00598 за каждое успешное решение reCAPTCHA v2; неудачные решения никогда не оплачиваются. Цены на все типы проверок — на странице цен, полный формат запроса — в справочнике API.
Как решение встраивается в Puppeteer
Puppeteer управляет Chromium из Node.js. Решение — это один fetch между page.goto и нажатием кнопки отправки, а page.evaluate помещает токен туда, где его ожидает страница.
- 01Запустите с вашим прокси
Запустите Chromium с --proxy-server и задайте user agent, который передадите в запрос на решение.
- 02Прочитайте sitekey
page.$eval('[data-sitekey]', el => el.dataset.sitekey) и имя callback, если оно есть.
- 03Решите
Вызовите API через fetch с ?wait=60; ответ содержит токен и использованный user agent.
- 04Подставьте токен и отправьте
page.evaluate, чтобы записать токен и вызвать callback, затем нажмите кнопку отправки.
Как передать токен на страницу
page.evaluate заполняет поле ответа и вызывает callback в контексте страницы.
Где интеграции обычно ломаются
Chromium игнорирует учётные данные в --proxy-server. Используйте page.authenticate для браузера и передавайте полный URL прокси в запрос на решение.
Виджет находится в iframe, а поле ответа — в основном фрейме. Подставляйте токен в основном фрейме.
Токены одноразовые. Если отправка не удалась, решите капчу заново, а не используйте первый токен повторно.
Частые вопросы о капче в Puppeteer
Нужен ли puppeteer-extra или плагин для капчи?
Нет. Достаточно одного fetch к API и одного вызова page.evaluate, и вы полностью контролируете, когда происходит решение и сколько оно стоит.
Работает ли это в headless-режиме?
Да. Токен выпускается нашей инфраструктурой, а не вашим браузером, поэтому для самого решения не важно, headless он или нет. Сайты могут относиться к headless-браузерам с большим подозрением, поэтому реалистичный user agent всё равно помогает.
Можно ли использовать это с Playwright для Node?
Да. Код почти идентичен; page.evaluate и page.locator из Playwright заменяют аналоги из Puppeteer.
Как решить Cloudflare Turnstile в Puppeteer?
Прочитайте sitekey из виджета Turnstile, отправьте type turnstile с URL страницы, затем задайте значение поля cf-turnstile-response и вызовите callback, если страница его объявляет.
Полезные руководства
Готовы начать?
Начните с бесплатного 3-дневного пробного периода, а по мере роста трафика платите за каждое успешное решение. Для пробного периода карта не нужна.