Integrations

Axios + CaptchaAI: Selesaikan CAPTCHA Tanpa Browser

Server otomatisasi Anda tidak perlu menjalankan Chromium untuk menyelesaikan reCAPTCHA v2, Cloudflare Turnstile, atau CAPTCHA gambar. Axios plus CaptchaAI menangani semuanya lewat permintaan HTTP biasa — satu API key, dua endpoint (in.php dan res.php), dan token siap dipakai dalam hitungan detik. Tidak ada Puppeteer, tidak ada Playwright, tidak ada RAM yang terbuang untuk instans browser yang cuma dipakai menyelesaikan satu tantangan.

Yang Anda perlukan sebelum mulai

Setup-nya minim. Tidak ada driver browser, tidak ada dependency aneh-aneh — cuma client HTTP yang mungkin sudah Anda pakai sehari-hari:

Persyaratan Detail
Node.js 16 ke atas
Axios versi 1.x
API key CaptchaAI Ambil di sini
npm install axios

Bikin client CaptchaAI untuk Node.js

Class kecil ini membungkus dua endpoint CaptchaAI: in.php untuk mengirim task, res.php untuk polling hasil dan cek saldo. Simpan sebagai captchaai.js — semua contoh berikutnya tinggal require dari sini.

const axios = require("axios");

class CaptchaAI {
  constructor(apiKey) {
    this.apiKey = apiKey;
    this.baseUrl = "https://ocr.captchaai.com";
  }

  async submit(params) {
    params.key = this.apiKey;
    const resp = await axios.get(`${this.baseUrl}/in.php`, { params });
    const text = resp.data;

    if (!String(text).startsWith("OK|")) {
      throw new Error(`Submit failed: ${text}`);
    }
    return String(text).split("|")[1];
  }

  async poll(taskId, timeoutMs = 300000) {
    const deadline = Date.now() + timeoutMs;
    const params = { key: this.apiKey, action: "get", id: taskId };

    while (Date.now() < deadline) {
      await new Promise((r) => setTimeout(r, 5000));

      const resp = await axios.get(`${this.baseUrl}/res.php`, { params });
      const text = String(resp.data);

      if (text === "CAPCHA_NOT_READY") continue;
      if (text.startsWith("OK|")) return text.split("|").slice(1).join("|");
      throw new Error(`Solve failed: ${text}`);
    }
    throw new Error(`Timeout after ${timeoutMs}ms for task ${taskId}`);
  }

  async solve(params, timeoutMs = 300000) {
    const taskId = await this.submit(params);
    return this.poll(taskId, timeoutMs);
  }

  async getBalance() {
    const resp = await axios.get(`${this.baseUrl}/res.php`, {
      params: { key: this.apiKey, action: "getbalance" },
    });
    return parseFloat(resp.data);
  }
}

module.exports = CaptchaAI;

Method solve() menggabungkan submit dan polling jadi satu pemanggilan, jadi kode di bagian bawah cukup satu baris untuk dapat token.

Menyelesaikan reCAPTCHA v2 tanpa browser dengan Axios

Ini alur paling umum: kirim googlekey dan pageurl situs target, tunggu token, lalu kirim token itu bersama form login lewat axios.post. Tidak ada satu baris kode pun yang membuka browser.

const CaptchaAI = require("./captchaai");

async function main() {
  const solver = new CaptchaAI(process.env.CAPTCHAAI_API_KEY);

  // Solve the CAPTCHA without opening any browser
  const token = await solver.solve({
    method: "userrecaptcha",
    googlekey: "6Le-wvkS...",
    pageurl: "https://staging.example.com/qa-login",
  });

  // Submit form with the token using Axios
  const resp = await axios.post("https://staging.example.com/qa-login", {
    username: "user",
    password: "pass",
    "g-recaptcha-response": token,
  });

  console.log(`Login response: ${resp.status}`);
}

main().catch(console.error);

Menyelesaikan Cloudflare Turnstile tanpa browser

Turnstile jalan dengan pola API yang sama — cuma ganti method jadi turnstile dan kirim sitekey-nya. Token hasilnya dipasang ke field cf-turnstile-response, persis seperti kalau Turnstile-nya diselesaikan lewat widget di browser.

