Theo dõi giao dịch Timo "Hũ" (piggy bank) và gửi thông báo đến nhóm chat hoặc tài khoản Telegram khi có giao dịch mới.
Công cụ này hoàn toàn vibe code cùng MiniMax-M2.1.
Mình không đảm bảo nó hoạt động một cách hiệu quả với tất cả mọi người nhưng đến hiện tại nó hoạt động tốt và phục vụ được nhu cầu của mình :)
- Tự động giám sát bằng cron jobs
- Theo dõi 3 ngày gần nhất: "Hôm nay", "Hôm qua", "Ngày hôm trước"
- Thông báo Telegram cho giao dịch mới
- Khử trùng lặp bằng Cloudflare KV storage
- API để trigger thủ công và quản lý trạng thái
- Chế độ development với local testing
- Node.js 18+
- Tài khoản Cloudflare (miễn phí) với Workers & KV
- Telegram bot (tùy chọn, để nhận thông báo)
git clone <your-repo-url>
cd timocheck
npm installNếu muốn nhận thông báo qua Telegram:
- Mở Telegram, tìm @BotFather
- Gửi lệnh
/newbotvà làm theo hướng dẫn - Copy Bot Token (dạng:
123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11) - Tìm @userinfobot, gửi bất kỳ tin nhắn nào
- Copy Chat ID của bạn (số dạng:
782967716)
Đây là mã xác thực để truy cập API Timo "Hũ" của bạn:
- Mở Timo app hoặc truy cập share.timo.vn
- Đăng nhập và vào trang "Hũ" của bạn
- Mở DevTools (F12) → Tab Network
- Reload trang hoặc click vào một giao dịch
- Tìm request đến
moneypots/public/txn - Xem Request Payload → Copy giá trị
hashVerifyCode
{
"hashVerifyCode": "95cd0b67e089a6a339c33eb372396ad...",
"offset": 0
}Lưu ý:
HASH_VERIFY_CODEcó thể thay đổi theo thời gian. Nếu worker báo lỗi 401, bạn cần lấy lại mã mới.
Tạo file .dev.vars ở thư mục gốc:
# Mã xác thực Timo (bắt buộc)
HASH_VERIFY_CODE="95cd0b67e089a6a339c33eb372396ad..."
# Telegram credentials (tùy chọn)
TELEGRAM_BOT_TOKEN="123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11"
TELEGRAM_CHAT_ID="782967716"Quan trọng: File
.dev.varsđã được thêm vào.gitignore, không bao giờ commit lên Git!
KV namespace dùng để lưu trạng thái giao dịch đã thấy:
# Tạo KV namespace cho production
npx wrangler kv:namespace create "KV_STATE"
# Tạo KV namespace cho preview (dev)
npx wrangler kv:namespace create "KV_STATE" --previewOutput sẽ như:
[[kv_namespaces]]
binding = "KV_STATE"
id = "91fd696e80ff41f2b98961129ba6be23"
preview_id = "abc123def456..."
Cập nhật id và preview_id vào file wrangler.toml.
Tất cả thông tin nhạy cảm phải dùng secrets, KHÔNG để trong wrangler.toml:
# Set secrets cho production
npx wrangler secret put HASH_VERIFY_CODE
npx wrangler secret put TELEGRAM_BOT_TOKEN
npx wrangler secret put TELEGRAM_CHAT_IDMỗi lệnh sẽ hỏi bạn nhập giá trị. Copy-paste từ .dev.vars.
File wrangler.toml chỉ chứa config công khai:
name = "timocheck"
main = "src/worker.ts"
compatibility_date = "2026-01-29"
[triggers]
crons = ["*/1 * * * *"] # Kiểm tra mỗi phút
[[kv_namespaces]]
binding = "KV_STATE"
id = "91fd696e80ff41f2b98961129ba6be23" # Production KV ID
preview_id = "abc123def456..." # Development/Preview KV ID
[vars]
# Secrets được cấu hình qua wrangler secret put
# KHÔNG để thông tin nhạy cảm ở đây!Giải thích:
id: KV namespace cho production (deploy thật)preview_id: KV namespace cho dev/preview (local testing)
npx wrangler devWorker sẽ chạy tại http://localhost:8787
# Health check
curl http://localhost:8787/
# Trigger kiểm tra giao dịch thủ công
curl -X POST http://localhost:8787/check
# Xem danh sách giao dịch đã thấy
curl http://localhost:8787/state
# Reset trạng thái (xóa tất cả giao dịch đã lưu)
curl -X POST http://localhost:8787/resetnpx wrangler deployWorker sẽ deploy và chạy với cron schedule đã cấu hình.
npx wrangler deploynpx wrangler secret put HASH_VERIFY_CODEnpx wrangler triggers deployChỉnh sửa trong wrangler.toml:
| Biểu thức | Ý nghĩa |
|---|---|
*/1 * * * * |
Mỗi phút |
*/5 * * * * |
Mỗi 5 phút |
*/15 * * * * |
Mỗi 15 phút |
0 * * * * |
Mỗi giờ |
| Method | Path | Mô tả |
|---|---|---|
| GET | / |
Health check |
| POST | /check |
Trigger kiểm tra giao dịch thủ công |
| GET | /state |
Xem giao dịch đã thấy |
| POST | /reset |
Reset trạng thái (xóa tất cả) |
TimoCheck bao gồm giao diện web admin để quản lý cấu hình và giám sát hệ thống một cách dễ dàng.
Development (Local):
npx wrangler devSau đó mở: http://localhost:8787/admin
Production:
Truy cập: https://your-worker.workers.dev/admin
1. Cấu hình mật khẩu admin:
npx wrangler secret put ADMIN_PASSWORD
npx wrangler secret put SESSION_SECRET2. Cấu hình Cloudflare API (để cập nhật config trong dashboard):
Tạo API token tại: https://dash.cloudflare.com/profile/api-tokens
Quyền cần thiết:
- Account > Workers Scripts > Edit
npx wrangler secret put CLOUDFLARE_API_TOKEN
npx wrangler secret put CLOUDFLARE_ACCOUNT_ID
npx wrangler secret put CLOUDFLARE_WORKER_NAME3. Thêm vào .dev.vars để test local:
ADMIN_PASSWORD="your-password"
SESSION_SECRET="random-secret-key-32-chars"
CLOUDFLARE_API_TOKEN="your-token"
CLOUDFLARE_ACCOUNT_ID="your-account-id"
CLOUDFLARE_WORKER_NAME="timocheck"- Giám sát real-time: Xem thống kê giao dịch và tình trạng hệ thống
- Quản lý cấu hình: Cập nhật secrets trực tiếp từ UI
- Quick actions: Trigger kiểm tra thủ công, test Telegram, reset state
- Lịch sử giao dịch: Xem các giao dịch gần đây với timestamps
- Biểu đồ hoạt động: Biểu đồ khối lượng giao dịch 24 giờ
- Xác thực dựa trên session với HMAC-SHA256
- HttpOnly, Secure cookies với SameSite protection
- Rate limiting: 5 lần thử đăng nhập / 15 phút
- Session hết hạn sau 24 giờ
Worker theo dõi giao dịch từ 3 ngày gần nhất:
- Hôm nay - Giao dịch hôm nay
- Hôm qua - Giao dịch hôm qua
- Ngày hôm trước - Giao dịch ngày kia
Mỗi giao dịch được xác định bằng: mô tả + số tiền
Hệ thống khử trùng lặp đảm bảo mỗi giao dịch chỉ được thông báo một lần.
[Timo] Available groups:
- Hôm nay: 3 transactions [MONITORED]
- Hôm qua: 5 transactions [MONITORED]
- Ngày hôm trước: 2 transactions [MONITORED]
[Check] Total: 10, New: 0
[Telegram] Sent 0 notification(s)
📥 Tên Hũ - Giao dịch mới
💰 Số tiền: +16.000 VND
📋 Tiêu đề: Từ NGUYEN NGOC DINH
📝 Mô tả: Nguyen Ngoc Dinh chuyen tien QR
Nguyên nhân: HASH_VERIFY_CODE đã hết hạn hoặc sai.
Giải pháp:
- Lấy lại
HASH_VERIFY_CODEmới (xem mục 2.2) - Update secret:
npx wrangler secret put HASH_VERIFY_CODE
Kiểm tra:
- Bot token và Chat ID đã đúng chưa?
- Đã
/startvới bot chưa? (Bắt buộc trước khi bot có thể gửi tin) - Xem logs:
npx wrangler tail
Nguyên nhân: Chưa tạo KV namespace hoặc ID sai.
Giải pháp:
- Tạo namespace (xem mục 4.1)
- Cập nhật đúng ID vào
wrangler.toml
Nguyên nhân: KV state bị reset hoặc mất dữ liệu.
Giải pháp: Dùng endpoint /reset để xóa và bắt đầu lại:
curl -X POST https://your-worker.workers.dev/resettimocheck/
├── src/
│ ├── config.ts # Config và types
│ ├── fetch-today.ts # CLI tool để test fetch
│ ├── index.ts # CLI entry point
│ ├── monitor.ts # Logic giám sát chính
│ ├── notifier.ts # Telegram notifications
│ ├── timo.ts # Timo API client
│ ├── types.ts # TypeScript types
│ └── worker.ts # Cloudflare Worker entry
├── wrangler.toml # Cloudflare Workers config
├── .dev.vars # Dev environment (KHÔNG commit!)
├── .gitignore # Git ignore rules
├── tsconfig.json # TypeScript config
└── package.json # Dependencies
- ✅
.dev.varsđược git ignore - ✅ Production dùng Wrangler secrets
- ✅ Không có credentials trong source code
- ✅ KV namespace ID là public (an toàn)
Lưu ý: KHÔNG bao giờ commit file .dev.vars hoặc file chứa secrets!
MIT