ประเภทงาน
Cloudflare Turnstile
หน้านี้แปลด้วยเครื่องจากเวอร์ชันภาษาจีน อาจมีข้อผิดพลาด โปรดยึดเวอร์ชันภาษาจีนเป็นหลัก
งาน Cloudflare Turnstile จะคืนค่า token (token) ให้นำไปส่งให้เว็บไซต์เป้าหมายเพื่อผ่านการตรวจสอบ TurnstileTaskProxyless ราคางานละ 25 พอยต์ (≈ $3.75 / 1k) ทำงานแบบอะซิงโครนัส: เรียก createTask ก่อน แล้วเรียก getTaskResult ทุก 5 วินาที หากจดจำไม่สำเร็จหรือหมดเวลา ระบบจะคืนพอยต์ให้อัตโนมัติ
https://api.yescaptcha.com/createTaskendpoint ทั่วโลกhttps://cn.yescaptcha.com/createTaskendpoint จีนเนื้อหาคำขอเป็น JSON และยืนยันตัวตนด้วย clientKey สร้างงานที่ endpoint ใด ให้ตรวจสอบผลลัพธ์ที่ endpoint เดียวกัน
เหมาะกับกรณีใด
หัวข้อที่มีชื่อว่า “เหมาะกับกรณีใด”ในฟอร์มของหน้าเว็บมีกล่องยืนยันของ Cloudflare ฝังอยู่ (“ยืนยันว่าคุณเป็นมนุษย์”) และหน้าเว็บโหลดสคริปต์จาก challenges.cloudflare.com/turnstile
หากทั้งหน้าถูก Cloudflare ขวางไว้และแสดงข้อความ “โปรดรอสักครู่…” หรือ “กำลังตรวจสอบเบราว์เซอร์ของคุณ” นั่นคือหน้าตรวจสอบของ Cloudflare ไม่ใช่ Turnstile ให้ใช้ หน้าตรวจสอบของ Cloudflare ดูความแตกต่างได้ที่ วิธีระบุประเภท CAPTCHA
ประเภทงานและราคา
หัวข้อที่มีชื่อว่า “ประเภทงานและราคา”| ประเภทงาน | ราคา | รูปแบบการคืนผลลัพธ์ | หมายเหตุ |
|---|---|---|---|
TurnstileTaskProxyless | $3.75 / 1k; 25 พอยต์/งาน · ¥25 / 1k | แบบอะซิงโครนัส | |
TurnstileTaskProxylessM1 | $4.50 / 1k; 30 พอยต์/งาน · ¥30 / 1k | แบบอะซิงโครนัส | |
TurnstileTask | $3.75 / 1k; 25 พอยต์/งาน · ¥25 / 1k | แบบอะซิงโครนัส | ใช้พร็อกซีของคุณเอง |
ราคาเป็นดอลลาร์สหรัฐเป็นเพียงค่าประมาณที่ US$1 ≈ ¥6.67 งานจะถูกหักเป็นพอยต์
TurnstileTaskProxylessและTurnstileTaskProxylessM1ใช้พารามิเตอร์เหมือนกันแต่ใช้คนละเส้นทาง จึงใช้สำรองแทนกันได้TurnstileTaskใช้พร็อกซีของคุณเองในการโหลด CAPTCHA ต้องส่งฟิลด์ของพร็อกซีด้วย
พารามิเตอร์ของคำขอ
หัวข้อที่มีชื่อว่า “พารามิเตอร์ของคำขอ”| ฟิลด์ | ประเภท | จำเป็น | คำอธิบาย |
|---|---|---|---|
type | string | ใช่ | ประเภทงาน ดูค่าที่ใช้ได้ในหัวข้อ "ประเภทงานและราคา" ของหน้านี้ |
websiteURL | string | ใช่ | URL แบบเต็มของหน้าเว็บที่แสดง CAPTCHA ให้ระบุเว็บไซต์ที่คุณเห็น CAPTCHA ไม่ใช่โดเมนของผู้ให้บริการ CAPTCHA |
websiteKey | string | ใช่ | คีย์ของเว็บไซต์ (sitekey) สำหรับ Turnstile โดยทั่วไปขึ้นต้นด้วย 0x |
pageAction | string | ไม่ | ค่า action ที่หน้าเว็บส่งให้ Turnstile (พารามิเตอร์ของ turnstile.render หรือ data-action บนองค์ประกอบของวิดเจ็ต) เช่น login ส่วนใหญ่ไม่จำเป็นต้องส่ง ให้เพิ่มเฉพาะเมื่องานล้มเหลวต่อเนื่อง |
data | string | ไม่ | ค่า cData ที่หน้าเว็บส่งให้ Turnstile (พารามิเตอร์ของ turnstile.render หรือ data-cdata บนองค์ประกอบของวิดเจ็ต) เช่น c0bd4b36-7419-4e18-83c6-378699f2a9a2 ส่วนใหญ่ไม่จำเป็นต้องส่ง ให้เพิ่มเฉพาะเมื่องานล้มเหลวต่อเนื่อง |
proxyType | string | บางประเภท | โปรโตคอลของพร็อกซี: http, https, socks4 หรือ socks5 (จำเป็นสำหรับ TurnstileTask) |
proxyAddress | string | บางประเภท | IP แอดเดรสหรือชื่อโฮสต์ของพร็อกซี ไม่สามารถใช้แอดเดรสภายในเครื่องหรือภายในเครือข่าย เช่น 127.0.0.1 หรือ 192.168.x.x ได้ เพราะเซิร์ฟเวอร์ของเราเข้าถึงไม่ได้ (จำเป็นสำหรับ TurnstileTask) |
proxyPort | integer | บางประเภท | พอร์ตของพร็อกซี (จำเป็นสำหรับ TurnstileTask) |
proxyLogin | string | ไม่ | ชื่อผู้ใช้ของพร็อกซี (เมื่อพร็อกซีต้องมีการยืนยันตัวตน) (เฉพาะ TurnstileTask) |
proxyPassword | string | ไม่ | รหัสผ่านของพร็อกซี (เมื่อพร็อกซีต้องมีการยืนยันตัวตน) (เฉพาะ TurnstileTask) |
userAgent | string | ไม่ | User-Agent ของเบราว์เซอร์ หากผลลัพธ์มี userAgent ให้ใช้ค่านั้นเมื่อส่ง token (เฉพาะ TurnstileTask) |
websiteKey มักขึ้นต้นด้วย 0x วิธีค้นหาดูได้ที่ ค้นหาพารามิเตอร์ของ Turnstile
เมื่อยังไม่ผ่านแน่ ๆ: pageAction และ data
หัวข้อที่มีชื่อว่า “เมื่อยังไม่ผ่านแน่ ๆ: pageAction และ data”ในกรณีส่วนใหญ่ส่งเพียง websiteURL และ websiteKey ก็เพียงพอ ไม่จำเป็นต้องใช้พารามิเตอร์สองตัวนี้ หากแน่ใจว่า websiteURL และ websiteKey ถูกต้องแล้วแต่งานยังไม่ผ่าน ให้ตรวจสอบว่าหน้าเว็บส่ง action และ cData ตอนเรียก Turnstile หรือไม่ (พารามิเตอร์ของ turnstile.render หรือ data-action และ data-cdata บนองค์ประกอบของกล่องยืนยัน) หากมี ให้ส่งตามค่าเดิม:
pageAction: ใส่ค่าactionในหน้าเว็บ เช่นlogindata: ใส่ค่าcDataในหน้าเว็บ เช่นc0bd4b36-7419-4e18-83c6-378699f2a9a2
{ "clientKey": "YOUR_CLIENT_KEY", "task": { "type": "TurnstileTaskProxyless", "websiteURL": "https://example.com/login", "websiteKey": "0x4AAAAAAA_SITE_KEY", "pageAction": "login", "data": "c0bd4b36-7419-4e18-83c6-378699f2a9a2" }}ตัวอย่างคำขอ
หัวข้อที่มีชื่อว่า “ตัวอย่างคำขอ”{ "clientKey": "YOUR_CLIENT_KEY", "task": { "type": "TurnstileTaskProxyless", "websiteURL": "https://example.com/login", "websiteKey": "0x4AAAAAAA_SITE_KEY" }}curl -s https://api.yescaptcha.com/createTask \ -H 'Content-Type: application/json' \ -d '{ "clientKey": "YOUR_CLIENT_KEY", "task": { "type": "TurnstileTaskProxyless", "websiteURL": "https://example.com/login", "websiteKey": "0x4AAAAAAA_SITE_KEY" }}'
# Returns {"errorId":0,"taskId":"..."}; then poll every 5 seconds:curl -s https://api.yescaptcha.com/getTaskResult \ -H 'Content-Type: application/json' \ -d '{"clientKey": "YOUR_CLIENT_KEY", "taskId": "TASK_ID"}'import osimport time
import requests
API = "https://api.yescaptcha.com"CLIENT_KEY = os.environ["YESCAPTCHA_CLIENT_KEY"] # Read the clientKey from an environment variable
def call(method, payload): r = requests.post(f"{API}/{method}", json={"clientKey": CLIENT_KEY, **payload}, timeout=30) data = r.json() if data.get("errorId"): raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}") return data
def solve(task): task_id = call("createTask", {"task": task})["taskId"] for _ in range(36): # Poll every 5 seconds, for up to about 3 minutes time.sleep(5) result = call("getTaskResult", {"taskId": task_id}) if result.get("status") == "ready": return result["solution"] raise TimeoutError(task_id)
solution = solve({ "type": "TurnstileTaskProxyless", "websiteURL": "https://example.com/login", "websiteKey": "0x4AAAAAAA_SITE_KEY",})print(solution["token"])const API = 'https://api.yescaptcha.com';const CLIENT_KEY = process.env.YESCAPTCHA_CLIENT_KEY; // Read the clientKey from an environment variable
async function call(method, payload) { const res = await fetch(`${API}/${method}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ clientKey: CLIENT_KEY, ...payload }), }); const data = await res.json(); if (data.errorId) throw new Error(`${data.errorCode}: ${data.errorDescription}`); return data;}
async function solve(task) { const { taskId } = await call('createTask', { task }); for (let i = 0; i < 36; i++) { // Poll every 5 seconds, for up to about 3 minutes await new Promise((r) => setTimeout(r, 5000)); const result = await call('getTaskResult', { taskId }); if (result.status === 'ready') return result.solution; } throw new Error(`timeout: ${taskId}`);}
const solution = await solve({ type: "TurnstileTaskProxyless", websiteURL: "https://example.com/login", websiteKey: "0x4AAAAAAA_SITE_KEY",});console.log(solution.token);เปลี่ยน websiteURL และ websiteKey เป็นค่าของเว็บไซต์เป้าหมาย
ผลลัพธ์ที่คืนกลับ
หัวข้อที่มีชื่อว่า “ผลลัพธ์ที่คืนกลับ”{ "errorId": 0, "status": "ready", "solution": { "token": "0.ufq5RgSVZd11DPSX1brdrxnEs28KcVlKj2ORchqxSy2q9yAW6ciq3hriXDF4x...", "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36" }}| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
token | string | token ที่ได้ ใช้ส่งให้เว็บไซต์เป้าหมาย ใช้ได้ครั้งเดียว แนะนำให้ส่งโดยเร็วที่สุด |
userAgent | string | User-Agent ที่ใช้ในการสร้าง token ให้ใช้ค่านี้เมื่อส่ง token แม้จะต่างจากค่าที่คุณส่งมา |
นำ token ไปใส่ในฟิลด์ cf-turnstile-response ของหน้าเว็บ (หรือฟิลด์ที่ API ของเว็บไซต์เป้าหมายกำหนด) แล้วส่ง โดยใช้ userAgent ที่ได้รับกลับมาเป็น User-Agent ของคำขอที่ส่ง
ระหว่างประมวลผลจะคืนค่า {"errorId": 0, "status": "processing"} ให้ตรวจสอบอีกครั้งหลังผ่านไป 5 วินาที หากเกิดข้อผิดพลาด ให้จัดการตาม errorCode ดู รหัสข้อผิดพลาด
คำถามที่พบบ่อย
หัวข้อที่มีชื่อว่า “คำถามที่พบบ่อย”token ใช้ได้นานแค่ไหน?
หัวข้อที่มีชื่อว่า “token ใช้ได้นานแค่ไหน?”ใช้ได้ครั้งเดียว แนะนำให้ส่งโดยเร็วที่สุดหลังได้รับ (token ของ Turnstile มักหมดอายุภายในไม่กี่นาที โดย Cloudflare เป็นผู้กำหนด)
ส่งแล้วเว็บไซต์ยังไม่ผ่าน?
หัวข้อที่มีชื่อว่า “ส่งแล้วเว็บไซต์ยังไม่ผ่าน?”ตรวจสอบว่า websiteURL เป็นหน้าที่มีกล่องยืนยัน และ websiteKey ถูกต้อง และใช้ userAgent ที่ได้รับกลับมาตอนส่ง หากหน้าเว็บส่ง action และ cData ให้ใส่เป็น pageAction และ data ดู เมื่อยังไม่ผ่านแน่ ๆ ด้านบน หากเว็บไซต์ตรวจสอบ IP ด้วย ให้ใช้ TurnstileTask และส่งผ่านพร็อกซีเดียวกัน