Tích Hợp CaptCha69 Với Selenium, Puppeteer & Playwright — Tự Động Giải Captcha Trong Automation
16/06/2026
Khi bạn viết bot giải captcha hoặc chạy automation để đăng ký tài khoản, submit form, scrape dữ liệu… thì captcha luôn là chướng ngại vật cuối cùng. Thay vì cố gắng train mô hình OCR hay mua proxy xoay vòng đắt đỏ, cách phổ biến và ổn định nhất là giao việc giải cho một dịch vụ giải captcha như CaptCha69 rồi inject token trả về vào trang. Bài viết này hướng dẫn bạn tích hợp CaptCha69 với Selenium, Puppeteer và Playwright — từ pattern chung tới code mẫu chạy được, kèm một cách "không cần code" dùng extension.
CaptCha69 dùng API tương thích 2Captcha (gồm in.php để submit và res.php để poll kết quả), nên nếu bạn đã từng code với 2Captcha hay anti-captcha thì gần như chỉ cần đổi key là chạy. Token reCAPTCHA điền vào textarea #g-recaptcha-response, còn token Turnstile điền vào input [name="cf-turnstile-response"] hoặc trigger callback của widget. Trước khi đi sâu, nếu bạn mới làm quen với API, hãy đọc hướng dẫn giải reCAPTCHA v2 bằng API để nắm cơ bản.
Pattern Chung Khi Tự Động Giải Captcha
Dù bạn dùng Puppeteer, Selenium hay Playwright — Python, Node.js, C# — thì automation giải captcha đều tuân theo cùng một quy trình 6 bước:
- Mở trang bằng Selenium/Puppeteer/Playwright, đợi DOM load xong.
- Detect loại captcha (reCAPTCHA, Turnstile, hCaptcha…) và lấy sitekey từ thuộc tính
data-sitekeycủa widget. - Gọi CaptCha69 API (POST
in.php) vớigooglekey/sitekey+pageurlđể nhậncaptcha_id. - Poll
res.phpmỗi vài giây tới khi nhận được token (thường 5–20 giây). - Inject token vào page bằng
page.evaluate/execute_script: set value cho#g-recaptcha-responsehoặc input Turnstile. - Submit form (click nút hoặc
form.submit()) và xác nhận trang đã chuyển.
Hiểu được pattern này, bạn có thể áp dụng cho bất kỳ trang nào, bất kỳ loại captcha nào CaptCha69 hỗ trợ — từ reCAPTCHA v2/v3 tới Cloudflare Turnstile, FunCaptcha, GeeTest.
Code Mẫu 1: Puppeteer (Node.js) Giải reCAPTCHA v2
Ví dụ dưới đây mở một trang có reCAPTCHA v2 bằng Puppeteer, lấy sitekey, gọi CaptCha69, poll tới khi có token, rồi page.evaluate để set value cho #g-recaptcha-response và click nút submit.
const puppeteer = require('puppeteer');
const axios = require('axios');
const API_KEY = 'point_YOUR_KEY'; // doi key tai /client/api_key.php
const BASE = 'https://captcha69.com';
async function solveRecaptchaV2(page, pageurl) {
// 1. Lay sitekey tu thuoc tinh data-sitekey
const sitekey = await page.evaluate(() => {
const el = document.querySelector('.g-recaptcha');
return el ? el.getAttribute('data-sitekey') : null;
});
if (!sitekey) throw new Error('Khong tim thay reCAPTCHA sitekey');
// 2. Submit qua in.php
const submit = await axios.get(BASE + '/in.php', { params: {
method: 'userrecaptcha',
key: API_KEY,
googlekey: sitekey,
pageurl: pageurl,
json: 1
}});
const body = submit.data;
if (body.status !== 1) throw new Error('Submit fail: ' + body.request);
const captchaId = body.request;
// 3. Poll res.php cho den khi co token
let token = null;
for (let i = 0; i < 30; i++) {
await new Promise(r => setTimeout(r, 5000));
const res = await axios.get(BASE + '/res.php', { params: {
key: API_KEY, action: 'get', id: captchaId, json: 1
}});
const rb = res.data;
if (rb.status === 1) { token = rb.request; break; }
if (rb.request !== 'CAPCHA_NOT_READY') throw new Error('Loi: ' + rb.request);
}
if (!token) throw new Error('Timeout cho token');
// 4. Inject token vao page
await page.evaluate((tk) => {
const ta = document.querySelector('#g-recaptcha-response');
ta.style.display = 'block';
ta.value = tk;
}, token);
// 5. Submit form
await page.click('button[type=submit]');
await page.waitForNavigation({ waitUntil: 'networkidle0' });
console.log('Thanh cong!');
}
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
const url = 'https://example.com/login';
await page.goto(url, { waitUntil: 'networkidle2' });
await solveRecaptchaV2(page, url);
})();
Lưu ý: textarea #g-recaptcha-response mặc định bị ẩn (display:none), nên bạn phải set display:block trước khi gán value, nếu không một số trang sẽ bỏ qua token. Với Playwright, chỉ cần đổi page.evaluate thành page.evaluate (giống nhau) và puppeteer.launch thành chromium.launch.
Code Mẫu 2: Selenium (Python) Giải Cloudflare Turnstile
Turnstile hơi khác reCAPTCHA ở chỗ widget có thể dùng callback thay vì input ẩn, nhưng cách phổ biến nhất vẫn là inject token vào input [name="cf-turnstile-response"]. Ví dụ Selenium Python:
import time
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
API_KEY = 'point_YOUR_KEY' # lay tai /client/api_key.php
BASE = 'https://captcha69.com'
def solve_turnstile(driver, pageurl):
# 1. Lay sitekey cua Turnstile
widget = driver.find_element(By.CSS_SELECTOR, '.cf-turnstile')
sitekey = widget.get_attribute('data-sitekey')
if not sitekey:
raise RuntimeError('Khong tim thay Turnstile sitekey')
# 2. Submit in.php
r = requests.post(BASE + '/in.php', data={
'method': 'turnstile',
'key': API_KEY,
'sitekey': sitekey,
'pageurl': pageurl,
'json': 1
}).json()
if r.get('status') != 1:
raise RuntimeError('Submit fail: ' + str(r))
captcha_id = r['request']
# 3. Poll res.php
token = None
for _ in range(30):
time.sleep(5)
res = requests.get(BASE + '/res.php', params={
'key': API_KEY, 'action': 'get', 'id': captcha_id, 'json': 1
}).json()
if res.get('status') == 1:
token = res['request']
break
if res.get('request') != 'CAPCHA_NOT_READY':
raise RuntimeError('Loi: ' + str(res))
if not token:
raise RuntimeError('Timeout cho token')
# 4. Inject token vao input cf-turnstile-response
js = """
var el = document.querySelector('[name="cf-turnstile-response"]');
if (!el) {
el = document.createElement('input');
el.setAttribute('name', 'cf-turnstile-response');
document.body.appendChild(el);
}
el.value = arguments[0];
"""
driver.execute_script(js, token)
# 5. Submit form
driver.find_element(By.CSS_SELECTOR, 'button[type=submit]').click()
driver = webdriver.Chrome()
url = 'https://example.com/login'
driver.get(url)
time.sleep(3)
solve_turnstile(driver, url)
print('Thanh cong!')
Nếu trang Turnstile dùng callback (không có input ẩn), thay vì set value bạn gọi callback thông qua window.turnstileCallback(token) hoặc tên callback mà widget đã đăng ký — kiểm tra source để biết tên hàm chính xác.
Cách Không Cần Code: Extension All-In-One
Nếu bạn không muốn lo about sitekey, polling, injection — hoặc cần chạy hàng loạt trình duyệt fingerprint như GoLogin, Multilogin — thì cách nhanh nhất là dùng Extension All-In-One của CaptCha69 cho Chrome và Firefox. Cách hoạt động rất đơn giản:
- Tải extension tại trang Extensions Chrome/Firefox.
- Mở file
config.defaults.jsontrong thư mục extension, điền:apiKey: API key của bạn.keyType:point_,thread_hoặcmax1_.- Bật
enabledForRecaptcha,enabledForTurnstile… tùy loại captcha cần giải. - Bật
autoSolveRecaptcha,autoSolveTurnstile… để tự giải.
- Load extension kèm trình duyệt khi launch:
- Puppeteer/Chrome: thêm
--load-extension=path/to/ext --disable-extensions-except=path/to/extvàoargs. - Selenium Python:
webdriver.ChromeOptions.add_argument('--load-extension=path/to/ext')hoặc dùngadd_extensionvới file .crx.
- Puppeteer/Chrome: thêm
Khi script mở trang có captcha, extension tự phát hiện, gọi API CaptCha69, nhận token và inject — bạn không cần viết code API nào cả. Đây là lựa chọn lý tưởng khi bạn cần ship nhanh hoặc bảo trì nhiều profile fingerprint.
Ưu & Nhược Của Từng Cách
| Cách | Ưu điểm | Nhược điểm |
|---|---|---|
| Gọi API + inject (Puppeteer/Selenium/Playwright) | Check soát hoàn toàn, chạy headless thuần, không phụ thuộc extension, dễ debug, chạy được trên server Linux không GUI. | Phải tự xử lý sitekey/poll/inject, mỗi loại captcha code hơi khác nhau. |
| Extension All-In-One + config.defaults.json | Không cần code API, tự phát hiện mọi loại captcha, ship cực nhanh, chạy được với trình duyệt anti-detect. | Phải launch trình duyệt có GUI hoặc --headless=new có hỗ trợ extension, khó debug sâu, phụ thuộc cập nhật extension. |
Thực tế, nhiều team dùng kết hợp: extension cho luồng fingerprint/browse tay, còn pipeline server thuần thì dùng API trực tiếp để tối ưu chi phí và tốc độ.
Câu Hỏi Thường Gặp (FAQ)
API CaptCha69 có chạy được với code 2Captcha cũ không?
Có. API dùng chuẩn in.php/res.php giống 2Captcha. Bạn chỉ cần thay domain 2captcha.com thành captcha69.com và thay API key — toàn bộ logic Puppeteer/Selenium cũ chạy được ngay.
Puppeteer chạy headless có giải được reCAPTCHA không?
Có. Vì bạn không tự render/solve captcha trong browser mà ủy quyền cho CaptCha69 rồi inject token, nên headless hay headful đều được. Chỉ cần đảm bảo #g-recaptcha-response được set đúng value và form submit đầy đủ.
Token Turnstile inject vào mà form vẫn báo lỗi?
Một số trang Turnstile dùng callback thay vì input ẩn. Khi đó bạn cần gọi trực tiếp callback của widget (ví dụ window.turnstileCallback(token)) thay vì set value cho [name="cf-turnstile-response"]. Inspect source trang để xác định tên callback chính xác.
Loại key nào nên dùng cho automation?
Nếu volume vừa, đa dạng captcha → point_ (linh hoạt nhất). Nếu chạy số lượng lớn ReCaptcha/Turnstile/Image ổn định → thread_ (thuê bao tiết kiệm). Nếu cần tốc độ cao nhất, độ trễ thấp → max1_ (cloud solver). Xem chi tiết tại quản lý API Key.
Extension load kèm Selenium/Puppeteer có tốn thêm phí không?
Không. Extension gọi thẳng API CaptCha69 giống như code của bạn, xem bảng giá áp dụng chung. Cấu hình file config.defaults.json chỉ để tiện tự động hóa, không phát sinh chi phí ẩn.
Giá bao nhiêu, thanh toán thế nào?
Chi phí cực rẻ với nhiều gói linh hoạt — xem bảng giá chi tiết. Thanh toán qua Ngân Lượng, VietcomBank, PerfectMoney, Binance, NowPayments (crypto). Liên hệ Telegram @hkvn9x hoặc Zalo 0372.972.971.
Kết Luận & Bắt Đầu Ngay
Tích hợp CaptCha69 vào automation không hề khó — bạn chỉ cần nắm pattern detect → sitekey → API → inject → submit, áp dụng cho Puppeteer, Selenium hay Playwright đều như nhau. Cần check soát tối đa thì code API trực tiếp; cần ship nhanh thì dùng Extension All-In-One với config.defaults.json. Với API tương thích 2Captcha, success rate tới 99% và chi phí cực rẻ, CaptCha69 là lựa chọn lý tưởng cho mọi pipeline captcha solver automation.
Đăng ký tài khoản Lấy API Key Tải Extension
Hỗ trợ: Telegram @hkvn9x · Zalo 0372.972.971