Thiết kế và Triển khai Công cụ Giám sát Hàng Hóa trên Xianyu: Nguyên lý Kỹ thuật và Thực hành Kỹ sư

1. Bối cảnh Dự án

Sự gia tăng mạnh mẽ về lưu lượng người dùng trên các nền tảng thương mại điện tử thứ cấp như Xianyu (Alibaba Idle) đã làm nổi bật nhu cầu về giải pháp giám sát tự động. Các mặt hàng phổ biến thường hết hàng trong vài giây, khiến việc theo dõi thủ công bằng cách làm mới trang trở nên không khả thi. Do đó, xây dựng một hệ thống **giám sát thời gian thực kết hợp phản hồi tức thì** là một bài toán kỹ thuật thực tiễn, vừa có giá trị học thuật vừa mang tính ứng dụng cao. Bài viết này trình bày cách triển khai một công cụ giám sát hàng hóa Xianyu tối giản bằng **Python**, tập trung vào phân tích API, cơ chế phát hiện thay đổi, mô phỏng hành vi người dùng và xử lý luồng dữ liệu phi đồng bộ.

2. Mục tiêu Kỹ thuật

Công cụ hướng đến các yêu cầu sau:
  • Theo dõi liên tục các sản phẩm mới xuất hiện với từ khóa đã định;
  • Lọc kết quả dựa trên tiêu chí đa chiều (ví dụ: khoảng giá, độ dài tiêu đề, sự xuất hiện của nhãn đặc biệt);
  • Mở trang chi tiết sản phẩm trong trình duyệt hoặc kích hoạt sự kiện tương tác cơ bản;
  • Cấu trúc module rõ ràng để dễ dàng tích hợp chức năng mở rộng như thông báo qua Webhook hoặc lưu lịch sử vào cơ sở dữ liệu.

3. Phân tích Cơ chế Lấy Dữ liệu từ Xianyu

Giao diện di động của Xianyu chủ yếu tải dữ liệu thông qua các endpoint H5. Việc bắt gói mạng (sử dụng mitmproxy hoặc Fiddler) cho thấy các request danh sách sản phẩm thường có dạng:
GET https://h5api.m.taobao.com/h5/mtop.taobao.idle.search/...?q=switch&sort=created_desc
Phản hồi là JSON chứa itemId, price, detailUrl, nick và listTime. Cần lưu ý:
  • Header phải bao gồm cookie hợp lệ và user-agent giả lập thiết bị di động;
  • Một số endpoint yêu cầu ký tên request bằng m_h5_tk, được sinh từ cookie + timestamp + appKey;
  • Tham số data thường ở dạng JSON chuỗi hóa và base64-encoded.

4. Triển khai bằng Python

a. Gửi yêu cầu tìm kiếm bất đồng bộ

Dùng aiohttp thay vì requests để hỗ trợ hàng chục phiên đồng thời:
import aiohttp
import asyncio

async def fetch_page(session: aiohttp.ClientSession, keyword: str, page: int):
    url = "https://h5api.m.taobao.com/h5/mtop.taobao.idle.search/1.0/"
    params = {
        "jsv": "2.6.1",
        "appKey": "12574478",
        "t": str(int(time.time() * 1000)),
        "sign": generate_sign(keyword, page),  # hàm ký riêng
        "api": "mtop.taobao.idle.search",
        "v": "1.0",
        "type": "json",
        "dataType": "json",
        "data": json.dumps({"q": keyword, "page": page, "sort": "created_desc"}, separators=(',', ':'))
    }
    async with session.get(url, params=params, timeout=15) as resp:
        return await resp.json()

b. Phát hiện sản phẩm mới

So sánh itemId hoặc listTime với bộ cache trước đó (dùng sqlite3 hoặc diskcache). Chỉ xử lý các mục có listTime > last_check_time.

c. Bộ lọc linh hoạt theo biểu thức

Thay vì hardcode điều kiện, dùng eval() an toàn với môi trường hạn chế:
def apply_filter(item: dict, rule: str) -> bool:
    safe_dict = {"price": item.get("price", 0), "title": item.get("title", ""), "nick": item.get("nick", "")}
    try:
        return eval(rule, {"__builtins__": {}}, safe_dict)
    except:
        return False

# Ví dụ rule: "price < 299 and 'switch' in title.lower() and len(nick) > 2"

d. Tương tác trình duyệt không can thiệp sâu

Không tự động đặt hàng — chỉ mở trang chi tiết bằng webbrowser hoặc selenium với profile ổn định:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

opts = Options()
opts.add_argument("--headless=new")
opts.add_argument("--no-sandbox")
driver = webdriver.Chrome(options=opts)
driver.get(item["detailUrl"])
# Có thể thêm WebDriverWait để đợi phần tử "Tôi muốn" xuất hiện

5. Triển khai Sản xuất

  • Chạy trên máy chủ Linux (VPS) với systemd timer hoặc cron mỗi 15–30 giây;
  • Ghi log mức INFO và WARNING ra file bằng logging.handlers.RotatingFileHandler;
  • Tích hợp Webhook gửi thông báo đến Telegram/DingTalk khi phát hiện mục tiêu;
  • Sử dụng APScheduler nếu cần lập lịch động theo giờ cao điểm.

6. Hướng Phát triển Mở rộng

  • Kết hợp OpenCV để so sánh ảnh sản phẩm với mẫu tham chiếu;
  • Hỗ trợ quản lý nhiều tài khoản qua pool cookie và proxy quay vòng;
  • Tích hợp Playwright để mô phỏng tương tác nâng cao (scroll, click nút "Tôi muốn", nhập tin nhắn);
  • Xuất báo cáo hàng ngày dưới dạng CSV/HTML từ bảng SQLite chứa lịch sử giám sát.

Thẻ: python aiohttp selenium mitmproxy Webhook

Đăng vào ngày 12 tháng 10 lúc 22:09