const token = await solver.solve({
  method: "turnstile",
  sitekey: "0x4AAAAA...",
  pageurl: "https://example.com",
});

// Submit with Turnstile token
const resp = await axios.post("https://example.com/api/verify", {
  "cf-turnstile-response": token,
  data: "payload",
});

Menyelesaikan CAPTCHA gambar (OCR)

Untuk CAPTCHA gambar klasik — teks di atas background bising — cukup baca file-nya, encode base64, dan kirim sebagai body. CaptchaAI membalas teksnya langsung, tanpa token JavaScript yang perlu di-inject ke halaman.

const fs = require("fs");

const imageBuffer = fs.readFileSync("captcha.png");
const imageB64 = imageBuffer.toString("base64");

const text = await solver.solve({
  method: "base64",
  body: imageB64,
});

console.log(`CAPTCHA text: ${text}`);

// Submit form with solved text
const resp = await axios.post("https://example.com/verify", {
  captcha: text,
  other_data: "value",
});

Alur kerja scraping lengkap tanpa browser

Gabungan semua bagian di atas jadi satu fungsi scraping: fetch halaman dengan Axios, cek ada-tidaknya reCAPTCHA lewat Cheerio, selesaikan kalau ada, lalu submit form beserta field lain yang sudah ada di HTML-nya.

const CaptchaAI = require("./captchaai");
const axios = require("axios");
const cheerio = require("cheerio");

async function scrapeProtectedPage(url) {
  const solver = new CaptchaAI(process.env.CAPTCHAAI_API_KEY);

  // Step 1: Fetch the page
  const page = await axios.get(url);
  const $ = cheerio.load(page.data);

  // Step 2: Extract the reCAPTCHA site key
  const siteKey = $(".g-recaptcha").attr("data-sitekey");
  if (!siteKey) {
    console.log("No CAPTCHA found, returning page content");
    return page.data;
  }

  // Step 3: Solve the CAPTCHA
  console.log(`Solving CAPTCHA for ${url}...`);
  const token = await solver.solve({
    method: "userrecaptcha",
    googlekey: siteKey,
    pageurl: url,
  });

  // Step 4: Submit form with token
  const formAction = $("form").attr("action") || url;
  const formData = {};

  $("form input").each((_, el) => {
    const name = $(el).attr("name");
    const value = $(el).attr("value") || "";
    if (name) formData[name] = value;
  });
  formData["g-recaptcha-response"] = token;

  const result = await axios.post(formAction, new URLSearchParams(formData), {
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
  });

  return result.data;
}

scrapeProtectedPage("https://example.com/data")
  .then((data) => console.log("Success:", typeof data))
  .catch(console.error);

Kalau server tempat script ini jalan ada di region Asia Tenggara — AWS ap-southeast-1 (Singapura), AWS ap-southeast-3 (Jakarta), atau GCP asia-southeast2 — latensi ke endpoint CaptchaAI dan ke situs target jadi lebih rendah dibanding kalau worker-nya jalan dari region lain, dan itu langsung kelihatan di waktu total tiap request scraping.

Menjalankan banyak task CAPTCHA sekaligus

Kalau butuh scraping puluhan URL secara paralel, jalankan solve() di dalam Promise.all — bukan loop for yang menunggu satu per satu. Setiap task CAPTCHA jalan di thread-nya sendiri di sisi CaptchaAI.

async function solveBatch(urls, siteKey) {
  const solver = new CaptchaAI(process.env.CAPTCHAAI_API_KEY);

  const promises = urls.map(async (url) => {
    try {
      const token = await solver.solve({
        method: "userrecaptcha",
        googlekey: siteKey,
        pageurl: url,
      });
      return { url, token, error: null };
    } catch (error) {
      return { url, token: null, error: error.message };
    }
  });

  const results = await Promise.all(promises);

  const solved = results.filter((r) => r.token);
  console.log(`Solved ${solved.length}/${urls.length}`);
  return results;
}

Jumlah task yang benar-benar jalan bersamaan dibatasi oleh jumlah thread di paket CaptchaAI Anda, bukan oleh Axios atau Node.js — jadi kalau solveBatch di atas kelihatan lambat, cek dulu paket thread yang dipakai sebelum menambah concurrency di kode.

