Skip to content

ย้ายจาก reCAPTCHA มาใช้ Cap ​

Google กำลังย้าย reCAPTCHA เข้าไปอยู่ใน Google Cloud และย้ายคีย์ Classic ไปผูกกับโปรเจกต์ที่มีการเรียกเก็บเงินโดยอัตโนมัติ ยังไงคุณก็ต้องแตะโค้ดที่ผนวกไว้อยู่ดี ข่าวดีคือ นี่เป็นข้ออ้างชั้นดีที่จะทิ้ง CAPTCHA ที่อิงการติดตามของ Google แล้วเปลี่ยนไปใช้อะไรที่เร็วกว่า เป็นส่วนตัวกว่า และฟรี

Cap ใช้แทนได้แทบทันทีในส่วนที่สำคัญ และเป็นการอัปเกรดในเกือบทุกเรื่องที่เหลือ

ทำไมทีมต่าง ๆ ถึงเปลี่ยนมาใช้ Cap ​

  • ตรวจจับได้ระดับเดียวกับ Turnstile โดยไม่ต้องมีบุคคลที่สาม Cap จับคู่ proof-of-work เข้ากับ challenge แบบ instrumentation ซึ่งเป็นเทคนิคยืนยันเบราว์เซอร์แบบเดียวกับที่ YouTube และ Twitter/X ใช้ในสเกลมหาศาล มันอยู่ในระดับการตรวจจับเดียวกับ Cloudflare Turnstile ขณะที่ยังโฮสต์เองได้ทั้งหมด
  • พิสูจน์แล้วในสเกลใหญ่ มี challenge ถูกแก้ราว 1 พันล้านครั้งในไตรมาสแรกของปี 2026 เพียงไตรมาสเดียว (อ้างอิงจาก JSDelivr) และถูกใช้จริงบนโปรดักชันโดยทีมอย่าง AdGuard และ Bunny.net นี่ไม่ใช่ของทดลอง
  • น้ำหนักเพียงเศษเสี้ยว และล่องหน วิดเจ็ตของ Cap หนักราว 21 KB เมื่อบีบอัดด้วย gzip เทียบกับไคลเอนต์ของ reCAPTCHA ที่ 200 ถึง 600 KB ซึ่งมักลดลงถึง 10 เท่าหรือมากกว่า challenge ค่าเริ่มต้นแก้เสร็จใน 2-3 วินาทีอยู่เบื้องหลัง ไม่มีปริศนาไฟจราจร และผู้ใช้ไม่ต้องคลิกอะไรเลย
  • ฟรีจริง ไม่มีมิเตอร์ ไม่ต้องมีโปรเจกต์ Google Cloud ไม่ต้องมีบัญชีเรียกเก็บเงิน ไม่มีค่าธรรมเนียมต่อการประเมิน คอนเทนเนอร์ Docker หนึ่งตัวกับ Valkey หนึ่งอินสแตนซ์รองรับงานส่วนใหญ่ได้บน VPS ราคา $5
  • เป็นส่วนตัวโดยค่าเริ่มต้น reCAPTCHA โหลดสคริปต์จาก google.com และส่งสัญญาณเกี่ยวกับผู้ใช้ไปให้ Google ส่วน Cap ไม่ส่งข้อมูลไปไหนเลย ไม่มีอะไรจากบุคคลที่สามมาแตะหน้าเว็บของคุณ
  • คุณเป็นคนถือคันบังคับ reCAPTCHA v3 ลงโทษผู้ใช้ VPN, Tor และเบราว์เซอร์ที่เน้นความเป็นส่วนตัวอย่างเงียบ ๆ โดยไม่มีทางอุทธรณ์ ส่วน Cap ให้คุณตั้งความยากเอง และผู้ใช้จริงทุกคนมีทางผ่านเสมอ
  • โอเพนซอร์สตลอดไป Apache 2.0 ตรวจสอบได้ fork ได้ ดีพลอยเองได้ ไม่มีผู้ให้บริการรายไหนมาเปลี่ยนเงื่อนไขใส่คุณได้

ดูรายละเอียดเต็มได้ที่ Cap กับ reCAPTCHA

reCAPTCHA กำลังเปลี่ยนอะไรบ้าง ​

ถ้าคุณอยากรู้ที่มาว่าทำไมอีเมลเรื่องการย้ายระบบถึงมาถึงตอนนี้:

  • คอนโซลผู้ดูแลระบบ reCAPTCHA แบบเดิมสร้างคีย์ใหม่ไม่ได้อีกต่อไป
  • คีย์ reCAPTCHA Classic ที่มีอยู่กำลังถูกย้ายเข้าโปรเจกต์ Google Cloud โดยอัตโนมัติ ซึ่ง Google ทยอยทำมาตั้งแต่ปลายปี 2025 จนถึงปี 2026
  • เมื่อย้ายแล้ว การเข้าถึง API ของคีย์จะผูกกับโปรเจกต์ Google Cloud และเมื่อเกินโควตาฟรีที่ 10,000 การประเมินต่อเดือน คุณต้องเปิดการเรียกเก็บเงินในโปรเจกต์นั้น

การอยู่กับ reCAPTCHA ต่อไปตอนนี้หมายถึงต้องมีโปรเจกต์ Google Cloud ต้องผูกบัญชีเรียกเก็บเงิน และมีการนับจำนวนการประเมิน ส่วนการย้ายมา Cap ไม่ต้องมีอะไรในนั้นเลย และคุณเป็นคนกำหนดจังหวะเวลาเอง

การย้ายระบบทำอย่างไร ​

endpoint /siteverify ของ Cap ตั้งใจสะท้อนรูปแบบคำขอของ reCAPTCHA ฝั่งเซิร์ฟเวอร์จึงแทบเปลี่ยนแล้วใช้ได้เลย ส่วนการเปลี่ยนวิดเจ็ตก็เป็นการแทนแท็กต่อแท็ก มีสามขั้นตอน และคุณรันทั้งสองระบบคู่ขนานระหว่างช่วงเปลี่ยนผ่านได้

1. ตั้งอินสแตนซ์ Cap ขึ้นมา ​

ทำตามคู่มือเริ่มต้นใช้งาน เพื่อรัน Cap Standalone ด้วย Docker สร้าง site key ในแดชบอร์ด แล้วจดทั้ง site key และ secret key ของมันไว้ ให้เปิด challenge แบบ instrumentation ไว้ (เป็นค่าเริ่มต้น) เพื่อการป้องกันบอทที่แข็งแรงที่สุด

2. เปลี่ยนวิดเจ็ตฝั่งไคลเอนต์ ​

แทนที่สคริปต์และอิลิเมนต์ของ reCAPTCHA ด้วยวิดเจ็ตของ Cap

ก่อน:

html
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<div class="g-recaptcha" data-sitekey="<your-recaptcha-site-key>"></div>

หลัง:

html
<script src="https://cdn.jsdelivr.net/npm/cap-widget"></script>
<cap-widget data-cap-api-endpoint="https://<your-instance>/<site-key>/"></cap-widget>

ถ้าวิดเจ็ต reCAPTCHA ของคุณอยู่ใน <form> การจัดการ token ก็ยกมาได้เลย เพราะ reCAPTCHA แทรกฟิลด์ g-recaptcha-response ให้อัตโนมัติ ส่วน Cap แทรกฟิลด์ cap-token ให้อัตโนมัติตอนส่งฟอร์ม แต่ถ้าอยู่นอกฟอร์ม ให้ดักฟังเหตุการณ์ solve:

js
document.querySelector("cap-widget").addEventListener("solve", (e) => {
  const token = e.detail.token;
});

3. เปลี่ยนการตรวจสอบฝั่งเซิร์ฟเวอร์ ​

การตรวจสอบของ reCAPTCHA จะ POST ค่า secret และ response ไปยัง URL ของ Google ที่ตายตัว ส่วน Cap รับพารามิเตอร์สองตัวเดียวกัน แต่ POST ไปยังอินสแตนซ์ของคุณเอง:

ก่อน:

js
const { success } = await (
  await fetch("https://www.google.com/recaptcha/api/siteverify", {
    method: "POST",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body: new URLSearchParams({ secret: RECAPTCHA_SECRET, response: token }),
  })
).json();

หลัง:

js
const { success } = await (
  await fetch("https://<your-instance>/<site-key>/siteverify", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ secret: CAP_SECRET, response: token }),
  })
).json();

ชื่อ token ที่เซิร์ฟเวอร์ของคุณอ่านก็เปลี่ยนด้วย ให้ดึง cap-token จากฟอร์มที่ส่งมา (หรือค่าที่คุณเก็บได้จากเหตุการณ์ solve) แทน g-recaptcha-response

อะไรเข้ากันได้ และอะไรไม่เข้ากัน ​

เราอยากให้คุณย้ายระบบโดยรู้ครบทุกด้าน ดีกว่าไปเจอเรื่องไม่คาดคิดบนโปรดักชัน ความเข้ากันได้นั้นมีจริง แต่ไม่ได้เหมือนกันทุกไบต์:

reCAPTCHACap
พารามิเตอร์ของคำขอsecret, response และ remoteip (ไม่บังคับ)secret, response (remoteip จะถูกละเลย)
EndpointURL ของ google.com ที่ตายตัว/<site-key>/siteverify ของคุณเอง
ฟิลด์บอกความสำเร็จsuccess (บูลีน)success (บูลีน)
การรายงานข้อผิดพลาดerror-codes (อาร์เรย์)error (สตริง)
ฟิลด์เพิ่มเติมchallenge_ts, hostname, score (v3)ไม่มี

ในทางปฏิบัติ:

  • โค้ดที่เช็กแค่ response.success ใช้งานได้ทันทีหลังเปลี่ยน URL และ secret ซึ่งเป็นกรณีที่พบบ่อยที่สุด และเป็นการแก้เพียงบรรทัดเดียว
  • โค้ดที่ไปดู error-codes, challenge_ts, hostname หรือ score ของ v3 ต้องแก้ เพราะ Cap เป็นระบบยืนยัน ไม่ใช่ระบบให้คะแนนความเสี่ยงเชิงพฤติกรรม ฟิลด์เหล่านั้นจึงไม่มี
  • ถ้าคุณใช้ SDK ฝั่งแบ็กเอนด์ที่ฝัง URL ตรวจสอบของ Google ไว้ตายตัว ให้เปลี่ยนไปใช้ตัวที่ตั้ง endpoint เองได้ หรือเรียก /siteverify ตรง ๆ เพราะมีแค่สองพารามิเตอร์เท่านั้น

ย้ายระบบโดยไม่มีเวลาหยุดทำงาน ​

คุณไม่ต้องสลับสวิตช์แล้วภาวนา ให้ติดตั้ง Cap ไว้กับอิลิเมนต์แยกต่างหาก แล้วให้แบ็กเอนด์ยอมรับได้ทั้ง cap-token ที่ถูกต้องหรือ g-recaptcha-response ที่ถูกต้องในช่วงเปลี่ยนผ่าน จับตาดูอัตราการตรวจสอบผ่านของ Cap ในบันทึกล็อกของคุณ เมื่อดูแล้วเรียบร้อยดี จึงลบสคริปต์ อิลิเมนต์ และการเรียกฝั่งเซิร์ฟเวอร์ของ reCAPTCHA ออก ทีมส่วนใหญ่ทำการเปลี่ยนผ่านเสร็จภายในบ่ายเดียว

ดูเพิ่มเติม ​

เผยแพร่ภายใต้สัญญาอนุญาต Apache 2.0