闲鱼单商品自动发布 v1.2
完整流水线:闲鱼 Cookie → 选择商品规格 → 底价缓存定价(5%~10%)→ DeepSeek 文案 → 主图生成 → 发布到闲鱼 → 输出汇报。
目录结构
xianyu-auto-publish/
├── SKILL.md # 本文件
├── scripts/ # 可执行脚本
│ ├── publish.py # 单商品发布主控(推荐入口)
│ ├── publish_one.py # 底层 Playwright 发布逻辑(备用)
│ └── deepseek_copywriter.py # DeepSeek 文案生成
├── references/ # 参考资料
│ ├── playwright_selectors.md # 闲鱼发布页选择器参考
│ └── technical_notes.md # 技术要点:后台子进程、超时、API 配置
└── assets/
└── prices_cache.json # 底价缓存(48 商品 / 132 规格)
publish.py 会自动在「与本脚本同目录」「上一级 assets/」「上一级」三处寻找 prices_cache.json,因此扁平布局与上述规范布局都能运行。
环境前置
需要 Python 3.8+ 与第三方包 playwright、requests、Pillow。必须用装齐这些包的解释器运行:
python -c "import playwright, requests, PIL; print('ok')"
报 ModuleNotFoundError 就先安装,再执行 playwright install chromium。
密钥(全部走环境变量)
源码与文档中不含任何密钥字面量。
| 环境变量 | 用途 | 缺失后果 |
|---|---|---|
DEEPSEEK_API_KEY |
生成商品文案 | 降级为内置兜底文案模板 |
GPT_IMAGE_API_KEY |
AI 生成主图 | 降级为本地绘制商品卡 |
GPT_IMAGE_ENDPOINT |
生图端点 | 默认 http://image.qianweikeji.fun:3000/v1 |
DEEPSEEK_BASE_URL |
文案接口 | 默认 https://api.deepseek.com |
# Windows (cmd)
set DEEPSEEK_API_KEY=sk-xxx
set GPT_IMAGE_API_KEY=sk-xxx
# Linux / macOS
export DEEPSEEK_API_KEY=sk-xxx
export GPT_IMAGE_API_KEY=sk-xxx
密钥缺失不中断流程,只降级,且运行时打印明确提示。
使用方式
仅预览定价(不联网、不花钱、不要 Cookie)
PYTHON scripts/publish.py --product "爱奇艺星钻会员" --spec "季卡" --query-only --output ./output
生成素材但不发布(不要 Cookie)
PYTHON scripts/publish.py --product "百度网盘svip" --spec "年卡" --output ./output < /dev/null
> 不传 --cookies 时会停在交互式 input() 等待粘贴 Cookie。无终端环境(脚本、后台任务)必须重定向 stdin,例如 < /dev/null,否则永久阻塞。
完整发布(需 Cookie,会真实上架)
PYTHON scripts/publish.py --product "爱奇艺星钻会员" --spec "季卡" \
--cookies "t=xxx; cookie2=xxx; ..." --output ./output
Cookie 从 goofish.com 复制,格式 t=xxx; cookie2=xxx; ...。Cookie 属于账号凭证,不要交给他人代取。
商品名与规格
必须与 assets/prices_cache.json 中的键完全一致(含大小写),不做模糊匹配,写错会报「未找到底价」并退出。常见易错项:
百度网盘svip(小写)/百度网盘svip会员(周卡)/百度网盘超级会员(另一档)夸克网盘超级会员(不存在「SVIP」写法)得到听书会员的规格是15天而非半月卡Keep会员与keep会员是两个独立条目
可用 --query-only 试名,报错即换名。
动态定价(5%~10%)
def get_dynamic_profit_rate(cost_price):
if cost_price < 10: return 0.10
elif cost_price < 30: return 0.08
elif cost_price < 80: return 0.06
else: return 0.05
sale_price = round(cost_price * (1 + profit_rate), 1)
划线价固定为 底价 × 1.5。底价缓存时间戳为 2025-05,实际底价请自行核验后再定售价。
主图生成的两条路
- AI 生图(首选):先做 8 秒端点探活,端点不可达时不进入 10 分钟重试轮询。
- 本地绘制兜底:用 Pillow 离线绘制商品卡(商品名 + 规格 + 大号价格 + 三条服务卖点),必然成功。字体按
msyh.ttc → simhei.ttf → simsun.ttc → wqy-zenhei → PingFang → PIL 默认顺序尝试,跨平台可用。
文案格式
标题由外部拼接(商品名 + 规格 + 价格 + 卖点词),放在详情文案开头:
百度网盘svip年卡205.5元官方直充 ← 标题
【权益说明】
~~~~~~~~~~~~~~~~~~~~~~
● 百度网盘SVIP年卡,解锁全平台极速下载通道...
【充值说明】
~~~~~~~~~~~~~~~~~~~~~~
● 你只需要提供百度网盘绑定的手机号...
【到账时间】
~~~~~~~~~~~~~~~~~~~~~~
● 提交手机号后秒到账,会员时长即时生效...
【售后保障】
~~~~~~~~~~~~~~~~~~~~~~
● 充不上全额退,不用你承担任何风险...
【下单提醒】
~~~~~~~~~~~~~~~~~~~~~~
● 下单后请在留言处直接填写需要充值的手机号。
合规红线
- 卖点词池已剔除「已售1万 / 好评过千 / 万人信赖 / 销量过万 / 库存紧张 / 手慢无货 / 限时抢购」等新店使用即虚假宣传的词,仅保留可验证的服务性描述。
- DeepSeek 提示词内禁用 emoji、绝对化用语(「第一」「最快」「绝对」)及「闲鱼」字样。
- 划线价为底价 × 1.5 的营销价,非真实历史成交价。
发布页关键操作
| 字段 | 选择器 | 操作 |
|---|---|---|
| 描述 | div[contenteditable="true"] |
逐行 type() + press('Enter') |
| 售价 | input[placeholder="0.00"](第 1 个) |
click → fill → blur → 验证 |
| 原价 | input[placeholder="0.00"](第 2 个) |
同上 |
| 物流 | text="无需邮寄" 或 text="自动充值" |
直接点击 |
| 发布按钮 | button:has-text("发布") |
点击后等 10 秒检查 URL 变 /item |
闲鱼发布页标题字段留空,标题内容放在描述框第一行。
详见 references/playwright_selectors.md 与 references/technical_notes.md。
技术要点
GPT-image-2 与 Playwright 均需较长时间,必须脱离交互环境运行。脚本用 _spawn_bg()(subprocess.Popen + DETACHED_PROCESS)后台启动子进程,Windows 与 Linux/macOS 均可用;早期版本使用的 nohup 在 Windows 不存在,会静默失败。
Playwright 流程 headless=True 执行。发布前后各存一张截图(before_publish.png / after_publish.png)便于排查。
依赖声明
- Python 3.8+
pip install playwright requests Pillowplaywright install chromium- 运行时需要网络访问:
api.deepseek.com(文案生成,缺失则跳过)、生图端点(缺失则跳过) - 用户需提供:闲鱼 Cookie(仅发布步骤需要)
已知限制
- Playwright 真实发布路径未在本次交付中实测(缺 Cookie)。闲鱼前端改版可能导致选择器失效,首次发布建议人工核对截图。
- 底价缓存更新时间为 2025-05,可能偏离当前实际进货价。
- 生图端点当前返回 502,实际运行会走本地绘制兜底。
修复记录
| # | 问题 | 修复 |
|---|---|---|
| 1 | ASSETS_DIR 指向技能目录上一级,底价缓存读取直接 sys.exit(1) |
改为三候选路径自动探测,扁平与规范布局均可用 |
| 2 | nohup 在 Windows 不存在,生图与发布子进程静默失败 |
新增 _spawn_bg(),改用 subprocess.Popen |
| 3 | --query-only 仍强制 input() 索取 Cookie,无终端即死锁 |
仅预览模式跳过 Cookie 交互 |
| 4 | 生图端点 502 时白等 10 分钟重试 | 增加 8 秒探活 + Pillow 本地绘制兜底 |
| 5 | 卖点词池含虚假宣传词 | 替换为可验证的服务性描述 |
| 6 | 三处硬编码明文 API 密钥 | 全部改为环境变量读取 |
| 7 | venv 路径与 Windows 字体路径硬编码 | 改为解释器自适配 + 跨平台字体候选链 |
| 8 | frontmatter 缺必填字段 | 补齐 description_zh / description_en / version / author 等 |