# Goofish Publish Item

> 闲鱼发商品 skill。何时激活：用户说"帮我发到闲鱼 / 挂个闲置 / 把 XX 上架 / 发布一件 / 新增商品 / 上新"；或说"这个怎么写标题 / 类目该选啥 / 图片够了吗"。 功能：从 raw 描述 / 图片 → 确认类目 → 生成标题候选 → 风控预检 → 批量传图 → 拿默认地址 → 调用 `item_publish` 一键发布。核心约束：**发送前必须让用户确认文案**， 不自动提交；调用 `goofish-risk-guard` 做发布前扫描。

- Skill: `fancyboi999/goofish-publish-item` (Agent Skill, multi-file: 5 files)
- Install (CLI): `npx skillmds@latest add fancyboi999/goofish-publish-item`
- Raw SKILL.md: https://api.skillmd.com/api/skills/fancyboi999/goofish-publish-item/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: fancyboi999 (https://skillmd.com/u/fancyboi999)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/fancyboi999/goofish-publish-item

---


# 闲鱼发商品

## 工具命名

正文使用 `auth_status` 这类逻辑名。OpenClaw 调 `goofish__<逻辑名>`；
Claude Code / Cursor 调 `mcp__goofish__<逻辑名>`。frontmatter 的 `allowed-tools`
保留 Claude 权限预批准格式，OpenClaw 不读取该字段。

## 触发姿势

用户典型输入：
- "帮我把这个耳机发到闲鱼，300，9 成新"
- "我拍了几张图，给我写个标题和描述"
- "上架这个手办，可以议价，底线 200"

当你从用户消息中能提取 **（商品本体 + 至少一张图 或 对物品的文字描述）** 就启动本流程。信息不足时**问用户**而不是瞎猜。

## 标准流程（7 步）

### Step 1 · 登录态自检（必做）

```
调 auth_status
  valid=true → 继续
  valid=false → 不继续；告诉用户: "登录态失效了，请执行 goofish auth login（扫码走 --qr）"，停。
```

### Step 2 · 信息收集

从对话和用户提供的素材里提取：

| 字段 | 必填 | 来源 |
|---|---|---|
| 核心物品（是什么） | ✅ | 用户描述 / 图片识别 |
| 品牌 + 型号 | ✅ | 用户描述 |
| 成色（X 成新） | ✅ | 用户描述；没说就**问** |
| 价格 | ✅ | 用户描述；没说就**问** |
| 图片（URL 或本地路径） | ✅ | 用户提供 |
| 瑕疵说明 | 推荐 | 问用户"有没有瑕疵要提一下的" |
| 购买渠道 | 推荐 | 帮写描述更有信服力 |
| 是否可议价 / 底线 | 可选 | 为后续 reply-buyer 做准备 |
| 发货地 | ⚪️ | 不填就调 `location_default` 兜底 |

**缺必填字段就停下来问，不要补默认值**。

### Step 3 · 类目识别

```
调 category_recommend(title=候选标题, images=[首图])
  → 拿到 catId / catName
```

**结果校验**：
- 如果 catName 和用户描述明显不符（比如用户说手机壳，返回"手机"），告诉用户并让他确认
- 如果置信度低（返回多个候选），展示前 3 个让用户选

### Step 4 · 标题生成

按 **"品牌 + 核心词 + 属性 + 场景 + 情感"** 5 段式生成 3 个候选。详见 `references/title-formula.md`。

**然后**调用 `goofish-risk-guard` 扫描：
- 绝对化词、外联词、侵权词命中 → 重新生成
- 命中"降价改标"嫌疑（标题含促销词+历史价格变动）→ 重新生成

把扫描过的候选展示给用户选 / 改。

### Step 5 · 描述生成

结构参考 `references/title-formula.md` 的"描述骨架"段。重点：
- **有瑕疵就大方说**（保护卖家对抗仅退款）
- 说清**为什么卖**（"升级新款"、"不常用"，比"闲置"可信）
- 说清**发货地 + 快递** + **是否包邮**
- 议价政策写明（"小刀友好 / 超过 XX 勿扰"）

### Step 6 · 图片处理

```
for image in images:
    调 media_upload(image)
    收集返回的 {url, width, height}

检查:
    总图数 ≤ 9 ？
    首图是 1:1 ？（如果不是，提示用户换首图）
    张数 ≥ 3 ？（少于 3 张警告但不拦）
```

### Step 7 · 用户最终确认 + 发布

**展示给用户**（强制）：
```
【标题】...（最终版）
【类目】catName (catId=XXXX)
【描述】
（全文）
【价格】XXX 元
【图片】9 张，首图 1:1 ✅
【发货地】XX 市 / 默认
【风控扫描】通过 ✅

是否确认发布？
```

**等待用户明确回复 "发 / 发吧 / 确认 / OK / 是 / 嗯"**。含糊的 "看看" / "嗯" 单字不算确认。

确认后：
```
调 item_publish(
    title=..., 
    desc=..., 
    price=..., 
    image_urls=[...],
    cat_id=..., 
    addr=...（没有就省略，让服务端用 location_default）
)
```

## 反模式（不要做）

❌ **跳过 category_recommend**，自己猜 catId
❌ **先发后改**（建议用户"先发出去再慢慢改" → 发布后频繁编辑会丢流量池权重）
❌ **省略风控扫描**（标题含绝对化词直发 → 100% 降权）
❌ **未确认就发**（写操作不可逆，多花 5 秒等用户确认）
❌ **批量发十件不停手**（令牌桶 1 件/分钟，连发会触发限流）

## 批量发布场景

用户说"我有 10 件都要发"：
1. 先让他确认"是 10 件完全不同的，还是 10 件同款？"
2. 同款：合并为 1 件的多 SKU 描述，不是 10 次发布
3. 不同款：逐件走完整流程，**每件单独确认**，不要"一次性确认 10 件"（用户看不过来）
4. 告诉用户"受速率限制，大约 12-15 分钟"

## 发布后

- 返回 `item_id` 展示给用户
- **提示流量池窗口**："商品已发布，前 24 小时是初始推荐窗口，这段时间内不要改标题/降价改标"
- 记录 item_id（如果用户后续要诊断或下架）

## 相关 skill

- `goofish-risk-guard` — 发布前扫描（标题/描述/图片）
- `goofish-reply-buyer` — 发布后回买家消息
- `goofish-shop-diagnosis` — 如果发布后流量差

