Puppeteer Captcha Solver

Automatically solve image CAPTCHAs in your Puppeteer Node.js automations. Screenshot the CAPTCHA, solve it in 0.3s with FastCaptcha, and type the answer β€” all programmatically.

Puppeteer Quick Start

Install

npm install puppeteer axios form-data

Basic solve

const puppeteer = require("puppeteer");
const axios = require("axios");
const FormData = require("form-data");

const API_KEY = "YOUR_API_KEY";

async function solveCaptcha(imageBuffer) {
  const form = new FormData();
  form.append("image", imageBuffer, {
    filename: "captcha.png",
    contentType: "image/png",
  });
  const { data } = await axios.post(
    "https://fastcaptcha.org/api/v1/ocr/",
    form,
    {
      headers: {
        "X-API-Key": API_KEY,
        ...form.getHeaders(),
      },
      timeout: 15000,
    }
  );
  if (!data.success) throw new Error(data.error);
  return data.text;
}

(async () => {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();
  await page.goto("https://example.com/login");

  // Wait for captcha to load
  await page.waitForSelector("img#captcha");

  // Screenshot just the captcha element
  const captchaEl = await page.$("img#captcha");
  const imgBuffer = await captchaEl.screenshot();

  // Solve it
  const answer = await solveCaptcha(imgBuffer);
  console.log("Captcha answer:", answer);

  // Type the answer
  await page.type("#captcha-input", answer);
  await page.click("#submit-btn");
  await page.waitForNavigation();

  await browser.close();
})();

Reusable helper + canvas support

async function getCaptchaImage(page, selector) {
  // Try <img> element first
  const imgEl = await page.$(selector);
  if (imgEl) {
    return await imgEl.screenshot();
  }

  // Fallback: canvas element
  const canvasData = await page.evaluate((sel) => {
    const el = document.querySelector(sel);
    if (el && el.tagName === "CANVAS") {
      return el.toDataURL("image/png").split(",")[1];
    }
    return null;
  }, selector);

  if (canvasData) {
    return Buffer.from(canvasData, "base64");
  }

  throw new Error("Captcha element not found: " + selector);
}

async function autoSolveCaptcha(page, {
  imgSelector = "img.captcha",
  inputSelector = "#captcha-input",
} = {}) {
  const imgBuffer = await getCaptchaImage(page, imgSelector);
  const answer = await solveCaptcha(imgBuffer);
  await page.type(inputSelector, answer);
  return answer;
}

// Usage:
// await autoSolveCaptcha(page, {
//   imgSelector: "img#captchaImg",
//   inputSelector: "input[name='captchaText']",
// });
πŸŽͺ
Headless & headed

Works in headless mode for CI/CD pipelines

⚑
0.3s solve time

Minimal latency impact on your automation

πŸ”
Retry-safe

Built-in retry with exponential backoff