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