Tự động hóa việc ‘soi’ website với changedetection.io và Docker

Monitoring tutorial - IT technology blog
Monitoring tutorial - IT technology blog

Đừng làm nô lệ cho nút F5 nữa

Hệ thống monitoring của mình hiện quản lý 15 server qua Prometheus và Grafana. Tuy nhiên, có những thứ mà các công cụ hạ tầng này không thể chạm tới: nội dung bên trong một trang web của bên thứ ba.

Bạn đã bao giờ dành cả tuần chỉ để canh một món đồ sale-off hoặc chờ thông báo tuyển dụng từ công ty mơ ước chưa? Thay vì tốn 30 phút mỗi sáng lướt qua 10 tab trình duyệt, mình chọn cách để bot làm việc đó. Trước đây, mình từng bỏ lỡ bản cập nhật bảo mật quan trọng của một thư viện mã nguồn mở chỉ vì họ không có mailing list. Đó là lúc mình nhận ra việc soi thủ công vừa tốn sức, vừa dễ sai sót.

Tại sao Zabbix hay Uptime Kuma lại “bó tay”?

Các công cụ giám sát hệ thống thường chỉ quan tâm đến chỉ số kỹ thuật như CPU hay RAM. Khi cần theo dõi nội dung hiển thị, chúng ta sẽ vấp phải 3 rào cản lớn:

  • Nội dung động: Các trang web dùng React hay Vue sẽ trả về code JavaScript trống rỗng nếu bạn chỉ dùng curl đơn thuần.
  • Cơ chế chống Bot: Nếu request liên tục với cùng một pattern, IP của bạn sẽ bị Cloudflare “trảm” trong vòng nốt nhạc.
  • Giao diện thay đổi: Một script Python tự viết có thể lăn đùng ra chết chỉ vì admin web đổi tên một cái class CSS.

Giải pháp nào tối ưu nhất hiện nay?

Thông thường, anh em sẽ có 3 lựa chọn chính để giải quyết bài toán này:

  1. Viết script Python (BeautifulSoup/Selenium): Linh hoạt nhưng cực kỳ tốn công bảo trì code và quản lý cronjob.
  2. Dùng dịch vụ SaaS (VisualPing, Distill.io): Nhanh và đẹp. Tuy nhiên, chi phí rất đắt nếu bạn muốn check 50 trang với tần suất 5 phút/lần.
  3. Self-hosted: Đây là lựa chọn số một của mình. Bạn nắm toàn quyền dữ liệu, không giới hạn số lượng trang và hoàn toàn miễn phí.

Sau khi thử nghiệm nhiều công cụ, mình chốt changedetection.io. Nó hỗ trợ Playwright để xử lý JS nặng và tích hợp sẵn hàng chục kênh cảnh báo qua Apprise.

Triển khai với Docker Compose trong 5 phút

Sử dụng Docker giúp tách biệt môi trường và nâng cấp cực kỳ nhanh chóng. Mình sẽ dùng thêm container playwright-chrome để xử lý các trang web hiện đại.

1. Thiết lập file docker-compose.yml

Tạo một thư mục mới và dán nội dung sau vào file cấu hình. Lưu ý phần shm_size để tránh Chrome bị crash khi render trang nặng.

version: '3.2'
services:
  changedetection:
    image: dgtlmoon/changedetection.io
    container_name: changedetection
    volumes:
      - ./data:/datastore
    ports:
      - 5000:5000
    environment:
      - BASE_URL=http://localhost:5000
      - PLAYWRIGHT_DRIVER_URL=ws://playwright-chrome:3000/?stealth=1
    restart: unless-stopped

  playwright-chrome:
    image: browserless/chrome:latest
    restart: unless-stopped
    shm_size: '2gb'
    environment:
      - MAX_CONCURRENT_SESSIONS=10

Mẹo nhỏ: Tham số ?stealth=1 ở trên cực kỳ đáng giá. Nó giúp trình duyệt giả lập hành vi người dùng thật để vượt qua các bộ lọc bot cơ bản.

2. Khởi chạy hệ thống

Gõ lệnh duy nhất để kích hoạt:

docker-compose up -d

Bây giờ, hãy mở trình duyệt và truy cập http://IP-Server:5000.

Tối ưu hóa giám sát và cảnh báo

Đừng theo dõi toàn bộ trang web vì bạn sẽ nhận rác thông báo. Hãy dùng CSS Selector để khoanh vùng dữ liệu quan trọng.

Ví dụ: Để theo dõi giá một chiếc laptop trên web TMĐT, hãy nhấn F12, tìm đến thẻ chứa giá tiền. Copy selector đó (ví dụ: .product-price-current) và dán vào mục Filters > CSS Filter Selector trong tool.

Nhận tin nhắn qua Telegram

Vào Settings > Notifications, điền URL theo cấu pháp Apprise. Với Telegram, định dạng sẽ là:

tgram://bot_token/chat_id/

Sử dụng biến {{diff}} trong nội dung tin nhắn để biết chính xác giá vừa giảm bao nhiêu hoặc nội dung nào mới được thêm vào.

Kinh nghiệm thực tế: Tránh báo động giả

Mình từng bị Telegram spam liên tục vì một website có widget hiển thị “Số người đang online”. Mỗi lần quét là một lần số này nhảy, khiến tool tưởng có thay đổi nội dung.

Giải pháp là dùng tính năng Ignore Text. Bạn hãy nhập các cụm từ biến động thường xuyên vào đây, ví dụ: /\d+ lượt xem/ hoặc /Cập nhật lúc:.*/. Ngoài ra, với các site gắt gao, hãy để Time Between Checks khoảng 1 giờ để tránh bị khóa IP.

Lời kết

Tự động hóa việc theo dõi website giúp mình rảnh tay để làm những việc quan trọng hơn. Từ săn deal đồ công nghệ đến theo dõi CVE mới, mọi thứ đều chạy 24/7 trên một con VPS cấu hình thấp. Nếu bạn gặp khó khăn khi viết CSS Selector, hãy để lại bình luận phía dưới nhé!

Share: