reCAPTCHA v2 vẫn là một trong những rào cản phổ biến nhất ở các luồng đăng nhập, đăng ký, thanh toán và gửi form. Khi automation gặp checkbox hoặc challenge ảnh của reCAPTCHA v2, bạn có thể giải qua API trong bốn bước: trích xuất sitekey và pageurl khỏi trang, gửi đến bộ giải reCAPTCHA v2 của CaptchaAI, đợi kết quả rồi chèn token vào luồng được bảo vệ.
Hướng dẫn này dành cho dev cần một tích hợp chạy được, không phải tổng quan lý thuyết.
Chưa chắc reCAPTCHA phiên bản nào? Đọc trước Cách Nhận Diện Phiên Bản reCAPTCHA.
Cần chuẩn bị trước khi bắt đầu
| Yêu cầu | Chi tiết |
|---|---|
| API key CaptchaAI | Lấy ở captchaai.com/api.php. 32 ký tự. |
| URL trang đầy đủ | URL chính xác nơi widget reCAPTCHA v2 được tải. |
| sitekey | Khóa công khai gắn với widget trên trang đó. |
| HTTP client | requests, axios, fetch, curl — tuỳ ý. |
| Thread đang hoạt động | Tài khoản phải có thread khả dụng. |
Bước 1: trích xuất sitekey và pageurl
pageurl là URL đầy đủ của trang chứa reCAPTCHA. Luôn truyền kèm https://.
Có ba cách lấy sitekey:
1. Trong HTML — tìm <div class="g-recaptcha" data-sitekey="...">:
<div class="g-recaptcha" data-sitekey="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"></div>
2. Trong URL iframe — https://www.google.com/recaptcha/api2/anchor?ar=1&k=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&... — tham số k= chính là sitekey.
3. Trong network traffic — DevTools → Network, lọc recaptcha, tham số k xuất hiện ở bất kỳ request nào.
Bước 2: gửi task
import requests
API_KEY = "YOUR_API_KEY"
SITEKEY = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
PAGEURL = "https://staging.example.com/qa-login"
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": SITEKEY,
"pageurl": PAGEURL,
"json": 1,
}).json()
assert submit["status"] == 1, submit
task_id = submit["request"]
print("task id:", task_id)
Bản Node.js:
const r = await fetch("https://ocr.captchaai.com/in.php", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
key: API_KEY,
method: "userrecaptcha",
googlekey: SITEKEY,
pageurl: PAGEURL,
json: "1",
}),
});
const { status, request: taskId } = await r.json();
if (status !== 1) throw new Error(taskId);
reCAPTCHA invisible? Thêm
invisible=1. Chi tiết tại Cách hoạt động của reCAPTCHA invisible.
Bước 3: polling kết quả
reCAPTCHA v2 thường mất 15–60 giây. Đợi 20 giây rồi polling mỗi 5 giây.
import time
time.sleep(20)
while True:
res = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": task_id,
"json": 1,
}).json()
if res.get("request") == "CAPCHA_NOT_READY":
time.sleep(5)
continue
if res.get("status") == 1:
token = res["request"]
print("token:", token[:60], "…")
break
raise RuntimeError(res)
Token trả về là chuỗi dài, thường bắt đầu bằng 03AGdBq25....
Bước 4: chèn token vào trang
Cách thực hiện tuỳ vào site. Phổ biến nhất là textarea g-recaptcha-response:
document.querySelector('textarea[name="g-recaptcha-response"]').value = token;
document.querySelector("form").submit();
Selenium:
driver.execute_script(
"document.querySelector('[name=\"g-recaptcha-response\"]').value = arguments[0];",
token,
)
driver.find_element(By.CSS_SELECTOR, "form").submit()
Playwright:
await page.evaluate((t) => {
document.querySelector('[name="g-recaptcha-response"]').value = t;
}, token);
await page.click('button[type="submit"]');
Nếu widget có data-callback, gọi luôn hàm đó:
const callback = document.querySelector(".g-recaptcha").dataset.callback;
if (callback && window[callback]) window[callback](token);
Ví dụ hoàn chỉnh (Python)
import time
import requests
API_KEY = "YOUR_API_KEY"
SITEKEY = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
PAGEURL = "https://staging.example.com/qa-login"
def solve_recaptcha_v2():
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "userrecaptcha",
"googlekey": SITEKEY, "pageurl": PAGEURL, "json": 1,
}).json()
if submit["status"] != 1:
raise RuntimeError(submit)
task_id = submit["request"]
time.sleep(20)
for _ in range(40):
res = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": 1,
}).json()
if res.get("request") == "CAPCHA_NOT_READY":
time.sleep(5)
continue
if res.get("status") == 1:
return res["request"]
raise RuntimeError(res)
raise TimeoutError("solve timed out")
if __name__ == "__main__":
token = solve_recaptcha_v2()
print("token:", token[:80])
Lỗi thường gặp và cách xử lý
| Lỗi | Nguyên nhân | Cách xử lý |
|---|---|---|
ERROR_GOOGLEKEY |
sitekey rỗng/sai | Trích xuất lại sitekey từ trang hiện tại |
ERROR_PAGEURL |
Thiếu pageurl |
Gửi URL đầy đủ kèm scheme |
ERROR_ZERO_BALANCE |
Hết thread | Nạp thêm hoặc đợi giải phóng |
ERROR_CAPTCHA_UNSOLVABLE |
Site siết chặt thử thách | Thử lại sau vài giây; xem lỗi giải reCAPTCHA v2 thường gặp |
| Site từ chối token | Token đã hết hạn | Dùng trong vòng ~110 giây sau khi nhận |
Khi không cách nào hoạt động
- Có token nhưng site vẫn chặn — form có handler riêng. Tìm callback và gọi thay vì chỉ điền textarea.
- Cần giữ cùng fingerprint — gửi cùng cookie và
User-Agentđã dùng khi xin token. - reCAPTCHA phụ thuộc proxy — thêm
proxyvàproxytypevào submit để bộ giải dùng pool IP của bạn.