Captcha solver ใน Node.js: ตัวอย่างการทำงานด้วย fetch (2026)
captcha solver ใน Node.js คือคำขอ HTTP หนึ่งครั้ง Node 18 ขึ้นไปมี fetch มาให้ จึงไม่ต้องใช้แพ็กเกจในการเรียก API ส่ง sitekey และ URL ของหน้า รอการตอบกลับ แล้วใส่ token ลงในฟอร์ม คู่มือนี้แสดงโฟลว์ทั้งหมดสำหรับ PopularCaptcha ซึ่ง Scarnox แก้ได้ในวันนี้แบบ proxyless
เริ่มด้วยเครดิตทดลองใช้ฟรี ไม่ต้องใช้บัตร และรันโค้ดด้านล่างกับหน้าทดสอบก่อน
สิ่งที่ต้องมี
- Node.js 18 ขึ้นไป (
node --version) - Scarnox API key เก็บไว้ใน environment variable
- sitekey ของ widget PopularCaptcha ในหน้า หากยังไม่มี ดูวิธีหา sitekey ของ captcha
โมดูล 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
cookie และ session
fetch ธรรมดาไม่เก็บ cookie ระหว่างคำขอ หน้าสมัครสมาชิกและค้นหาหลายแห่งผูก captcha กับ session cookie ดังนั้น token ที่ส่งโดยไม่มี cookie ที่ตรงกันอาจถูกปฏิเสธ มีสองวิธีในการจัดการ
- คัดลอกค่า
set-cookieจากการตอบกลับของ GET แล้วส่งกลับมาในคำขอ POST - ใช้เครื่องมือ browser automation ที่เก็บ session ให้คุณ ดู การแก้ captcha ด้วย Playwright และ Puppeteer
เลือกวิธีแรกเมื่อฟอร์มเรียบง่ายและเว็บไม่ได้รัน 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 คิดเงินต่อการแก้ที่สำเร็จ การแก้ที่ล้มเหลวไม่ถูกเรียกเก็บเงิน สำหรับอัตรา ดูหน้าราคา และเพื่อเริ่มต้นเริ่มด้วยเครดิตทดลองใช้ฟรี ไม่ต้องใช้บัตร