# Dùng token để vượt reCAPTCHA

> Cách dùng token reCAPTCHA (gRecaptchaResponse) sau khi nhận được: nguyên lý, gửi trực tiếp bằng request HTTP (trường g-recaptcha-response), hoặc điền vào trình duyệt rồi gọi hàm callback, kèm ví dụ Python hoàn chỉnh trên trang demo của Google.

Source: https://docs.yescaptcha.com/vi/guides/submit-recaptcha-token/ · 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/guides/submit-recaptcha-token/

`gRecaptchaResponse` mà YesCaptcha trả về chính là kết quả Google giao cho trang web sau khi người dùng giải xong captcha. Khi đã có nó, bạn cần **gửi nó đến website đích** (không phải gửi cho Google hay YesCaptcha) giống như trình duyệt, website sẽ đối chiếu với Google rồi cho qua. Có hai cách: gửi request trực tiếp, hoặc điền token vào trang trong trình duyệt rồi gửi.

## Nguyên lý

Luồng khi truy cập bình thường:

1.  Trang web tải reCAPTCHA, người dùng hoàn thành xác minh;
2.  Google đưa cho trang một token, trang đặt token vào ô văn bản `g-recaptcha-response` (hoặc truyền cho hàm callback);
3.  Người dùng gửi biểu mẫu, token được gửi kèm đến máy chủ của website;
4.  Máy chủ của website dùng token để đối chiếu với Google, hợp lệ thì cho qua.

Khi dùng YesCaptcha, bước 1 và 2 do chúng tôi thực hiện: bạn tạo tác vụ với `websiteURL` và `websiteKey`, nhận token, rồi tiếp tục từ bước 3.

> **Chú ý:** Token chỉ dùng được một lần và có hiệu lực khoảng 120 giây; nên gửi trong vòng 60 giây sau khi nhận. Website sẽ không chấp nhận token đã hết hạn.

## Cách 1: Gửi request trực tiếp (khuyến nghị)

1.  Thao tác thủ công một lần trong trình duyệt: nhấn F12 mở bảng Network, giải captcha và gửi biểu mẫu, rồi tìm request gửi biểu mẫu đó.
2.  Trong Payload (hoặc Form Data) của request, tìm trường mang token, thường tên là `g-recaptcha-response`, token bắt đầu bằng `03A`; một số website đổi tên, ví dụ `grecaptcharesponse`, `captcha`.
3.  Trong chương trình của bạn, gửi một request giống hệt, thay giá trị của trường đó bằng token YesCaptcha trả về. Các trường khác, Cookie và header cũng phải khớp với trình duyệt, vì website thường kiểm tra cả những thứ này.

Ví dụ hoàn chỉnh trên trang demo của Google: nhận token trước, rồi gửi lại cho trang demo qua trường `g-recaptcha-response`:

recaptcha_requests.py

```python
"""Solve reCAPTCHA v2 on Google's demo page and submit the token with plain HTTP (no browser).

Run:  pip install requests
      export YESCAPTCHA_CLIENT_KEY=your_client_key
      python recaptcha_requests.py
Each run creates one NoCaptchaTaskProxyless task (charged per the price list).
"""
import os
import time

import requests

CLIENT_KEY = os.environ["YESCAPTCHA_CLIENT_KEY"]
API = "https://api.yescaptcha.com"
WEBSITE_URL = "https://www.google.com/recaptcha/api2/demo"
WEBSITE_KEY = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"

def call(method, payload):
    data = requests.post(f"{API}/{method}", json={"clientKey": CLIENT_KEY, **payload}, timeout=30).json()
    if data.get("errorId"):
        raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}")
    return data

def get_token():
    task = {"type": "NoCaptchaTaskProxyless", "websiteURL": WEBSITE_URL, "websiteKey": WEBSITE_KEY}
    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"]["gRecaptchaResponse"]
    raise TimeoutError(task_id)

token = get_token()
print("token:", token[:40], "...")

# Submit the token the same way the browser does: the demo form posts the field
# "g-recaptcha-response" back to the page. Check your own site's request in DevTools > Network.
page = requests.post(WEBSITE_URL, data={"g-recaptcha-response": token}, timeout=30)
print("passed" if "Verification Success" in page.text else "not passed", page.status_code)
```

## Cách 2: Điền vào trình duyệt (Selenium, v.v.)

Khi dùng Selenium, Playwright hoặc công cụ tương tự để điều khiển trình duyệt thật:

1.  Đọc `data-sitekey` từ trang, dùng nó để tạo tác vụ và nhận token.
2.  Ghi token vào ô văn bản `g-recaptcha-response` trong trang.
3.  Nếu trang có đặt hàm callback (`data-callback="..."`), hãy gọi hàm đó và truyền token vào; một số website chỉ cho nhấn nút gửi sau khi callback được gọi.
4.  Gửi biểu mẫu.

```js
// Step 2: write the token (run in the page)
document.getElementById('g-recaptcha-response').value = 'TOKEN';
// Step 3: call the callback if there is one, e.g. data-callback="onSuccess"
onSuccess('TOKEN');
```

Khi trang có nhiều reCAPTCHA, id của ô văn bản có thể là `g-recaptcha-response-1` và tương tự; nếu không tìm thấy ô này, hãy tự giải captcha thủ công một lần, tìm `03A` trong Elements để xem kết quả được đặt ở đâu. Cách tìm hàm callback xem [Tìm tham số reCAPTCHA](https://docs.yescaptcha.com/vi/guides/find-recaptcha-parameters.md).

Ví dụ hoàn chỉnh (Selenium 4):

recaptcha_selenium.py

```python
"""Solve reCAPTCHA v2 on Google's demo page in a real browser with Selenium 4:
get a token from YesCaptcha, put it into the page, then submit the form.

Run:  pip install requests selenium
      export YESCAPTCHA_CLIENT_KEY=your_client_key
      python recaptcha_selenium.py
Each run creates one NoCaptchaTaskProxyless task (charged per the price list).
"""
import os
import time

import requests
from selenium import webdriver
from selenium.webdriver.common.by import By

CLIENT_KEY = os.environ["YESCAPTCHA_CLIENT_KEY"]
API = "https://api.yescaptcha.com"
WEBSITE_URL = "https://www.google.com/recaptcha/api2/demo"

def call(method, payload):
    data = requests.post(f"{API}/{method}", json={"clientKey": CLIENT_KEY, **payload}, timeout=30).json()
    if data.get("errorId"):
        raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}")
    return data

def get_token(website_url, website_key):
    task = {"type": "NoCaptchaTaskProxyless", "websiteURL": website_url, "websiteKey": website_key}
    task_id = call("createTask", {"task": task})["taskId"]
    for _ in range(36):
        time.sleep(5)
        result = call("getTaskResult", {"taskId": task_id})
        if result.get("status") == "ready":
            return result["solution"]["gRecaptchaResponse"]
    raise TimeoutError(task_id)

driver = webdriver.Chrome()  # Selenium 4 downloads a matching chromedriver automatically
try:
    driver.get(WEBSITE_URL)
    site_key = driver.find_element(By.CSS_SELECTOR, "[data-sitekey]").get_attribute("data-sitekey")
    token = get_token(WEBSITE_URL, site_key)

    # Put the token where reCAPTCHA keeps it ...
    driver.execute_script(
        "document.getElementById('g-recaptcha-response').value = arguments[0];", token
    )
    # ... and, if the page uses a callback (data-callback="..."), call it:
    callback = driver.find_element(By.CSS_SELECTOR, "[data-sitekey]").get_attribute("data-callback")
    if callback:
        driver.execute_script(f"window[{callback!r}](arguments[0]);", token)

    driver.find_element(By.ID, "recaptcha-demo-submit").click()
    time.sleep(2)
    print("passed" if "Verification Success" in driver.page_source else "not passed")
finally:
    driver.quit()
```

## reCAPTCHA v3

v3 không có ô đánh dấu. Khi cần token, trang web gọi `grecaptcha.execute(khóa website, {action: '...'})`, rồi đặt token vào request của chính nó (tên trường do website quyết định, thường gặp là `g-recaptcha-response`, `token`, `recaptchaToken`). Cách làm giống Cách 1: tìm request mang token trong Network rồi gửi lại tương tự; khi tạo tác vụ, `pageAction` phải khớp với `action` của trang.

## Đã gửi mà vẫn không qua

-   Token hết hạn: gửi càng sớm càng tốt sau khi nhận, không quá 60 giây.
-   Gửi sai trường mà website kiểm tra, hoặc thiếu các trường khác, Cookie: đối chiếu từng mục với request trong trình duyệt.
-   Website đồng thời kiểm tra IP, User-Agent, v.v.: dùng loại tác vụ tự cung cấp proxy (như `NoCaptchaTask`) và gửi qua cùng proxy đó.
-   Điểm v3 không đủ: kiểm tra lại `pageAction`, hoặc chuyển sang loại có điểm cao cố định, xem [reCAPTCHA v3](https://docs.yescaptcha.com/vi/tasks/recaptcha-v3.md).
-   Hệ thống kiểm soát rủi ro của website còn xem các tín hiệu hành vi khác. Nếu tỷ lệ qua bằng token thấp, có thể chuyển sang [nhận dạng hình ảnh](https://docs.yescaptcha.com/vi/tasks/recaptcha-classification.md) để nhấp chuột thật trong trình duyệt, hoặc dùng [tiện ích trình duyệt](https://docs.yescaptcha.com/vi/extension.md).
