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.