BankNotify.
BankNotify là app Android viết bằng Flutter + Kotlin, chạy nền và lắng nghe thông báo biến động số dư từ app ngân hàng. Mỗi khi có tiền vào, app forward thông báo về backend qua HTTP — backend parse nội dung, match với đơn hàng đang pending, và tự gọi callback để hoàn thành thanh toán mà không cần can thiệp tay.
01.Overview
Tổng quanBank-notify-bridge giải đúng một bài toán mà merchant nhỏ ở Việt Nam luôn vướng: không có Open Banking API, không ký được hợp đồng MPOS, mà vẫn cần biết chính xác giây nào khách chuyển tiền vào tài khoản để đánh dấu đơn hàng đã thanh toán. Cách thủ công hôm nay là ngồi nhìn app ngân hàng, thấy thông báo "+50.000 VND" thì vào hệ thống đổi trạng thái đơn — chỉ trừ khi đơn hàng đến lúc 2h sáng.
Giải pháp: một con Android cũ luôn cắm điện, chạy Flutter app này. Service Android lắng nghe mọi thông báo từ app ngân hàng (Vietcombank, MB, TPBank, Techcombank…), trích title + bigText + timestamp, đóng gói JSON rồi POST lên webhook backend. Backend parse số tiền và mã giao dịch từ body, tìm đơn pending khớp, rồi tự gọi paymentSuccessCallback — không cần ai ngồi canh. Đang chạy 24/7 trên một con Redmi Note 8 cũ, phục vụ ~250 đơn / ngày.
02.Features
Tính năng- 01Lắng nghe thông báo bankingNotificationListenerService · bank app whitelist
NotificationListenerServiceđược cấp system permission để lắng nghe toàn bộ notification trên thiết bị, sau đó lọc theopackageNamecủa các app ngân hàng Việt Nam — chỉ forward những gì thực sự cần, bỏ qua mọi thứ còn lại. Khi notification đến, service tríchEXTRA_TITLEvà ưu tiên đọcEXTRA_BIG_TEXTthay vìEXTRA_TEXT— vì notification ngân hàng thường dài và mã giao dịch nằm ở cuối chuỗi, trong khiEXTRA_TEXThay bị Android cắt bớt trước khi tới được phần quan trọng nhất. - 02Webhook hoàn thành đơnJSON POST · backend match · payment callback
Mỗi notification được đóng gói thành JSON
{ package, title, text, timestamp, type }và POST lên URL mà người dùng tự cấu hình. Backend nhận payload, parse số tiền và mã giao dịch từ trườngtext, tìm đơn hàngpendingkhớp theo nội dung chuyển khoản, rồi tự gọipaymentSuccessđể hoàn tất đơn — toàn bộ luồng xảy ra trong vài giây, không cần thao tác tay ở bất kỳ bước nào. - 033 lớp keep-aliveForeground service · BOOT_COMPLETED · START_STICKY
Giữ một con điện thoại chạy 24/7 đòi hỏi phòng thủ ở nhiều lớp.
FloatingServicechạy ở chế độ foreground với persistent notification — đủ để Android ưu tiên giữ lại khi RAM thấp thay vì kill. Nếu vẫn bị kill,START_STICKYyêu cầu system tự khởi động lại service mà không cần can thiệp tay. Khi điện thoại reboot,BootReceiverlắng ngheACTION_BOOT_COMPLETEDvà bật service ngay lập tức — không cần ai mở app thủ công sau mỗi lần mất điện. - 04State chia sẻ Flutter ↔ KotlinFlutterSharedPreferences · flutter.* keys
Flutter UI và Android service chạy ở hai process logic tách biệt nhưng dùng chung một nguồn cấu hình: file
FlutterSharedPreferencesvới prefixflutter.. Hai key quan trọng nhất làflutter.server_url— URL webhook backend — vàflutter.is_service_running— trạng thái service hiện tại. Người dùng đổi URL trên UI, service đọc giá trị mới ngay ở lần notification kế tiếp mà không cần restart hay đồng bộ thêm bước nào. - 05UI gọn cho người không kỹ thuậtPermission gate · status card · 1 URL field
Giao diện giữ ở mức tối giản với Material 3: banner màu cam xuất hiện ngay khi chưa cấp Notification Access, kèm nút mở thẳng vào Settings để cấp quyền mà không cần mò tay. Card trạng thái chuyển xanh khi service đang chạy, đỏ khi dừng — đủ để chủ shop liếc qua là biết máy có đang hoạt động không. Một ô nhập URL server và hai nút Khởi động / Dừng là toàn bộ thao tác cần thiết. Không cần hướng dẫn sử dụng: xanh là ổn, đỏ là mở app lên xem.
03.Tech stack
Công nghệ sử dụng| App | Flutter 3 · Dart · Material 3 · shared_preferences (config UI) |
| Native Android | Kotlin · NotificationListenerService · Foreground Service (START_STICKY) · BroadcastReceiver (BOOT_COMPLETED) · MethodChannel cho Flutter ↔ Native |
| Permissions | BIND_NOTIFICATION_LISTENER_SERVICE (system, người dùng cấp tay) · RECEIVE_BOOT_COMPLETED · FOREGROUND_SERVICE · INTERNET |
| Network | java.net.HttpURLConnection trên Kotlin Coroutine (Dispatchers.IO) · timeout 5s · log HTTP code · Dio dự phòng nếu cần ở Dart side |
| State | FlutterSharedPreferences (file XML shared giữa Dart và Kotlin) · prefix flutter.* · không có DB cục bộ |
| Target | Android 7+ · Redmi Note 8 / điện thoại cũ cắm sạc 24/7 · 1 thiết bị / 1 tài khoản ngân hàng |
04.How it works
Kiến trúc tổng thểToàn bộ luồng xoay quanh một event duy nhất: onNotificationPosted(sbn) của NotificationListenerService. Khi app ngân hàng đẩy thông báo "+50.000 VND · Số dư: 1.234.567 · ND: ORDER12345…", Android chuyển StatusBarNotification cho service trong <100ms. Service đọc flutter.is_service_running và flutter.server_url trực tiếp từ FlutterSharedPreferences — không cần wake Flutter engine — lọc qua package allow-list, đóng gói JSON và POST lên backend trong một coroutine IO.
Backend nhận payload, ví dụ: { "package": "com.VCB", "title": "Biến động số dư", "text": "+50,000 VND ... ND: ORDER12345", "timestamp": 1712649600000 }. Một regex tìm số tiền ([+\-]?[\d.,]+\s*VND) và mã đơn (ORDER\d+), match với bảng orders có status='pending' và đúng số tiền → đánh dấu paid, ghi bank_txn_id, gọi webhook merchant. Toàn bộ end-to-end từ lúc thông báo ngân hàng xuất hiện đến khi merchant nhận callback: ~1-3s.
"BankNotify không phải dự án độc lập — nó là mảnh ghép thanh toán cho các hệ thống e-commerce và automation cần xác nhận chuyển khoản tự động. Thay vì tích hợp cổng thanh toán tốn phí hoặc chờ Open Banking API, toàn bộ luồng thu tiền khép kín chỉ cần một chiếc điện thoại Android cũ cắm sạc chạy app này. NotificationListenerService là cửa sau chính thức của Android — không root, không OCR màn hình, không cần xin SDK từ ngân hàng. Hợp pháp trên thiết bị của chính chủ, đủ tin cậy cho ~250 đơn mỗi ngày, và đủ nhẹ để chạy mãi trên phần cứng rẻ tiền nhất."
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.

