Khi một luồng tự động trong Make (trước đây là Integromat) chạm phải reCAPTCHA v2, bạn không cần viết thêm dòng code nào — chỉ cần vài mô-đun HTTP gọi tới CaptchaAI là biểu mẫu chạy tiếp. Luồng gồm bốn bước quen thuộc: gửi CAPTCHA sang CaptchaAI, nhận về ID task, polling cho tới khi có kết quả, rồi lấy token đưa vào mô-đun tiếp theo.
Bài này dựng nguyên một kịch bản Make hoàn chỉnh cho reCAPTCHA v2 — từ webhook đầu vào, hai lần gọi in.php / res.php, vòng lặp polling, cho tới nhánh Router xử lý kết quả và lỗi. Vì Make chưa có app CaptchaAI chính thức, toàn bộ tích hợp đi qua mô-đun HTTP, và đó lại là ưu điểm: bạn kiểm soát trọn vẹn tham số và cách xử lý lỗi.
Điều kiện cần có trước khi bắt đầu
Trước khi mở Make và kéo mô-đun đầu tiên, chuẩn bị sẵn ba thứ:
- Tài khoản CaptchaAI kèm API key — đăng ký và lấy key tại CaptchaAI.
- Một tài khoản Make với quyền tạo kịch bản (scenario) mới.
sitekeyreCAPTCHA v2 và URL của trang chứa biểu mẫu bạn cần kiểm thử.
Có đủ ba thứ này, phần còn lại chỉ là ráp mô-đun trong Make.
Kịch bản thực tế: đội QA tự động điền biểu mẫu
Hình dung một đội QA của công ty outsourcing ở TP.HCM cần kiểm thử luồng đăng ký trên môi trường staging, và biểu mẫu đó có reCAPTCHA v2 chặn ngay bước cuối. Thay vì bấm tay từng lần, họ dựng một kịch bản Make: webhook nhận URL trang và sitekey, gửi CAPTCHA sang CaptchaAI để giải, polling tới khi token sẵn sàng, rồi trả token đã giải về qua webhook hoặc đẩy thẳng sang mô-đun kế tiếp.
Mẫu này dùng lại được cho mọi luồng bị CAPTCHA chặn: tự động điền biểu mẫu, nhập liệu định kỳ, hay giám sát dữ liệu công khai trên hệ thống mà bạn có quyền vận hành.
Bước 1: dựng kịch bản trong Make
Trong Make, tạo một kịch bản mới gồm các mô-đun dưới đây.
Mô-đun 1: webhook trigger (custom webhook)
Tạo một custom webhook để nhận request yêu cầu giải CAPTCHA:
Cấu trúc dữ liệu webhook:
{
"sitekey": "6Le-wvkSVVABCPBMRTvw0Q4Muexq1bi0DJwx_mJ-",
"pageurl": "https://example.com/form",
"captcha_type": "recaptcha_v2"
}
Trong Make, thêm mô-đun Webhooks > Custom webhook, nhấp Add để tạo webhook mới rồi sao chép URL webhook. Cuối cùng, khai báo cấu trúc dữ liệu với các trường sitekey, pageurl và captcha_type.
Mô-đun 2: HTTP request — gửi task tới CaptchaAI
Thêm mô-đun HTTP > Make a request và cấu hình:
- URL:
https://ocr.captchaai.com/in.php - Phương thức: GET
- Query String: các tham số liệt kê bên dưới
Các tham số Query String cần điền:
key— API key CaptchaAI của bạnmethod—userrecaptchagooglekey—{{1.sitekey}}(ánh xạ từ webhook)pageurl—{{1.pageurl}}(ánh xạ từ webhook)json—1
Bật Parse response và đặt về JSON.
Sau khi mô-đun này chạy, phản hồi trả về:
{
"status": 1,
"request": "TASK_ID_12345"
}
Giá trị request chính là ID task bạn sẽ dùng để polling.
Mô-đun 3: mô-đun Sleep
Thêm mô-đun Tools > Sleep đặt 15 giây. Khoảng chờ này cho CaptchaAI đủ thời gian giải CAPTCHA trước khi bạn bắt đầu polling, tránh gọi res.php quá sớm khi kết quả chưa có.
Mô-đun 4: HTTP request — polling kết quả
Thêm một mô-đun HTTP > Make a request nữa và cấu hình:
- URL:
https://ocr.captchaai.com/res.php - Phương thức: GET
- Query String: các tham số liệt kê bên dưới
Các tham số Query String cho lần polling:
key— API key CaptchaAI của bạnaction—getid—{{2.data.request}}(ID task từ Mô-đun 2)json—1
Mô-đun 5: Router — kiểm tra kết quả
Thêm một Router ngay sau mô-đun polling và chia thành hai nhánh với điều kiện lọc riêng:
| Nhánh | Điều kiện lọc | Hành động |
|---|---|---|
| CAPTCHA đã giải (status = 1) | {{4.data.status}} bằng 1 |
Đi tiếp tới hành động kế (webhook response, ghi vào database, v.v.) |
| Chưa sẵn sàng | {{4.data.request}} bằng CAPCHA_NOT_READY |
Nối ngược về Mô-đun 3 (Sleep) để tạo vòng polling |
Bước 2: xử lý vòng polling
Make cho phép lặp bằng mô-đun Repeater, hoặc bằng cách nối mô-đun ngược về các giai đoạn trước. Cách trực tiếp nhất là thêm một mô-đun Repeater đặt 10 lần lặp (số lần polling tối đa), đặt chuỗi Sleep → Poll → Router bên trong repeater, và để Router thoát vòng lặp ngay khi status = 1.
Cách khác là dùng mô-đun Flow Control > Repeater với hai cài đặt:
- Repeats: 10
- Giá trị ban đầu:
{{2.data.request}}(ID task)
Mỗi vòng lặp sẽ Sleep 5 giây, polling CaptchaAI rồi kiểm tra kết quả đã sẵn sàng chưa. Giới hạn 10 vòng giữ cho kịch bản không chạy vô tận nếu một CAPTCHA khó bất thường.
Bước 3: dùng token đã giải
Khi CAPTCHA được giải xong, token nằm trong {{4.data.request}}. Dùng nó ở các mô-đun tiếp theo theo một trong ba cách sau.
Cách A: trả về qua Webhook Response
Thêm mô-đun Webhooks > Webhook response:
{
"token": "{{4.data.request}}",
"status": "solved"
}
Cách B: gửi vào biểu mẫu
Thêm mô-đun HTTP > Make a request để gửi token tới endpoint biểu mẫu của trang mục tiêu, cấu hình như sau:
- URL: URL action của biểu mẫu mục tiêu
- Phương thức: POST
- Body: dữ liệu biểu mẫu kèm
g-recaptcha-response: {{4.data.request}}
Cách C: lưu vào cơ sở dữ liệu
Thêm mô-đun Google Sheets, Airtable hoặc Database để ghi lại kết quả giải phục vụ theo dõi và đối soát.
Sơ đồ luồng kịch bản hoàn chỉnh
Trước khi soát lỗi, đây là bức tranh tổng thể của toàn bộ kịch bản — từ webhook đầu vào cho tới nhánh Router xử lý kết quả và lỗi:
[Webhook Trigger]
↓
[HTTP: Submit to CaptchaAI in.php]
↓
[Sleep: 15 seconds]
↓
[Repeater: 10 iterations]
↓ (each iteration)
[Sleep: 5 seconds]
[HTTP: Poll CaptchaAI res.php]
[Router]
Route 1 (solved) → [Use Token] → [Webhook Response]
Route 2 (not ready) → continue loop
Route 3 (error) → [Error Handler]
Sơ đồ cho thấy hai lối thoát chính của Router:
- Giải xong (
status = 1): chuyển token sang bước dùng token rồi trả kết quả. - Chưa xong (
CAPCHA_NOT_READY): quay lại vòng Sleep–Poll cho tới khi hết số vòng cho phép.
Xử lý lỗi
Cấu hình error handler trên các mô-đun HTTP theo từng điểm có thể hỏng:
| Vị trí lỗi | Dấu hiệu | Cách xử lý |
|---|---|---|
| Mô-đun 2 (gửi task) | ERROR_ZERO_BALANCE |
Nạp thêm số dư vào tài khoản |
| Mô-đun 2 (gửi task) | ERROR_WRONG_USER_KEY |
Soát lại API key |
| Mô-đun 4 (polling) | ERROR_CAPTCHA_UNSOLVABLE |
Kiểm tra lại sitekey và pageurl |
| Mô-đun 4 (polling) | Lỗi mạng | Thử lại request |
| Repeater | Timeout (hết số vòng) | Chuyển sang error handler để ghi log |
Trong Make, thêm error handler bằng cách nhấp chuột phải vào mô-đun → Add error handler → chọn Resume (bỏ qua và chạy tiếp) hoặc Rollback (hủy kịch bản).
Khắc phục sự cố
| Vấn đề | Nguyên nhân | Cách xử lý |
|---|---|---|
| Webhook không kích hoạt | URL chưa được đăng ký | Kiểm tra URL webhook đang hoạt động trong Make |
ERROR_WRONG_USER_KEY |
Định dạng API key sai | Soát API key đủ 32 ký tự, không dư khoảng trắng |
| Vòng polling không bao giờ ra kết quả | Sleep quá ngắn hoặc sai ID task | Kiểm tra ánh xạ ID task; tăng Sleep lên 10 giây |
| Kịch bản bị timeout | Giới hạn thời gian chạy của Make (5 phút với gói miễn phí) | Nâng gói hoặc rút ngắn khoảng polling |
| Lỗi parse JSON | Phản hồi không được đọc dưới dạng JSON | Bật "Parse response" trên mô-đun HTTP; đặt json=1 trong request |
Khi nào nên dùng Make thay vì tự viết code
Make hợp lý khi nhóm vận hành muốn dựng và chỉnh luồng ngay trên giao diện kéo–thả. Cân nhắc hướng này khi:
- Bạn cần ráp nhanh một luồng QA nội bộ và ưu tiên tốc độ dựng.
- Người bảo trì kịch bản không chuyên về code nhưng vẫn muốn tự sửa từng bước.
- Khối lượng giải CAPTCHA vừa phải và chấp nhận chi phí thao tác (operations) của Make.
Khi khối lượng lớn hoặc cần độ trễ thấp, gọi thẳng API CaptchaAI từ code (Python, Node.js) thường tiết kiệm và linh hoạt hơn.
Câu hỏi thường gặp
Chạy kịch bản giải CAPTCHA này trên Make tốn bao nhiêu?
Make tính phí theo số thao tác (operations). Mỗi request HTTP và mỗi lần chạy mô-đun tính là một thao tác, nên một lần giải CAPTCHA thường tiêu tốn 5–15 thao tác (gửi + Sleep + 3–10 lần polling + xử lý kết quả). Phần chi phí CaptchaAI thì tách riêng và tính theo thread, không theo từng lần giải.
Nên đặt thời gian Sleep bao lâu trước khi polling?
Bắt đầu với 15 giây cho lần Sleep đầu, sau đó polling mỗi 5 giây. reCAPTCHA v2 thường giải xong trong khoảng đó; nếu bạn thấy nhiều CAPCHA_NOT_READY liên tiếp, tăng Sleep đầu lên 20 giây thay vì rút ngắn khoảng polling, để tránh gọi res.php dày một cách vô ích.
Tôi cần gói CaptchaAI nào để chạy nhiều kịch bản Make song song?
Số kịch bản chạy đồng thời bị giới hạn bởi số thread trong gói của bạn — mỗi CAPTCHA đang giải chiếm một thread. Gói BASIC ($15/tháng, 5 thread) đủ cho vài luồng chạy song song với số lần giải không giới hạn; khi khối lượng tăng, STANDARD ($30/tháng, 15 thread) hoặc ADVANCE ($90/tháng, 50 thread) cho thêm dư địa. Trong Make, bật xử lý song song bằng Operations → Allow storing of incomplete executions → Yes.
Kịch bản có giải được loại CAPTCHA khác ngoài reCAPTCHA v2 không?
Có. Với Cloudflare Turnstile, đổi tham số method thành turnstile và truyền sitekey ở request gửi task; luồng webhook, polling và Router giữ nguyên. CaptchaAI cũng hỗ trợ reCAPTCHA v3, GeeTest v3 và các loại image/OCR theo cùng mẫu — chỉ thay method cho đúng loại. Lưu ý CaptchaAI hiện không hỗ trợ hCaptcha hay FunCaptcha, nên đừng dựng nhánh cho hai loại này.
Bài viết liên quan
- Giải reCAPTCHA v2 dạng callback qua API
- Xử lý reCAPTCHA v2 và Turnstile trên cùng một trang
- Cơ chế callback của reCAPTCHA v2
Các bước tiếp theo
Bắt đầu tự động hóa việc giải CAPTCHA trong Make —lấy API key CaptchaAI của bạnvà dựng kịch bản đầu tiên.
Hướng dẫn liên quan: