CaptchaOCR.
CaptchaOCR là một micro-service FastAPI nhỏ gọn làm đúng một việc: nhận ảnh captcha 4 chữ số dưới dạng base64, trả về số nguyên. Model ddddocr pretrained được load một lần khi khởi động, mọi request sau đó chỉ là inference thuần — latency vài chục ms, đủ nhanh để nhúng vào bất kỳ luồng automation nào mà không tạo bottleneck. Deploy bằng PM2 với auto-restart và RAM cap cứng, chạy nền ổn định mà không cần để ý.
01.Overview
Tổng quanCaptchaOCR ra đời trong quá trình xây các project automation cho khách hàng — hầu hết các trang cần tự động đăng nhập hoặc đăng ký tài khoản đều có một bước không thể bỏ qua: nhập captcha. tesseract cho accuracy ~70% và lệ thuộc vào việc cài đúng version binary trên server; viết CNN tự train thì dữ liệu đủ lớn là một dự án riêng. Tôi cần thứ đơn giản hơn, dùng được ngay: một endpoint HTTP, nhận base64, trả số nguyên.
Giải pháp cuối cùng: FastAPI nhận POST với base64, ddddocr pretrained chạy trên ONNX runtime làm classification, regex lấy 4 chữ số đầu tiên, trả về int. Model load một lần lúc khởi động, mọi request sau đó chỉ là inference thuần. Service deploy bằng PM2 với max_memory_restart 1G. Accuracy đo trên 1.000 captcha thật: ~96%.
02.Features
Tính năng- 01POST /ocrbase64 in · int out · 422 on fail
Service chỉ có một endpoint duy nhất:
POST /ocrnhận body{ image_base64 | text }, chạy OCR và trả về{ number: int }khi đọc được đủ 4 chữ số. Nếu base64 hỏng hoặc OCR không tìm đủ ký tự, service trả về422kèm detail cụ thể — không im lặng, không trả về kết quả sai. Health check tạiGET /để monitor biết service còn sống. - 02Pretrained ddddocrNo training · model loads once
ddddocr 1.5.6là model CNN pretrained chạy trên ONNX runtime, được thiết kế chuyên biệt cho captcha chữ và số. Engine được khởi tạo ở module level — load đúng một lần khi process start, không load lại theo từng request. Mọi lần gọi sau đó chỉ tốn chi phí inference thuần, giữ latency ổn định dù traffic tăng. - 03Parsing chịu lỗidata-url or raw · regex extract digits
_decode_data_urlxử lý cả hai dạng đầu vào —data:image/png;base64,…lẫn base64 thô — validate trước khi decode để bắt lỗi sớm thay vì để crash sâu bên trong._extract_4_digit_captchachạy regex\dtrên output OCR rồi cắt lấy đúng 4 chữ số đầu tiên — cách này chịu được nhiễu ký tự đặc biệt mà model đôi khi trả về lẫn vào kết quả. - 04PM2 deployautorestart · max_memory_restart 1G
PM2 được cấu hình trong
eco.config.jsđể chạy service bằng Python từ virtualenv, một instance duy nhất vớiautorestart: truephòng trường hợp crash bất ngờ.max_memory_restart: "1G"đặt làm ngưỡng cứng để phòng memory leak từ ONNX runtime tích luỹ dần theo thời gian — thay vì để service phình RAM vô thời hạn, PM2 tự restart và lấy lại bộ nhớ. Biến môi trườngORT_LOGGING_LEVEL=3giữ log ở mức error only, tránh ONNX runtime làm nhiễu output bằng các dòng verbose không cần thiết. - 05Schema gõ chặtPydantic · auto OpenAPI · Swagger UI
Request và response được định nghĩa bằng Pydantic v2 — FastAPI tự sinh OpenAPI docs tại
/docsvà/redocmà không cần viết tay. Fieldimage_base64hỗ trợ thêm aliastextđể các client cũ gửi payload theo tên cũ vẫn hoạt động bình thường mà không cần đổi code phía client.
03.Tech stack
Công nghệ sử dụng| API | FastAPI 0.115 · Uvicorn 0.30 · Pydantic v2 |
| OCR | ddddocr 1.5.6 (CNN pretrained · ONNX Runtime backend) · không training, không GPU |
| Runtime | Python 3.13 · venv · single process · model loaded once at module import |
| Deploy | PM2 (eco.config.js) · autorestart · max_memory_restart 1G · ORT_LOGGING_LEVEL=3 · cổng 8000 |
| I/O | Base64 (data URL hoặc raw) → bytes → OCR → regex \d → int 4 chữ số |
| Footprint | 3 dependencies · 67 dòng Python · ~150MB RAM ổn định · ~30ms / request |
04.How it works
Kiến trúc tổng thểService đứng giữa hai thứ rất khác nhau: một thư viện ML pretrained (ddddocr, gói lại ONNX Runtime) và một client HTTP đơn giản. Việc của FastAPI ở đây gói gọn đúng ba chuyện: lifecycle (model load một lần ở module level), validation (Pydantic + try/except cho base64), và contract (số nguyên 4 chữ số). Mọi thứ khác — batching, queue, async — chưa cần thiết ở quy mô này.
Một request đi qua đúng 4 bước: (1) _decode_data_url bóc prefix data:image/png;base64, nếu có và validate bằng b64decode(..., validate=True); (2) bytes ảnh đi vào ocr_engine.classification(...) — ddddocr chạy inference khoảng ~25ms trên CPU; (3) regex \d gom toàn bộ chữ số trong output, raise nếu không đủ 4; (4) cắt 4 chữ số đầu và ép kiểu int(...). Lỗi ở bất kỳ bước nào đều biến thành HTTP 422 kèm message rõ ràng — không có lỗi nào bị nuốt im lặng.
"CaptchaOCR giải quyết được đúng một trường hợp: captcha thuần số. Với captcha vừa chữ vừa số, ddddocr accuracy giảm đáng kể và tôi vẫn đang tìm hướng xử lý phù hợp hơn. Hiện tại khi endpoint trả về 422 hoặc kết quả sai, luồng automation fallback sang gọi AI để đọc ảnh — chậm hơn và tốn hơn, nhưng đủ để không làm gián đoạn toàn bộ pipeline trong lúc chờ giải pháp tốt hơn."
ZoomBot là một pool các bot Chrome tự động tham gia Zoom meeting và chờ lệnh điều khiển từ xa qua HTTP API. Mỗi bot chạy trên một instance Chrome riêng biệt, có lock riêng, hoàn toàn thread-safe — các bot không can thiệp lẫn nhau dù chạy song song. Từ một API call duy nhất, có thể điều khiển từng bot gửi chat, bật/tắt mic, bật/tắt video, rời phòng hoặc rejoin. Khi bot crash, hệ thống tự phát hiện và khởi động lại mà không cần can thiệp tay. Toàn bộ được viết bằng Python, Selenium và Flask — đủ gọn để chạy trên một máy chủ thông thường mà không cần hạ tầng phức tạp.
API NestJS tự đăng nhập ChatGPT bằng puppeteer-real-browser (bypass Cloudflare anti-bot), hỗ trợ OTP qua email, lưu session để dùng lại cho route /ask để promt, và cron job mỗi giờ kiểm tra session — gửi cảnh báo qua Telegram khi hết hạn. Điều này giúp tôi promt và nhận câu trả lời trực tiếp từ api mà không cần mở trình duyệt.
BankNotify biến một chiếc điện thoại Android cũ thành cổng thanh toán DIY cho merchant nhỏ. App Flutter + Kotlin chạy nền trên điện thoại, đọc thông báo biến động số dư từ app ngân hàng và forward ngay về backend qua HTTP. Backend nhận thông báo, match với đơn hàng đang pending, rồi gọi callback để hoàn thành thanh toán — tất cả xảy ra trong vài giây, không cần tích hợp cổng thanh toán chính thức, không cần phí hàng tháng.

RandomKit là bộ công cụ ngẫu nhiên chạy hoàn toàn trên client — không server, không gửi dữ liệu đi đâu. Gồm các công cụ thường dùng: vòng quay tuỳ chỉnh với xác suất công bằng và hiển thị minh bạch từng phần trăm, đua vịt, bốc thăm, tung xu, xúc xắc, sinh số ngẫu nhiên, tạo mật khẩu, và chọn vị trí ngẫu nhiên trên bản đồ. Giao diện hỗ trợ song ngữ vi/en, cấu trúc SEO chuẩn để tìm kiếm được từng công cụ riêng lẻ.
05.Bình luận
Ý kiến của bạnChưa có bình luận nào.