Kenapa model thread ini relevan untuk tim otomatisasi di Indonesia

Banyak automation dan scraping freelancer di Indonesia — yang biasa ambil job lewat Upwork atau Fastwork, atau jalanin agency monitoring harga kecil — kerja dengan margin tipis, jadi model harga per thread milik CaptchaAI umumnya lebih gampang dihitung dibanding skema per-solve. Paket BASIC ($15/bulan, 5 thread) dan STANDARD ($30/bulan, 15 thread) sudah cukup untuk job seperti solveBatch di atas dengan puluhan URL yang jalan bertahap. Begitu volumenya naik ke ratusan task paralel, ADVANCE ($90/bulan, 50 thread) atau PREMIUM ($170/bulan, 100 thread) lebih masuk akal, karena satu thread yang sudah dibayar bisa dipakai berkali-kali tanpa biaya tambahan per solve. Cek daftar paket lengkap di captchaai.com sebelum menentukan berapa banyak thread yang Anda butuhkan.

Satu catatan kepatuhan: kalau halaman yang di-scraping mengandung data pribadi, UU Pelindungan Data Pribadi (UU 27/2022) tetap berlaku terlepas dari CAPTCHA-nya diselesaikan pakai browser atau tidak — pastikan Anda hanya mengambil data yang memang berwenang Anda proses.

Error yang sering muncul dan cara mengatasinya

Sebagian besar error di alur tanpa browser ini gampang didiagnosis karena semuanya lewat HTTP biasa — tidak ada screenshot browser yang perlu dicek, cukup baca pesan error dari Axios atau dari respons CaptchaAI:

Error Penyebab Solusi
AxiosError: getaddrinfo ENOTFOUND Masalah DNS Periksa konektivitas jaringan
Submit failed: ERROR_WRONG_USER_KEY API key salah Verifikasi API key dari dashboard
Submit failed: ERROR_ZERO_BALANCE Saldo habis Tambahkan saldo ke akun
Token ditolak situs target Token sudah kedaluwarsa Kirim token dalam 60 detik setelah diterima

Kalau worker Anda jalan dari koneksi yang kurang stabil, naikkan timeoutMs di method poll() daripada memperpendeknya — CaptchaAI tetap butuh waktu penyelesaian yang wajar tergantung tipe CAPTCHA-nya.

Pertanyaan umum

Berapa biaya menjalankan setup Axios + CaptchaAI seperti ini?

CaptchaAI pakai model thread-based, bukan per-solve — paket BASIC mulai $15/bulan untuk 5 thread dengan solve tanpa batas selama thread-nya terpakai. Untuk job paralel seperti solveBatch di atas, hitung dulu berapa banyak task yang benar-benar jalan bersamaan, baru pilih paket yang thread-nya cukup.

Axios saja cukup, atau saya tetap perlu Puppeteer untuk sebagian alur?

Untuk penyelesaian CAPTCHA-nya sendiri, Axios saja sudah cukup — CaptchaAI menyelesaikannya dari sisi mereka, bukan di browser Anda. Puppeteer atau Playwright baru relevan kalau konten halaman targetnya sendiri butuh JavaScript untuk di-render, di luar urusan CAPTCHA.

Amankah menyimpan API key CaptchaAI langsung di kode?

Sebaiknya tidak. Simpan di environment variable seperti pada contoh (process.env.CAPTCHAAI_API_KEY), muat lewat file .env yang di-gitignore, dan jangan pernah commit API key ke repository.

Bisa pakai fetch bawaan Node.js daripada Axios?

Bisa. Node.js 18 ke atas sudah menyertakan fetch native, dan parameter API CaptchaAI-nya tetap sama — tinggal ganti pemanggilan HTTP-nya, logika submit dan polling di atas tidak berubah.

Apakah scraping dengan pendekatan ini melanggar UU PDP?

Tergantung datanya. UU Pelindungan Data Pribadi (UU 27/2022) tetap berlaku apa pun cara Anda menyelesaikan CAPTCHA-nya — ambil hanya data yang memang berwenang Anda proses; ini bukan pengganti nasihat hukum.

Baca juga

Komentar dinonaktifkan untuk artikel ini.