Hotel Management là phần mềm quản trị khách sạn nội bộ, xây cho đội ngũ lễ tân và quản lý vận hành hàng ngày. Toàn bộ luồng cốt lõi được xử lý trong một hệ thống: nhận đặt phòng walk-in tại quầy hoặc từ kênh online, check-in và check-out, ghi nhận dịch vụ phát sinh trong quá trình lưu trú, và xuất hoá đơn tự động khi khách trả phòng. Phân quyền chi tiết đến từng thao tác — nhân viên lễ tân, thu ngân và quản lý có màn hình và quyền hạn khác nhau. Mọi thay đổi trên hệ thống đều được ghi vào audit log đầy đủ, đủ để truy vết khi cần.
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.
AutoHub là trang quản lý dành cho những ai đang chạy MMO nghiêm túc — nuôi acc số lượng lớn, điểm danh hàng ngày, đặt vé giờ cao điểm, farm theo lịch, và mọi tác vụ lặp lại cần chạy đều đặn mà không muốn ngồi canh tay. Mỗi khách có dashboard riêng để theo dõi toàn bộ job, tự cấu hình giờ chạy cho từng tác vụ hoặc dùng lịch mặc định. Hệ thống tự gắn proxy sạch từ pool đảm bảo cho các job yêu cầu, chạy nền liên tục 24/7 và đẩy kết quả thẳng về Telegram của từng khách. Cần hỗ trợ thì có AI tự động xử lý FAQ hoặc chat thẳng với admin. Dữ liệu phân quyền chặt chẽ — tài khoản, lịch sử chạy, log của bạn là của bạn, không ai khác thấy được.
05.Bình luận
Ý kiến của bạnChưa có bình luận nào.