# reCAPTCHA v2

> Lấy token reCAPTCHA v2 (bản thường, bản ẩn, bản Enterprise) với YesCaptcha: loại tác vụ và giá, tham số yêu cầu, ví dụ curl/Python/Node.js và kết quả trả về.

Source: https://docs.yescaptcha.com/vi/tasks/recaptcha-v2/ · Last verified: 2026-10-15

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

Tác vụ reCAPTCHA v2 trả về một token (`gRecaptchaResponse`). Gửi token này cho trang web đích là qua được bước xác minh, không cần bấm chọn hình ảnh. Loại hay dùng nhất là `NoCaptchaTaskProxyless`, giá 15 điểm (≈ $2.25 / 1k) mỗi tác vụ, trả kết quả bất đồng bộ: gọi `createTask` để tạo tác vụ, sau đó cứ 5 giây gọi `getTaskResult` một lần để lấy kết quả. Tác vụ nhận dạng thất bại hoặc hết thời gian sẽ tự động hoàn điểm.

- POST `https://api.yescaptcha.com/createTask` (Endpoint quốc tế)
- POST `https://cn.yescaptcha.com/createTask` (Endpoint Trung Quốc)

Nội dung yêu cầu là JSON, xác thực bằng `clientKey` (sao chép trong bảng điều khiển tại [yescaptcha.com](https://yescaptcha.com/)). Tạo tác vụ ở endpoint nào thì truy vấn kết quả ở endpoint đó.

## Trường hợp sử dụng

-   Trang web có ô đánh dấu “Tôi không phải là người máy” (I’m not a robot): bản thường.
-   Không có ô đánh dấu, chỉ sau khi bấm nút gửi mới hiện câu hỏi hình ảnh: bản ẩn, thêm `"isInvisible": true`.
-   Trang tải `recaptcha/enterprise.js`, hoặc địa chỉ yêu cầu có chứa `enterprise`: bản Enterprise, dùng loại có `Enterprise` trong tên.

Nếu không chắc là loại nào, xem [Xác định loại captcha](https://docs.yescaptcha.com/vi/guides/identify-captcha.md). Nếu token có tỷ lệ qua chưa như ý, có thể chuyển sang [nhận dạng hình ảnh reCAPTCHA v2](https://docs.yescaptcha.com/vi/tasks/recaptcha-classification.md): API cho biết cần bấm vào những ảnh nào, bạn tự bấm trong trình duyệt.

## Loại tác vụ và giá

| Loại tác vụ | Giá | Cách trả kết quả | Ghi chú |
| --- | --- | --- | --- |
| `NoCaptchaTaskProxyless` | $2.25 / 1k; 15 điểm/tác vụ · ¥15 / 1k | Bất đồng bộ |  |
| `RecaptchaV2TaskProxyless` | $3.00 / 1k; 20 điểm/tác vụ · ¥20 / 1k | Bất đồng bộ | Cùng tham số với NoCaptchaTaskProxyless nhưng đi qua tuyến khác; có thể dùng cái này làm dự phòng cho cái kia |
| `NoCaptchaTask` | $2.25 / 1k; 15 điểm/tác vụ · ¥15 / 1k | Bất đồng bộ | Dùng proxy riêng |
| `RecaptchaV2EnterpriseTaskProxyless` | $3.00 / 1k; 20 điểm/tác vụ · ¥20 / 1k | Bất đồng bộ |  |
| `RecaptchaV2EnterpriseTask` | $3.00 / 1k; 20 điểm/tác vụ · ¥20 / 1k | Bất đồng bộ | Dùng proxy riêng |

Giá bằng đô la Mỹ chỉ là ước tính theo US$1 ≈ ¥6.67; tác vụ được trừ điểm.

-   `NoCaptchaTaskProxyless` và `RecaptchaV2TaskProxyless` có tham số giống nhau nhưng đi tuyến khác nhau. Nếu một loại có tỷ lệ qua chưa như ý, hãy thử loại còn lại.
-   Các loại không có `Proxyless` trong tên (`NoCaptchaTask`, `RecaptchaV2EnterpriseTask`) tải captcha qua proxy của bạn, cần truyền các trường `proxyType`, `proxyAddress`, `proxyPort`, v.v. Dùng chúng khi trang web đích có yêu cầu về IP truy cập.

## Tham số yêu cầu

Đối tượng `task` của `createTask`:

| Trường | Kiểu | Bắt buộc | Mô tả |
| --- | --- | --- | --- |
| `type` | string | Có | Loại tác vụ; xem "Loại tác vụ và giá" trên trang này |
| `websiteURL` | string | Có | URL đầy đủ của trang hiển thị captcha. Điền trang web nơi bạn thấy captcha, không điền tên miền của nhà cung cấp captcha |
| `websiteKey` | string | Có | Khóa trang web (sitekey), tìm trong mã nguồn trang hoặc trong các request mạng; thường không thay đổi |
| `isInvisible` | boolean | Không | Đặt là true cho phiên bản ẩn (invisible); nếu không thì bỏ qua |
| `proxyType` | string | Một số loại | Giao thức proxy: `http`, `https`, `socks4` hoặc `socks5` (Bắt buộc với NoCaptchaTask, RecaptchaV2EnterpriseTask) |
| `proxyAddress` | string | Một số loại | Địa chỉ IP hoặc tên máy chủ của proxy. Địa chỉ cục bộ hoặc nội bộ như 127.0.0.1 hay 192.168.x.x sẽ không hoạt động vì máy chủ của chúng tôi không truy cập được (Bắt buộc với NoCaptchaTask, RecaptchaV2EnterpriseTask) |
| `proxyPort` | integer | Một số loại | Cổng proxy (Bắt buộc với NoCaptchaTask, RecaptchaV2EnterpriseTask) |
| `proxyLogin` | string | Không | Tên người dùng proxy, nếu proxy yêu cầu xác thực (chỉ NoCaptchaTask, RecaptchaV2EnterpriseTask) |
| `proxyPassword` | string | Không | Mật khẩu proxy, nếu proxy yêu cầu xác thực (chỉ NoCaptchaTask, RecaptchaV2EnterpriseTask) |
| `userAgent` | string | Không | User-Agent của trình duyệt. Nếu kết quả có `userAgent`, hãy dùng giá trị đó khi gửi token (chỉ NoCaptchaTask, RecaptchaV2EnterpriseTask) |
| `enterprisePayload` | object | Không | Tham số bổ sung của phiên bản enterprise, ví dụ giá trị `s` của reCAPTCHA Enterprise: `{"s": "..."}`. Bỏ qua nếu trang không dùng (chỉ RecaptchaV2EnterpriseTaskProxyless, RecaptchaV2EnterpriseTask) |

Cách tìm `websiteURL` và `websiteKey`: xem [Tìm tham số reCAPTCHA](https://docs.yescaptcha.com/vi/guides/find-recaptcha-parameters.md).

## Ví dụ yêu cầu

Lấy trang demo chính thức của Google làm ví dụ:

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

```json
{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "NoCaptchaTaskProxyless",
    "websiteURL": "https://www.google.com/recaptcha/api2/demo",
    "websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
  }
}
```

Mã đầy đủ (tạo tác vụ, cứ 5 giây truy vấn một lần, in token). Trước khi chạy, hãy đặt clientKey vào biến môi trường `YESCAPTCHA_CLIENT_KEY`:

**curl**

```bash
curl -s https://api.yescaptcha.com/createTask \
  -H 'Content-Type: application/json' \
  -d '{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "NoCaptchaTaskProxyless",
    "websiteURL": "https://www.google.com/recaptcha/api2/demo",
    "websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
  }
}'

# 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": "NoCaptchaTaskProxyless",
    "websiteURL": "https://www.google.com/recaptcha/api2/demo",
    "websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
})
print(solution["gRecaptchaResponse"])
```

**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: "NoCaptchaTaskProxyless",
  websiteURL: "https://www.google.com/recaptcha/api2/demo",
  websiteKey: "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
});
console.log(solution.gRecaptchaResponse);
```

Với bản Enterprise, nếu trang web truyền giá trị `s` cho reCAPTCHA, hãy đặt giá trị đó vào `enterprisePayload`:

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

```json
{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "RecaptchaV2EnterpriseTaskProxyless",
    "websiteURL": "https://example.com/login",
    "websiteKey": "SITE_KEY_OF_THE_PAGE",
    "enterprisePayload": {
      "s": "S_VALUE_FROM_THE_PAGE"
    }
  }
}
```

Dùng proxy của bạn:

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

```json
{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "NoCaptchaTask",
    "websiteURL": "https://www.google.com/recaptcha/api2/demo",
    "websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
    "proxyType": "http",
    "proxyAddress": "proxy.example.com",
    "proxyPort": 8080,
    "proxyLogin": "user",
    "proxyPassword": "pass"
  }
}
```

## Kết quả trả về

`createTask` trả về ID tác vụ:

```json
{
  "errorId": 0,
  "taskId": "61138bb6-19fb-11ec-a9c8-0242ac110006"
}
```

Dùng ID này để gọi `getTaskResult`. Khi tác vụ còn đang xử lý sẽ trả về `{"errorId": 0, "status": "processing"}`, hãy truy vấn lại sau 5 giây; khi hoàn thành sẽ trả về:

```json
{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "gRecaptchaResponse": "03AGdBq25SxXT-pmSeBXjzScW-EiocHwwpwqtk1QXlJnGnU..."
  }
}
```

| Trường | Kiểu | Mô tả |
| --- | --- | --- |
| `gRecaptchaResponse` | string | Token cần gửi cho website đích. Chỉ dùng một lần, có hiệu lực khoảng 120 giây; nên dùng trong vòng 60 giây |

Một tác vụ được xử lý tối đa khoảng 110 giây, quá thời gian sẽ trả về `ERROR_TASK_TIMEOUT` và hoàn điểm. Khi có lỗi, `errorId` bằng 1, hãy xử lý theo `errorCode`, xem [Mã lỗi](https://docs.yescaptcha.com/vi/api/errors.md). Cách gửi token sau khi nhận được: xem [Dùng token để hoàn thành reCAPTCHA](https://docs.yescaptcha.com/vi/guides/submit-recaptcha-token.md).

> **Mẹo:** Token chỉ dùng được một lần, có hiệu lực khoảng 120 giây, nên gửi trong vòng 60 giây sau khi nhận.

## Câu hỏi thường gặp

### Tại sao token của cùng một trang web lúc qua lúc không?

Việc có qua hay không do trang web đích quyết định. Trang web chấm điểm từng lần xác minh và đặt ngưỡng, ngưỡng này có thể thay đổi bất cứ lúc nào, nên tỷ lệ qua khác nhau tùy trang web và không phải token nào cũng qua. Bạn có thể đổi sang loại tác vụ cùng nhóm để so sánh tỷ lệ qua, hoặc chuyển sang [nhận dạng hình ảnh](https://docs.yescaptcha.com/vi/tasks/recaptcha-classification.md).

### Token có hiệu lực trong bao lâu?

Dùng được một lần, có hiệu lực khoảng 120 giây, nên gửi trong vòng 60 giây sau khi nhận. Thời hạn do Google quyết định.

### Nhận dạng thất bại có bị trừ điểm không?

Không. Tác vụ trả về `ERROR_CAPTCHA_UNSOLVABLE` hoặc hết thời gian sẽ tự động hoàn điểm, xem [Tính phí và hoàn điểm](https://docs.yescaptcha.com/vi/getting-started/billing.md).

## Hướng dẫn liên quan

-   [Xác định loại captcha](https://docs.yescaptcha.com/vi/guides/identify-captcha.md)
-   [Tìm tham số reCAPTCHA](https://docs.yescaptcha.com/vi/guides/find-recaptcha-parameters.md)
-   [Dùng token để hoàn thành reCAPTCHA](https://docs.yescaptcha.com/vi/guides/submit-recaptcha-token.md)
-   [Nhận dạng hình ảnh reCAPTCHA v2 và mô phỏng bấm chuột (Selenium)](https://docs.yescaptcha.com/vi/guides/recaptcha-click-selenium.md)
