Tích Hợp

Power Automate + CaptchaAI: Giải quyết CAPTCHA của Microsoft Flow

Power Automate không tự giải được CAPTCHA — nhưng chỉ cần một hành động HTTP (connector cao cấp có sẵn trong mọi gói Premium) và tài khoản CaptchaAI, bạn có thể gắn bước giải CAPTCHA vào bất kỳ luồng nào mà không cần viết dòng code nào ngoài Power Automate.

Bài này đi thẳng vào bốn thao tác cốt lõi: gửi task tới in.php, polling res.php, kiểm tra trạng thái bằng action Condition, và dùng token trong bước submit form — dành cho người đã quen dựng luồng Power Automate nhưng chưa từng nối với một CAPTCHA solver.

Vì sao đội automation/QA hay gặp CAPTCHA ở đây

Nhiều đội automation tại các công ty gia công phần mềm và agency ở TP.HCM, Hà Nội dùng Power Automate để nối dữ liệu giữa SharePoint, Excel Online và các cổng của nhà cung cấp — hoàn toàn không cần dev viết script riêng. Vấn đề chỉ xuất hiện khi cổng đích bật reCAPTCHA v2 để chặn bot: luồng chạy đến bước submit form thì kẹt lại vì không có token hợp lệ.

Một kịch bản điển hình: đội tài chính cần lấy báo giá và trạng thái đơn hàng từ cổng của nhà cung cấp mỗi sáng. Thay vì để nhân viên đăng nhập thủ công và tick "Tôi không phải robot", luồng Power Automate nhận sitekeypageurl của trang đích làm tham số đầu vào, gửi hai tham số này tới CaptchaAI, polling cho đến khi có token, rồi dùng token đó để xác thực và tiếp tục truy xuất dữ liệu.

Không có sản phẩm nào giả lập việc "đăng nhập" thay bạn — luồng vẫn chỉ thao tác trên hệ thống mà bạn đã có quyền truy cập, chỉ là bỏ qua bước chờ người ngồi giải CAPTCHA thủ công.

Bước 1: Tạo luồng và khai báo tham số đầu vào

Trong Power Automate, tạo một Luồng đám mây tức thì (Instant cloud flow) với Trình kích hoạt thủ công (hoặc trigger khác tùy nhu cầu — ví dụ chạy theo lịch mỗi sáng).

Thêm hai input kiểu văn bản vào trigger:

  • sitekey — sitekey reCAPTCHA v2 của trang đích
  • pageurl — URL đầy đủ của trang chứa CAPTCHA

Bước 2: Gửi task CAPTCHA tới CaptchaAI

Thêm action HTTP (connector Premium) với method GET và URI https://ocr.captchaai.com/in.php.

Khai báo các query parameter sau:

  • key — API key CaptchaAI của bạn
  • methoduserrecaptcha
  • googlekey@{triggerBody()['text']} (input sitekey)
  • pageurl@{triggerBody()['text_1']} (input pageurl)
  • json1

Phân tích phản hồi: thêm action Parse JSON ngay sau action HTTP.

Schema:

{
  "type": "object",
  "properties": {
    "status": { "type": "integer" },
    "request": { "type": "string" }
  }
}

Content: @{body('HTTP')}

Bước 3: Kiểm tra kết quả gửi task

Thêm action Condition với điều kiện @{body('Parse_JSON')?['status']} bằng 1.

Nếu Không (gửi thất bại): thêm action Terminate với trạng thái "Failed" và message Submit error: @{body('Parse_JSON')?['request']}.

Nếu Có: chuyển sang vòng polling ở bước tiếp theo.

Bước 4: Dựng vòng polling lấy token

Bên trong nhánh "If Yes", thêm vòng lặp Do until:

Điều kiện vòng lặp: @{variables('solveStatus')} khác pending

Trước vòng lặp, khởi tạo hai biến kiểu String: solveStatus = pendingsolvedToken = rỗng.

Bên trong vòng lặp Do until, thêm các action sau theo đúng thứ tự:

4a. Delay

Thêm action Delay: 5 giây. CaptchaAI cần vài giây để giải xong; polling dày hơn chỉ tốn thêm request mà không rút ngắn thời gian chờ thực tế.

4b. HTTP — polling kết quả

Gửi request GET tới URI https://ocr.captchaai.com/res.php với các query parameter sau:

  • key — API key CaptchaAI của bạn
  • actionget
  • id@{body('Parse_JSON')?['request']}
  • json1

4c. Parse JSON — phản hồi polling

Dùng đúng schema đã khai báo ở Bước 2.

4d. Condition — kiểm tra trạng thái

Điều kiện: @{body('Parse_JSON_2')?['status']} bằng 1

Nếu Có (đã giải xong): set biến solvedToken = @{body('Parse_JSON_2')?['request']} và set biến solveStatus = solved.

Nếu Không: thêm condition khác kiểm tra @{body('Parse_JSON_2')?['request']} khác CAPCHA_NOT_READY. Nếu đúng (có lỗi thật sự), set solveStatus = error; nếu sai (vẫn đang chờ), không làm gì cả — vòng lặp tiếp tục.

Đặt giới hạn cho Do until: đếm tối đa 20 lần lặp, timeout PT3M (3 phút).

