ai-goofish-monitor 是 GitHub 上的开源项目,名字里的 goofish 即闲鱼的英文域名。它用 Playwright 驱动浏览器按关键词搜索闲鱼商品,再把商品标题、详情、卖家信息和图片交给支持图片输入的多模态大模型判断是否符合要求,符合条件的商品通过企业微信、Telegram、Bark 等渠道实时推送。项目采用 MIT 许可证,提供完整的 Web 管理后台,官方推荐用 Docker 部署。对于长期在二手平台找特定型号数码产品的用户,它把”反复手动刷新”变成了”设定条件后等通知”。
项目定位与工作原理
传统的二手监控脚本只能按关键词和价格过滤,搜”iPhone”时常把手机壳、贴膜、空包装盒一起推过来。ai-goofish-monitor 的区别在于判断环节交给了视觉大模型:用户用自然语言写下需求,例如”九成新、无磕碰、电池健康 90% 以上”,系统先把这段描述转换成一份分析标准,之后每抓到一件新商品,模型都会结合图片和文字逐条对照,给出推荐或不推荐的结论,并附上理由。
单个监控任务的处理链路如下:启动任务后先选定账号和代理,搜索商品;遇到新商品就抓取详情与卖家信息、下载商品图片、调用模型分析;模型推荐的发送通知,所有结果写入 SQLite;没有新商品时翻页或等待;一旦触发平台风控,系统会轮换账号和代理后重试。

从官方 README 给出的通知示例看,模型给出的并非简单的”是/否”。一条 Apple Watch S10 的推荐理由写的是”卖家画像为专业二手数码商贩,但信用极好且价格低于市场价,需在购买前向其确认电池健康度和维修历史”,相当于替用户完成了一轮初筛,并列出了需要追问卖家的问题。
核心功能
- 多任务并发:每个任务独立设置关键词、价格区间、筛选条件和 AI 提示词(Prompt),可以同时盯多个型号。
- 两种判断模式:「AI 判断」填写详细需求后,后台异步生成分析标准,前端弹出独立进度窗口;「关键词判断」按规则直接创建任务,不经过模型,也就不消耗 API 额度。
- 高级筛选:支持包邮、新发布时间范围,以及省 / 市 / 区三级区域选择器(数据来自闲鱼页面抓取的内置快照),适合只考虑同城面交的场景。
- 通知渠道:ntfy.sh、Gotify、Bark、企业微信机器人、Telegram 和通用 Webhook。
- 定时调度:任务可配置 Cron 表达式周期运行,也可以手动触发。
- 账号与代理轮换:多账号管理、任务绑定指定账号、代理池轮换、失败重试,连续失败达到阈值后任务会自动暂停一段时间。
- 数据留存:任务、结果和价格历史统一存入 SQLite,后台可以按任务查看结果、价格走势和运行日志,并支持导出。

ahhhhfs 的介绍文章提到项目内置了请求间隔和标准 User-Agent 设置;官方 README 对应的描述是代理轮换与失败保护机制,两者并不矛盾,但请求频率最终仍取决于用户自己的任务配置。
Docker 部署步骤
官方首推 Docker 方式,镜像已内置 Chromium,宿主机不需要另装浏览器。Linux 和 macOS 可以直接执行,Windows 建议在 WSL 中操作。
git clone https://github.com/Usagi-org/ai-goofish-monitor && cd ai-goofish-monitor
cp .env.example .env
vim .env # 填写相关配置项
docker compose up -d
docker compose logs -f app
docker compose down
最后两行分别是查看运行日志和停止服务,按需执行。国内服务器拉取 ghcr.io 镜像经常很慢,README 给出了南京大学镜像站的加速方案,先拉取再改标签:
docker pull ghcr.nju.edu.cn/usagi-org/ai-goofish:latest
docker tag ghcr.nju.edu.cn/usagi-org/ai-goofish:latest ghcr.io/usagi-org/ai-goofish:latest
docker compose up -d
之后更新版本用 docker compose pull && docker compose up -d。.env 里必须填写的只有三项,Web 后台账号密码可选:
| 变量 | 说明 | 是否必填 |
|---|---|---|
OPENAI_API_KEY |
AI 模型的 API Key | 是 |
OPENAI_BASE_URL |
OpenAI 兼容接口地址 | 是 |
OPENAI_MODEL_NAME |
支持图片输入的模型名称 | 是 |
WEB_USERNAME / WEB_PASSWORD |
Web 后台登录账号密码,默认 admin/admin123 |
否 |
如果改了 .env 中的 SERVER_PORT,需要同步修改 docker-compose.yaml 里的端口映射。默认挂载的持久化目录包括 data/(SQLite 主库,文件为 data/app.sqlite3)、state/(登录状态 cookie)、prompts/(任务提示词)、logs/(运行日志)和 images/(商品图片临时目录,任务结束后默认清理)。从旧版本升级的用户,首次启动时系统会尝试从 config.json、jsonl/、price_history/ 自动导入一次历史数据。
首次使用流程
服务启动后,浏览器访问 http://127.0.0.1:8000 登录后台。默认密码 admin/admin123 在公网服务器上必须立即修改,最好同时不要把 8000 端口直接暴露到公网。
第二步是导入闲鱼登录态。进入「闲鱼账号管理」,用作者提供的 Chrome 扩展导出登录态 JSON 并粘贴,文件会保存为 state/acc_1.json 这样的形式。这一步决定了程序以哪个账号的身份浏览闲鱼,建议使用小号。
回到「任务管理」创建任务并绑定账号即可运行。区域筛选会显著缩小结果集,README 建议先留空,确认整体行情后再收窄范围。

