Hướng dẫn
Dùng token để vượt reCAPTCHA
Trang này được dịch máy từ bản tiếng Trung và có thể có sai sót. Nội dung theo bản tiếng Trung.
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ý
Phần tiêu đề “Nguyên lý”Luồng khi truy cập bình thường:
- Trang web tải reCAPTCHA, người dùng hoàn thành xác minh;
- 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); - Người dùng gửi biểu mẫu, token được gửi kèm đến máy chủ của website;
- 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.
Cách 1: Gửi request trực tiếp (khuyến nghị)
Phần tiêu đề “Cách 1: Gửi request trực tiếp (khuyến nghị)”- 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 đó.
- 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ằng03A; một số website đổi tên, ví dụgrecaptcharesponse,captcha. - 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:
"""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.pyEach run creates one NoCaptchaTaskProxyless task (charged per the price list)."""import osimport 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.)
Phần tiêu đề “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:
- Đọc
data-sitekeytừ trang, dùng nó để tạo tác vụ và nhận token. - Ghi token vào ô văn bản
g-recaptcha-responsetrong trang. - 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. - Gửi biểu mẫu.
// 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.
Ví dụ hoàn chỉnh (Selenium 4):
"""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.pyEach run creates one NoCaptchaTaskProxyless task (charged per the price list)."""import osimport time
import requestsfrom selenium import webdriverfrom 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 automaticallytry: 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
Phần tiêu đề “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
Phần tiêu đề “Đã 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. - 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 để nhấp chuột thật trong trình duyệt, hoặc dùng tiện ích trình duyệt.