用 AI 写 Python 二手 MacBook 价格提醒:合规数据与人工复核
很多旧教程会让脚本直接抓取二手平台的登录态页面,再承诺“不会封号”“稳定捡漏”。这两类承诺都不可靠:页面结构会变化,平台也可能限制自动访问;二手商品的成色、维修史和实际成交价更不能只靠标题判断。
> 本文只处理你合法取得的 CSV 或表格数据,不抓取登录态页面,不绕过验证码、频率限制或反自动化措施,也不承诺转卖收益。若平台提供官方导出、开放接口或通知功能,应优先使用平台提供的能力并遵守其规则。
先把目标写成可验收规则
一个能交付的价格提醒工具至少要明确以下内容:
M1、16GB;如果你准备把需求交给开发者,可以先用外包需求整理清单包 ¥29写清数据来源、筛选规则、通知方式和验收样例,避免把“帮我做个监控”变成无法报价的口头需求。
准备一份可复核的 CSV
把你手动收藏、获得授权导出或从其他合法来源取得的数据整理为 listings.csv:
title,price,url,note,updated_at
MacBook Air M1 8GB 256GB,4299,https://example.com/item/1,支持当面验机,2026-09-09 19:30
MacBook Pro M1 维修机,3200,https://example.com/item/2,主板维修,2026-09-09 19:35
MacBook Air M2 16GB 512GB,6399,https://example.com/item/3,有购买凭证,2026-09-09 19:40
真实商品链接只保存在本地文件中。不要把手机号、聊天记录、收货地址或账号凭据写进 CSV。
用 Python 做筛选和提醒
下面的脚本需要 Python 3.10 或更高版本,只读取本地 CSV。它不会访问二手平台,也不会自动下单。
import csv
import json
import os
import re
from pathlib import Path
from urllib import request
DATA_FILE = Path("listings.csv")
MAX_PRICE = 5000
REQUIRED_KEYWORDS = ("m1",)
EXCLUDED_KEYWORDS = ("维修", "配件", "空机", "仅屏幕")
def parse_price(value: str) -> float | None:
match = re.search(r"\d+(?:\.\d+)?", value.replace(",", ""))
return float(match.group()) if match else None
def load_matches() -> list[dict[str, str]]:
matches: list[dict[str, str]] = []
with DATA_FILE.open("r", encoding="utf-8-sig", newline="") as file:
for row in csv.DictReader(file):
title = (row.get("title") or "").strip()
normalized = title.lower()
price = parse_price(row.get("price") or "")
if price is None or price > MAX_PRICE:
continue
if not all(keyword in normalized for keyword in REQUIRED_KEYWORDS):
continue
if any(keyword in normalized for keyword in EXCLUDED_KEYWORDS):
continue
matches.append({**row, "price": f"{price:.2f}"})
return matches
def notify(matches: list[dict[str, str]]) -> None:
if not matches:
print("本次没有符合条件的条目。")
return
lines = ["二手 MacBook 待人工复核:"]
for item in matches:
lines.append(f"- {item['title']} | ¥{item['price']} | {item.get('url', '')}")
message = "\n".join(lines)
print(message)
webhook_url = os.getenv("WEBHOOK_URL", "").strip()
if not webhook_url:
return
body = json.dumps({"text": message}, ensure_ascii=False).encode("utf-8")
req = request.Request(
webhook_url,
data=body,
headers={"Content-Type": "application/json"},
method="POST",
)
with request.urlopen(req, timeout=8) as response:
if response.status >= 300:
raise RuntimeError(f"Webhook 返回 HTTP {response.status}")
if __name__ == "__main__":
if not DATA_FILE.exists():
raise SystemExit("缺少 listings.csv")
notify(load_matches())
执行:
python xianyu_alert.py
不配置 WEBHOOK_URL 时,结果只打印在终端。不同通知服务的请求格式并不相同;启用 webhook 前,应按照你所使用服务的官方文档调整请求体,并把密钥放在环境变量中,不要写进代码或提交到 Git。
怎么验证脚本不是“看起来能跑”
准备四条固定测试数据:
M1,应命中;每次改筛选规则后都重复这四项。只有当数据来源本身允许自动更新时,才考虑使用系统定时任务;否则定时运行只会反复读取同一份旧 CSV。
命中后仍要人工验机
价格提醒只负责缩小候选范围,不负责判断交易是否值得。进一步核对至少包括:
任何“必赚差价”“零风险”“不验机也能买”的说法都不应写进需求或验收标准。
交给 AI 或开发者时这样描述
请实现一个只读取本地 listings.csv 的 Python 筛选工具。
不得访问闲鱼或其他二手平台页面,不得绕过登录、验证码或访问限制。
输入字段为 title、price、url、note、updated_at。
筛选规则为:标题包含 M1、价格不高于 5000 元,并排除维修、配件、空机。
输出终端摘要;webhook 为可选能力,密钥只能从环境变量读取。
请附 4 个固定测试样例和运行说明。
这个版本的验收边界很清楚:数据输入、筛选结果、通知结果都能复查,也不会把平台访问风险和二手交易判断藏在一句“AI 自动监控”里。
