# Cloudflare Turnstile

> รับ token ของ Cloudflare Turnstile ด้วย YesCaptcha ครอบคลุม TurnstileTaskProxyless, TurnstileTaskProxylessM1 และ TurnstileTask ที่ใช้พร็อกซีของคุณเอง พร้อมพารามิเตอร์ ตัวอย่าง และผลลัพธ์ที่คืนกลับ รวมถึงความแตกต่างจากหน้าตรวจสอบของ Cloudflare

Source: https://docs.yescaptcha.com/th/tasks/turnstile/ · Last verified: 2026-10-21

> This page was machine-translated from the Chinese version. If anything differs, the Chinese version prevails: https://docs.yescaptcha.com/zh/tasks/turnstile/

งาน Cloudflare Turnstile จะคืนค่า token (`token`) ให้นำไปส่งให้เว็บไซต์เป้าหมายเพื่อผ่านการตรวจสอบ `TurnstileTaskProxyless` ราคางานละ 25 พอยต์ (≈ $3.75 / 1k) ทำงานแบบอะซิงโครนัส: เรียก `createTask` ก่อน แล้วเรียก `getTaskResult` ทุก 5 วินาที หากจดจำไม่สำเร็จหรือหมดเวลา ระบบจะคืนพอยต์ให้อัตโนมัติ

- POST `https://api.yescaptcha.com/createTask` (endpoint ทั่วโลก)
- POST `https://cn.yescaptcha.com/createTask` (endpoint จีน)

เนื้อหาคำขอเป็น JSON และยืนยันตัวตนด้วย `clientKey` สร้างงานที่ endpoint ใด ให้ตรวจสอบผลลัพธ์ที่ endpoint เดียวกัน

## เหมาะกับกรณีใด

ในฟอร์มของหน้าเว็บมีกล่องยืนยันของ Cloudflare ฝังอยู่ (“ยืนยันว่าคุณเป็นมนุษย์”) และหน้าเว็บโหลดสคริปต์จาก `challenges.cloudflare.com/turnstile`

หากทั้งหน้าถูก Cloudflare ขวางไว้และแสดงข้อความ “โปรดรอสักครู่…” หรือ “กำลังตรวจสอบเบราว์เซอร์ของคุณ” นั่นคือหน้าตรวจสอบของ Cloudflare ไม่ใช่ Turnstile ให้ใช้ [หน้าตรวจสอบของ Cloudflare](https://docs.yescaptcha.com/th/tasks/cloudflare-challenge.md) ดูความแตกต่างได้ที่ [วิธีระบุประเภท CAPTCHA](https://docs.yescaptcha.com/th/guides/identify-captcha.md)

## ประเภทงานและราคา

| ประเภทงาน | ราคา | รูปแบบการคืนผลลัพธ์ | หมายเหตุ |
| --- | --- | --- | --- |
| `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](https://docs.yescaptcha.com/th/guides/find-turnstile-parameters.md)

### เมื่อยังไม่ผ่านแน่ ๆ: pageAction และ data

ในกรณีส่วนใหญ่ส่งเพียง `websiteURL` และ `websiteKey` ก็เพียงพอ ไม่จำเป็นต้องใช้พารามิเตอร์สองตัวนี้ หากแน่ใจว่า `websiteURL` และ `websiteKey` ถูกต้องแล้วแต่งานยังไม่ผ่าน ให้ตรวจสอบว่าหน้าเว็บส่ง `action` และ `cData` ตอนเรียก Turnstile หรือไม่ (พารามิเตอร์ของ `turnstile.render` หรือ `data-action` และ `data-cdata` บนองค์ประกอบของกล่องยืนยัน) หากมี ให้ส่งตามค่าเดิม:

-   `pageAction`: ใส่ค่า `action` ในหน้าเว็บ เช่น `login`
-   `data`: ใส่ค่า `cData` ในหน้าเว็บ เช่น `c0bd4b36-7419-4e18-83c6-378699f2a9a2`

POST https://api.yescaptcha.com/createTask

```json
{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "TurnstileTaskProxyless",
    "websiteURL": "https://example.com/login",
    "websiteKey": "0x4AAAAAAA_SITE_KEY",
    "pageAction": "login",
    "data": "c0bd4b36-7419-4e18-83c6-378699f2a9a2"
  }
}
```

## ตัวอย่างคำขอ

POST https://api.yescaptcha.com/createTask

```json
{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "TurnstileTaskProxyless",
    "websiteURL": "https://example.com/login",
    "websiteKey": "0x4AAAAAAA_SITE_KEY"
  }
}
```

**curl**

```bash
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"}'
```

**Python**

solve.py

```python
import os
import 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"])
```

**Node.js**

solve.mjs

```js
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` เป็นค่าของเว็บไซต์เป้าหมาย

## ผลลัพธ์ที่คืนกลับ

```json
{
  "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` ดู [รหัสข้อผิดพลาด](https://docs.yescaptcha.com/th/api/errors.md)

## คำถามที่พบบ่อย

### token ใช้ได้นานแค่ไหน?

ใช้ได้ครั้งเดียว แนะนำให้ส่งโดยเร็วที่สุดหลังได้รับ (token ของ Turnstile มักหมดอายุภายในไม่กี่นาที โดย Cloudflare เป็นผู้กำหนด)

### ส่งแล้วเว็บไซต์ยังไม่ผ่าน?

ตรวจสอบว่า `websiteURL` เป็นหน้าที่มีกล่องยืนยัน และ `websiteKey` ถูกต้อง และใช้ `userAgent` ที่ได้รับกลับมาตอนส่ง หากหน้าเว็บส่ง `action` และ `cData` ให้ใส่เป็น `pageAction` และ `data` ดู [เมื่อยังไม่ผ่านแน่ ๆ](#) ด้านบน หากเว็บไซต์ตรวจสอบ IP ด้วย ให้ใช้ `TurnstileTask` และส่งผ่านพร็อกซีเดียวกัน

## บทความที่เกี่ยวข้อง

-   [วิธีระบุประเภท CAPTCHA](https://docs.yescaptcha.com/th/guides/identify-captcha.md)
-   [ค้นหาพารามิเตอร์ของ Turnstile](https://docs.yescaptcha.com/th/guides/find-turnstile-parameters.md)
