Gửi đủ tham số nhưng CaptchaAI vẫn trả ERROR_WRONG_GOOGLEKEY? Gần như mọi trường hợp quy về một trong ba lý do: sitekey trích xuất sai, thiếu cờ enterprise=1/invisible=1, hoặc sitekey đã bị xoay sau lần trích xuất trước. Bài này đi thẳng vào từng nguyên nhân, cách xác định và code xử lý — sửa xong trong một lần đọc thay vì thử-sai từng tham số.
Chẩn đoán lỗi
Vì sao bạn gặp lỗi này
| Nguyên nhân | Cách xác định |
|---|---|
| Trích xuất sai sitekey | Sitekey không khớp với mã nguồn trang đích |
| Gửi sitekey reCAPTCHA Enterprise theo kiểu chuẩn | Cần thêm tham số enterprise=1 |
| Sitekey reCAPTCHA Invisible không khớp | Cần thêm tham số invisible=1 |
| Sitekey động đã thay đổi | Sitekey bị xoay kể từ lần trích xuất trước |
| Lấy nhầm sitekey của trang khác | Trích xuất từ iframe hoặc domain khác |
| Hardcode sitekey đã lỗi thời | Sitekey từng hợp lệ nhưng đã hết hạn dùng |
Tình huống thường gặp ở các team QA/automation Việt Nam: một agency outsourcing kiểm thử form đăng nhập trên
staging.example.combằng script CI chạy mỗi sáng. Sau một lần deploy, frontend đổi sitekey mới trên Google reCAPTCHA Admin Console — cả pipeline bắt đầu trảERROR_WRONG_GOOGLEKEYdù code test không đổi gì. Trích xuất lại sitekey trước mỗi lần gửi, thay vì hardcode rồi tái sử dụng mãi, tránh được sự cố này.
Bảng tra cứu nhanh khi vẫn gặp lỗi
| Vấn đề | Nguyên nhân | Cách xử lý |
|---|---|---|
| Sitekey có vẻ đúng nhưng lỗi vẫn tồn tại | Sitekey Enterprise | Thêm enterprise=1 |
| Sitekey đổi giữa các lần chạy | Sitekey động | Trích xuất lại mỗi lần, đừng hardcode |
| Nhiều sitekey trên cùng một trang | Chọn nhầm sitekey | Ghép đúng sitekey với form cần giải |
| Sitekey lấy từ iframe CDN | Sitekey thuộc domain khác | Trích xuất từ trang chính, không phải iframe |
| Trích xuất ra sitekey rỗng | Render bằng JavaScript | Dùng Selenium để lấy sau khi trang load xong |
Trích xuất và xác thực sitekey
Cách 1: Đọc từ mã nguồn trang
import re
import requests
def extract_sitekey(page_url):
"""Extract reCAPTCHA sitekey from page source."""
resp = requests.get(page_url, timeout=15)
html = resp.text
# Pattern 1: data-sitekey attribute
match = re.search(r'data-sitekey="([^"]+)"', html)
if match:
return match.group(1)
# Pattern 2: grecaptcha.render call
match = re.search(r"grecaptcha\.render\([^,]+,\s*\{[^}]*sitekey['\"]?\s*:\s*['\"]([^'\"]+)", html)
if match:
return match.group(1)
# Pattern 3: grecaptcha.execute call
match = re.search(r"grecaptcha\.execute\(['\"]([^'\"]+)", html)
if match:
return match.group(1)
# Pattern 4: reCAPTCHA script src
match = re.search(r"recaptcha/api\.js\?render=([^&\"]+)", html)
if match:
return match.group(1)
return None
sitekey = extract_sitekey("https://staging.example.com/qa-login")
print(f"Sitekey: {sitekey}")
Cách 2: DevTools trình duyệt
- Mở trang đích trong Chrome
- Nhấn F12 → tab Elements
- Nhấn Ctrl+F, tìm
sitekey - Tìm thuộc tính
data-sitekey="..." - Copy giá trị (chuỗi chữ và số dài 40 ký tự)
Cách 3: Tab Network
- Mở F12 → tab Network
- Lọc theo
recaptcha - Tìm request gửi tới
google.com/recaptcha/api2/anchor - Lấy tham số
k=trong URL — đó chính là sitekey
Cách 4: Kiểm tra định dạng trước khi gửi request
Validate format trước khi gửi, để loại trừ lỗi do copy thiếu ký tự hoặc dính khoảng trắng:
import re
def validate_sitekey(sitekey):
"""Validate sitekey format before API call."""
if not sitekey:
raise ValueError("Sitekey is empty")
# Standard format: 40 alphanumeric + hyphens/underscores
if not re.match(r'^[a-zA-Z0-9_-]{20,60}$', sitekey):
raise ValueError(f"Invalid sitekey format: {sitekey}")
return True
# Use before solving
sitekey = extract_sitekey("https://staging.example.com/qa-login")
validate_sitekey(sitekey)
Xử lý các biến thể reCAPTCHA
reCAPTCHA Enterprise
Sitekey Enterprise trông giống hệt sitekey chuẩn, nhưng thiếu tham số enterprise là nguyên nhân phổ biến nhất trong nhóm lỗi này:
import requests
# Standard reCAPTCHA — loads via recaptcha/api.js
# Enterprise reCAPTCHA — loads via recaptcha/enterprise.js
def detect_enterprise(page_url):
"""Detect if page uses reCAPTCHA Enterprise."""
resp = requests.get(page_url, timeout=15)
return "recaptcha/enterprise.js" in resp.text
# Submit with enterprise flag
is_enterprise = detect_enterprise("https://example.com")
data = {
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": "https://example.com",
"json": 1,
}
if is_enterprise:
data["enterprise"] = 1
resp = requests.post("https://ocr.captchaai.com/in.php", data=data)
reCAPTCHA Invisible
Loại này không có checkbox, nên enterprise=1 không giúp gì — dấu hiệu nhận biết nằm ở thuộc tính data-size hoặc lệnh gọi grecaptcha.execute():
def detect_invisible(html):
"""Detect invisible reCAPTCHA."""
indicators = [
'data-size="invisible"',
"grecaptcha.execute(",
"recaptcha/api.js?render=",
]
return any(i in html for i in indicators)
# Submit with invisible flag
data = {
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": "https://example.com",
"invisible": 1,
"json": 1,
}
Sitekey tải động qua JavaScript
Một số trang chỉ render sitekey sau khi JavaScript chạy xong, nên requests.get() trả về HTML rỗng ở phần này. Dùng trình duyệt thật để lấy đúng giá trị:
from selenium import webdriver
from selenium.webdriver.common.by import By
def extract_dynamic_sitekey(url):
"""Extract sitekey from JavaScript-rendered page."""
driver = webdriver.Chrome()
driver.get(url)
# Wait for reCAPTCHA to load
import time
time.sleep(3)
# Try data-sitekey attribute
elements = driver.find_elements(By.CSS_SELECTOR, "[data-sitekey]")
if elements:
sitekey = elements[0].get_attribute("data-sitekey")
driver.quit()
return sitekey
# Try iframe src parameter
iframes = driver.find_elements(By.CSS_SELECTOR, "iframe[src*='recaptcha']")
for iframe in iframes:
src = iframe.get_attribute("src")
import re
match = re.search(r'[?&]k=([^&]+)', src)
if match:
driver.quit()
return match.group(1)
driver.quit()
return None
Câu hỏi thường gặp
Sitekey đúng nhưng vẫn báo ERROR_WRONG_GOOGLEKEY, vì sao?
Thường do thiếu cờ đi kèm, không phải sai sitekey: kiểm tra trang có dùng reCAPTCHA Enterprise (thiếu enterprise=1) hoặc Invisible (thiếu invisible=1) trước khi nghi ngờ giá trị sitekey.
reCAPTCHA v2 và v3 có dùng chung sitekey không?
Không. v2 và v3 dùng hai sitekey khác nhau trên cùng một trang. Kiểm tra script reCAPTCHA trong mã nguồn để xác định đang gặp phiên bản nào.
Có nên cache sitekey để đỡ trích xuất lại mỗi lần không?
Chỉ cache ngắn hạn — vài phút đến vài giờ. Một số trang xoay sitekey định kỳ, nên khi tỷ lệ giải bắt đầu giảm, việc đầu tiên cần làm là trích xuất lại sitekey, không phải nghi ngờ API.
Làm sao biết một trang dùng reCAPTCHA Enterprise hay bản chuẩn?
Xem script tải trên trang: bản chuẩn nạp qua recaptcha/api.js, Enterprise nạp qua recaptcha/enterprise.js. Hàm detect_enterprise() ở trên tự động hoá bước này.
Trích xuất được sitekey rỗng thì xử lý thế nào?
Phần lớn do trang render sitekey bằng JavaScript sau khi tải, nên request HTML thuần không thấy được. Dùng Selenium (hoặc công cụ trình duyệt tương đương) thay vì requests.get().
Hướng dẫn liên quan
Lấy đúng sitekey ngay từ đầu — giải CAPTCHA với CaptchaAI.