本地开发与手动运行
不用 Docker 的话,需要 Python 3.10+、Node.js 与 npm(作者验证 Node v20.18.3 可完成前端构建)、Playwright 与 Chromium,以及系统中可用的 Chrome、Edge 或 Chromium。Playwright 可以这样装:
python3 -m pip install playwright && python3 -m playwright install chromium
项目自带的 start.sh 会先检查上述前置条件,然后自动安装依赖、构建前端并启动后端:
chmod +x start.sh
./start.sh
也可以前后端分开手动启动,适合要改代码的场景:
# 后端
python -m src.app
# 或
uvicorn src.app:app --host 0.0.0.0 --port 8000 --reload
# 前端
cd web-ui
npm install
npm run dev
启动后 http://localhost:8000/docs 是 FastAPI 自动生成的接口文档。若页面提示前端构建产物不存在,说明根目录缺少 dist/,执行 ./start.sh,或在 web-ui/ 中运行 npm run build 后确认产物已复制到根目录即可。测试命令为 PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 pytest。
模型选择与国内使用条件
项目只要求接口兼容 OpenAI 格式、模型支持图片输入,并不绑定 OpenAI。ahhhhfs 原文以 GPT-4V 举例,国内用户更实际的选择是阿里云百炼、火山方舟等平台提供的 OpenAI 兼容接口,接入它们的视觉模型,把 OPENAI_BASE_URL 和 OPENAI_MODEL_NAME 改成对应值即可,网络和支付都更顺畅。如果 AI 请求需要单独走代理,可以设置 PROXY_URL。
成本方面,每件新商品都要带图调用一次模型,监控的关键词越宽泛,调用量越大。更稳妥的做法是先用关键词判断模式把价格区间和型号卡准,只对少量高价值任务开启 AI 判断。
另一个现实约束是平台风控。程序使用真实账号的登录态抓取页面,请求过密可能导致账号被限制,项目的账号轮换和失败暂停机制只能降低而不能消除这一风险。README 明确要求遵守闲鱼用户协议和 robots.txt,项目仅供学习研究。这类工具更适合个人低频找货,不适合拿来做批量采集或商业倒卖。

适用人群与同类方案
这个项目最适合两类人:一是有 NAS 或闲置云服务器、会用 Docker 的数码玩家,想长期蹲一两款特定型号;二是想学习 Playwright 自动化与多模态模型结合方式的开发者,项目的任务队列、SQLite 迁移和前后端分离结构都有参考价值。只是偶尔买一次二手的用户,闲鱼 App 自带的搜索订阅已经够用,没必要为此维护一套服务。
站内同样走”定时抓取 + 推送”思路的开源项目,还有面向股票的 daily_stock_analysis 每日决策日报,以及做热点抓取和多平台发布的 AIMedia 全自动媒体运营工具。需要把通知接入飞书、钉钉等国内 IM 时,可以参考 OpenClaw 国内 IM 版 Docker 镜像的部署方式。
官网 / 下载
GitHub 仓库:Usagi-org/ai-goofish-monitor(MIT 许可证,含中英文文档与免责声明)
服务器部署可搭配站内工具页:宝塔面板,用于管理 Docker 容器和反向代理。