Với delay 5 giây và tối đa 20 lần lặp, vòng polling tự dừng sau khoảng 100 giây nếu CaptchaAI chưa trả kết quả — đủ dư so với thời gian giải reCAPTCHA v2 thông thường, nhưng bạn vẫn nên set timeout tường minh thay vì để action tự timeout ở mức mặc định 2 phút.

Bước 5: Dùng token đã giải

Sau vòng lặp, thêm Condition kiểm tra @{variables('solveStatus')}:

Nếu bằng "solved": dùng @{variables('solvedToken')} trong một HTTP POST để submit form, hoặc gửi token qua email, tin nhắn Teams, hoặc connector khác nếu form submit nằm ở bước riêng.

Ví dụ HTTP POST để submit form: method POST, URI là URL form đích, body {"g-recaptcha-response": "@{variables('solvedToken')}", "other_field": "value"}.

Nếu không phải "solved": gửi thông báo lỗi qua Teams hoặc email để người vận hành xử lý tay.

Sơ đồ toàn bộ luồng

[Manual Trigger (sitekey, pageurl)]
    ↓
[Initialize Variables: solveStatus, solvedToken]
    ↓
[HTTP: Submit to CaptchaAI /in.php]
    ↓
[Parse JSON]
    ↓
[Condition: status = 1?]
    ↓ Yes
[Do Until: solveStatus ≠ pending]
    ├── [Delay: 5 seconds]
    ├── [HTTP: Poll CaptchaAI /res.php]
    ├── [Parse JSON]
    └── [Condition: Solved or Error?]
    ↓
[Condition: solveStatus = solved?]
    ↓ Yes
[HTTP: Submit form with token]
    ↓
[Compose: Success response]

Khắc phục sự cố

  • Không thấy action HTTP — nguyên nhân: gói miễn phí không có connector Premium. Cách xử lý: nâng cấp Power Automate Premium, hoặc dùng custom connector.
  • Parse JSON báo lỗi — nguyên nhân: response trả về là text thuần, không phải JSON. Cách xử lý: kiểm tra query có json=1 chưa.
  • Vòng lặp chạy mãi không dừng — nguyên nhân: biến solveStatus chưa được set đúng. Cách xử lý: đối chiếu tên biến trong các action Set variable — chỉ cần lệch một ký tự là loop không thoát.
  • Lỗi 403 từ CaptchaAI — nguyên nhân: IP bị chặn hoặc sai API key. Cách xử lý: kiểm tra lại API key; xem tài khoản có bật whitelist IP không.
  • Luồng bị timeout — nguyên nhân: timeout mặc định 30 ngày của cả flow không phải vấn đề, nhưng mỗi action lẻ tự timeout sau 2 phút. Cách xử lý: timeout PT3M trên Do until đã xử lý việc này; tăng thêm nếu vendor portal chậm.

Câu hỏi thường gặp

Có bắt buộc phải dùng Power Automate Premium không?

Có. Action HTTP là tính năng Premium. Nếu tài khoản đang ở gói miễn phí, bạn có hai lựa chọn: dựng một custom connector, hoặc đẩy phần gọi API sang Azure Functions rồi gọi ngược lại từ luồng.

Cần bao nhiêu thread CaptchaAI cho một luồng chạy mỗi sáng?

Với một luồng chạy một lần mỗi ngày, gói BASIC ($15/tháng, 5 thread) là đủ — bạn chỉ dùng 1 thread tại một thời điểm trong toàn bộ vòng polling. Chỉ cần nâng lên STANDARD ($30/tháng, 15 thread) trở lên nếu bạn chạy nhiều luồng song song hoặc xử lý theo batch nhiều bản ghi cùng lúc.

Nên lưu API key ở đâu để không bị lộ trong định nghĩa luồng?

Dùng connector Environment Variables hoặc Azure Key Vault của Power Automate thay vì hardcode API key trực tiếp trong action HTTP — cả hai đều tránh việc key lộ ra khi export/import package luồng cho người khác.

Nếu vòng polling hết 20 lần lặp mà vẫn chưa có token thì sao?

solveStatus vẫn giữ giá trị pending, nhánh "Nếu bằng solved" ở Bước 5 sẽ không chạy — luồng đi thẳng vào nhánh lỗi. Đây là hành vi mong muốn: đừng submit form với token rỗng, hãy để action gửi cảnh báo và kiểm tra sitekey/pageurl trước khi chạy lại.

Có thể dùng cách này với Azure Logic Apps thay vì Power Automate không?

Được. Logic Apps dùng cùng mô hình action HTTP + Do Until, nên toàn bộ cấu trúc — gửi tới in.php, polling res.php, kiểm tra status — chuyển sang gần như nguyên vẹn, chỉ khác cú pháp cấu hình action trong designer.

Bài viết liên quan

Các bước tiếp theo

Muốn thêm bước giải CAPTCHA vào luồng Power Automate của bạn? Lấy API key CaptchaAI và dựng luồng theo 5 bước ở trên — có thể chạy thử ngay với gói BASIC trước khi mở rộng.

Hướng dẫn liên quan:

Os comentários estão desativados para este artigo.