Scarnox · Blog

Captcha solver ใน Node.js: ตัวอย่างการทำงานด้วย fetch (2026)

captcha solver ใน Node.js คือคำขอ HTTP หนึ่งครั้ง Node 18 ขึ้นไปมี fetch มาให้ จึงไม่ต้องใช้แพ็กเกจในการเรียก API ส่ง sitekey และ URL ของหน้า รอการตอบกลับ แล้วใส่ token ลงในฟอร์ม คู่มือนี้แสดงโฟลว์ทั้งหมดสำหรับ PopularCaptcha ซึ่ง Scarnox แก้ได้ในวันนี้แบบ proxyless

เริ่มด้วยเครดิตทดลองใช้ฟรี ไม่ต้องใช้บัตร และรันโค้ดด้านล่างกับหน้าทดสอบก่อน

สิ่งที่ต้องมี

โมดูล solver

โมดูลด้านล่างเป็นฟังก์ชันเดียว มันโพสต์ไปยัง API พร้อม Bearer header หยุดหลัง 185 วินาที และโยน error เมื่อ errorId ไม่ใช่ 0

// solver.mjs
const API_URL = "https://api.scarnox.com/api/tasks/create";

export async function solveCaptcha(sitekey, pageUrl, { invisible = false } = {}) {
  const body = {
    captcha_type: "PopularCaptchaTaskProxyless",
    site_key: sitekey,
    site_url: pageUrl,
  };
  if (invisible) body.is_invisible = true;

  const res = await fetch(API_URL, {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.SCARNOX_API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify(body),
    signal: AbortSignal.timeout(185_000), // การเรียกจะส่งกลับเมื่อ token พร้อมแล้ว
  });

  const data = await res.json().catch(() => null);
  if (!data) throw new Error(`HTTP ${res.status}: response was not JSON`);

  if (data.errorId !== 0) {
    throw new Error(`${data.errorCode}: ${data.errorDescription}`);
  }
  return data.solution.token;
}

ไม่มีการ polling คำขอจะเปิดค้างจนกว่า token จะพร้อม และ token อยู่ที่ solution.token เมื่อสำเร็จ

การลองใหม่

การแก้ที่ล้มเหลวจะส่ง errorId ที่ไม่ใช่ 0 และคุณจะไม่ถูกเรียกเก็บเงิน ลูปลองใหม่สั้น ๆ ก็เพียงพอสำหรับความล้มเหลวชั่วคราว ให้จำนวนความพยายามน้อย เพื่อไม่ให้ sitekey หรือ URL ของหน้าที่ผิดกินเวลาไปมาก

export async function solveWithRetry(sitekey, pageUrl, attempts = 3) {
  let lastError;
  for (let i = 1; i <= attempts; i++) {
    try {
      return await solveCaptcha(sitekey, pageUrl);
    } catch (err) {
      lastError = err;
      console.warn(`Attempt ${i} failed: ${err.message}`);
      await new Promise((r) => setTimeout(r, 1000 * i));
    }
  }
  throw lastError;
}

สำหรับนโยบายข้อผิดพลาดที่ครบกว่า ดูการจัดการข้อผิดพลาดของ captcha solver

การ submit token

token ต้องใส่ลงในฟิลด์ฟอร์มที่เว็บคาดหวัง เว็บ PopularCaptcha ส่วนใหญ่อ่าน h-captcha-response และหลายเว็บอ่าน g-recaptcha-response ด้วย ส่งทั้งสองเพื่อความปลอดภัย

// submit.mjs
import { solveWithRetry } from "./solver.mjs";

const pageUrl = "https://example.com/signup";
const token = await solveWithRetry("YOUR-SITEKEY-UUID", pageUrl);

const form = new URLSearchParams({
  email: "you@example.com",
  "h-captcha-response": token,
  "g-recaptcha-response": token,
});

const res = await fetch(pageUrl, {
  method: "POST",
  body: form,
  redirect: "manual",
});
console.log("Status:", res.status);

รันด้วยคำสั่ง:

SCARNOX_API_KEY=scarnox_YOURAPIKEY node submit.mjs

fetch ธรรมดาไม่เก็บ cookie ระหว่างคำขอ หน้าสมัครสมาชิกและค้นหาหลายแห่งผูก captcha กับ session cookie ดังนั้น token ที่ส่งโดยไม่มี cookie ที่ตรงกันอาจถูกปฏิเสธ มีสองวิธีในการจัดการ

เลือกวิธีแรกเมื่อฟอร์มเรียบง่ายและเว็บไม่ได้รัน JavaScript มากนัก เลือกวิธีที่สองสำหรับกรณีที่ซับซ้อนกว่า

การตรวจสอบเชิงปฏิบัติ: หลัง POST ให้ดูสถานะ HTTP และ URL สุดท้าย การ redirect ไปหน้าสำเร็จมักหมายความว่า token ถูกยอมรับ หน้าที่แสดง widget อีกครั้งมักหมายความว่าถูกปฏิเสธ หรือ cookie จาก GET ไม่ได้ถูกส่งไปด้วย บันทึกเนื้อหาการตอบกลับในการรันไม่กี่ครั้งแรก เพื่อให้คุณรู้ว่าตัวเองอยู่ในกรณีใด

การจับเวลา

token หมดอายุภายในประมาณสองนาที แก้ใกล้เวลาที่คุณจะ submit ความผิดพลาดที่พบบ่อยคือการแก้ตอนเริ่มงานยาว ๆ แล้ว submit ทีหลัง แก้แล้ว submit ทันที อายุของ captcha token ครอบคลุมเรื่องนี้ละเอียดกว่า

captcha แบบ invisible

หาก widget ของหน้ามี data-size="invisible" ให้ส่ง { invisible: true } ฟังก์ชันจะส่ง is_invisible: true พร้อมคำขอ

const token = await solveCaptcha("YOUR-SITEKEY-UUID", pageUrl, { invisible: true });

หากหน้าผูก callback กับ widget ฟอร์มอาจต้องเรียกฟังก์ชันนั้นพร้อม token ให้อ่าน script ของหน้าเพื่อหาฟังก์ชัน คู่มือ invisible captcha ครอบคลุมรูปแบบต่าง ๆ

การ scrape ด้วย solver

บางครั้ง captcha ปรากฏในหน้าที่คุณ scrape ไม่ใช่ฟอร์มที่คุณ submit รูปแบบเดิมใช้ได้: ตรวจจับ widget ใน HTML แก้ แล้ว submit ไปยัง URL ที่ widget โพสต์ไป รักษาอัตราคำขอให้ต่ำ และตรวจสอบข้อกำหนดของเว็บก่อน scrape อย่างรับผิดชอบ: เคารพ robots.txt หลีกเลี่ยงข้อมูลส่วนบุคคลที่ไม่จำเป็น และอย่ากระหน่ำเซิร์ฟเวอร์

ราคา

Scarnox คิดเงินต่อการแก้ที่สำเร็จ การแก้ที่ล้มเหลวไม่ถูกเรียกเก็บเงิน สำหรับอัตรา ดูหน้าราคา และเพื่อเริ่มต้นเริ่มด้วยเครดิตทดลองใช้ฟรี ไม่ต้องใช้บัตร

ขั้นตอนถัดไป