---
name: sku-deploy
description: 派生 1:1 / Logo / Playwright segments / zip 打包 / ECS 部署 / 抖店上传. 用户说「派生」「部署 <款号>」「上架 <款号>」「打包发老婆」时触发.
---

# SKU 派生 / 部署 / 上架

> AI 跑完 PDP + Model 后的全部"非生图"环节：PIL 派生 / Logo / Playwright / zip / ECS / 抖店.

---

## §1 PDP 1:1 派生（PIL，零成本）

### 1.1 智能裁切原则（鞋落画面下 60%）

```python
# 算法：rembg 抠 → bbox.center_y → crop_y0 = center_y - square_size × 0.60
# 禁止中心裁切（会让鞋偏上）
```

工具：`tools/derive_1x1.py <raw> [<out>] [--ratio 0.60] [--logo assets/logo/logo-dark.png]`

⚠️ **当前 bug**：默认 `--logo=logo-light.png`（深底用），暖米底应该 `logo-dark.png` — **跑款必须显式传 `--logo assets/logo/logo-dark.png`**.

### 1.2 完整派生（PDP + Model 全套）

参考脚本：`scripts/L7825/derive_v3_full.py`（跨款复用基线）.

输出文件结构：

```
assets/products/<档口>/<款号>/
├── pdp_main_v3_3x4/    # 真 3:4 (1024×1365) — PDP 主图
│   ├── <SKU>_<colorway>_side_3x4.jpg
│   ├── <SKU>_dual_3x4.jpg
│   └── ...
├── pdp_main_v3_1x1/    # 1:1 (1024×1024) — PDP 1:1 派生
│   ├── <SKU>_<colorway>_side_1x1.jpg
│   └── ...
├── model/              # Model 图（含 1024 + 2048 supersampling 两档）
│   ├── <SKU>_model_<scene>.jpg          # 1024
│   ├── <SKU>_model_<scene>_2048.jpg     # 2048 高清备份
│   └── ...
└── pdp_html/           # 详情页 HTML + 内嵌 imgs
    ├── <SKU>_detail_page.html
    └── imgs/
```

### 1.3 ⚠️ 抖店真 3:4 必裁

OpenAI gpt-image-2 默认 `size=1024×1536` 实际是 **2:3 (0.667 Pinterest)**, **不是抖店 3:4 (0.75)**！抖店容器会变形 / 加白边.

**PIL 必裁**：
- PDP: 1024×1536 → **1024×1365** (真 3:4)
- Model supersampling: 2048×3072 → **1536×2048** (真 3:4)

### 1.4 ⚠️ 1:1 主图分辨率铁律

抖店推荐 **1024-1536px**, 行业标准 1080+. **禁止用 800×800**.

- PDP 1:1: **1024×1024**
- Model 1:1: **1536×1536** (supersampling)

---

## §2 Logo 规范（75% 顶部 brand strip）

⭐ **mayagi 走"顶部 brand strip"风格**（GUORAN / 编辑级电商货架），**不是抖店"1/10 角落 logo"**.

### 2.1 参数

| 参数 | 值 |
|---|---|
| 位置 | 顶部横跨 |
| 宽度 | `width_pct: 0.75` ⭐ |
| margin_x | `-0.07`（略拉出左边）|
| margin_y | `0.00`（完全贴顶）|
| 透明度（PDP）| **0.90** |
| 透明度（Model）| **0.30** 淡水印（§sku-htmlpage §5 铁律 11）|

### 2.2 不打 Logo 的图（保持纯净）

- `detail` 系列（鞋头 / 蝴蝶结 / 内里 / 鞋底特写）
- `craft` 系列（材质 / 工艺横版）
- 详情页内嵌的纯特写图

Why：detail / craft 是传递质感的微距图，logo 会干扰材质叙事.

### 2.3 PIL 实现

```python
# 见 scripts/watermark.py
wm_w = int(img.width * 0.75)
wm_h = int(wm.height * (wm_w / wm.width))
wm = wm.resize((wm_w, wm_h), Image.LANCZOS)
opacity = 0.90  # PDP / 0.30 for Model
alpha = wm.split()[3].point(lambda p: int(p * opacity))
wm.putalpha(alpha)
x = int(img.width * -0.07)
y = int(img.height * 0.00)
img.paste(wm, (x, y), wm)
```

### 2.4 Logo 资产

```
assets/logo/
├── logo-dark.png      # 800×200 — 深炭字（暖米 #F5F2EC ⭐ MAYAGI 主用）
├── logo-light.png     # 800×200 — 米白字（深底用）
├── logo-watermark.png # 800×200 — 深炭字半透明
└── avatar.png         # 800×800 — 头像（不用于商品图）
```

### 2.5 自动选色（已实现 `scripts/watermark.py`）

根据 logo 落位区域的背景平均亮度自动选：
- `brightness > 128`（浅底，如暖米 #F5F2EC）→ `logo-dark.png` ⭐ MAYAGI 主用
- `brightness ≤ 128`（深底）→ `logo-light.png`

---

## §3 Playwright 渲染详情页 segments

### 3.1 流程

```bash
# scripts/<SKU>/render_pdp_segments.py  (跨款复用模板)
# Playwright 加载 HTML → 750px viewport → 按 13 段截图分段 → 输出 750×N JPG
```

输出：
```
assets/products/<档口>/<款号>/pdp_segments/
├── <SKU>_seg_01.jpg   # HERO 段
├── <SKU>_seg_02.jpg   # PDP Header
├── ...
└── <SKU>_seg_09.jpg   # Footer
```

### 3.2 关键参数

- **Viewport**: 750px wide (抖店详情图标准)
- **每段高度**: 由 HTML section padding 决定（推荐 750×1500 / 段）
- **JPG 质量**: q=88
- **总段数**: 9-10 段（合并相邻短段，避免太碎）

### 3.3 抖店详情页规范

- 单段最大 5000×20000 px / 5MB 内
- 推荐 750×1000-1500 px 每段（加载快）
- 推荐分段数 ≤ 20
- 整页推荐总高 ≈ 20000 px
- 支持 JPG/PNG，**建议 JPG**

---

## §4 zip 打包（交付老婆审核）

### 4.1 结构

```
mayagi-<SKU>-<EN-name>-v3/
├── 主图_1x1/          # 5 张
│   ├── <SKU>_<colorway>_side_1x1.jpg
│   ├── <SKU>_dual_1x1.jpg
│   ├── <SKU>_top_down_1x1.jpg (若有)
│   ├── <SKU>_model_<scene>_1x1.jpg (1-2 张)
├── 主图_3x4/          # 5 张
│   ├── 同上但 3x4 版
├── 详情图/            # 9-10 张 segments
│   ├── <SKU>_seg_01.jpg
│   └── ...
├── 商品标题.txt        # `MAYAGI <中文命名> <signature> <品类>`
├── 价格.txt            # ¥XXX
├── 上架说明.txt        # spec / 文案要点
```

### 4.2 打包脚本

`scripts/<SKU>/package_zip.py`（跨款复用）.

---

## §5 ECS 公网部署

### 5.1 凭据

```bash
ssh root@8.137.166.176          # 公钥已配（我 + 老婆 jinjing955@beacon）
```

### 5.2 部署命令

```bash
# 详情页 + imgs + segments + zip
ssh root@8.137.166.176 "mkdir -p /var/www/files/mayagi-brand/products/<款号>/imgs"
scp assets/products/<档口>/<款号>/pdp_html/<款号>_detail_page.html root@8.137.166.176:/var/www/files/mayagi-brand/products/<款号>/
scp assets/products/<档口>/<款号>/pdp_html/imgs/*.jpg root@8.137.166.176:/var/www/files/mayagi-brand/products/<款号>/imgs/
scp assets/products/<档口>/<款号>/pdp_segments/*.jpg root@8.137.166.176:/var/www/files/mayagi-brand/products/<款号>/segments/
scp mayagi-<款号>-<EN-name>-v3.zip root@8.137.166.176:/var/www/files/mayagi-brand/products/<款号>/
ssh root@8.137.166.176 "chown -R www-data:www-data /var/www/files/mayagi-brand/products/<款号>"
```

### 5.3 公网 URL

- 详情页：`https://files.beacon.xin/mayagi-brand/products/<款号>/<款号>_detail_page.html`
- zip：`https://files.beacon.xin/mayagi-brand/products/<款号>/mayagi-<款号>-<EN-name>-v3.zip`
- 单图：`https://files.beacon.xin/mayagi-brand/products/<款号>/imgs/<filename>`

### 5.4 ECS 子目录映射（mayagi 项目）

| 用途 | 路径 | URL |
|---|---|---|
| 跑款产物 | `/var/www/files/mayagi-brand/products/<款号>/` | `https://files.beacon.xin/mayagi-brand/products/<款号>/` |
| 直播复盘 | `/var/www/files/mayagi-reviews/<日期>_<HHMM>/` | `https://files.beacon.xin/mayagi-reviews/<日期>_<HHMM>/review.html` |
| 选款页 | `/var/www/files/mayagi-picks/<日期>_<品类>/` | `https://files.beacon.xin/mayagi-picks/<日期>_<品类>/` |

---

## §6 微信交付老婆

### 6.1 流程

zip 公网链接 → 微信 send-wechat skill → 联系人"君君妈"

### 6.2 send-wechat 注意

- ⚠️ **单次点击输入框 + 单次 ctrl+v**（避免重复粘贴）
- ⚠️ **不用 Enter 发送**（微信 Linux 上 Enter 是换行）→ 点击右下"发送(N)"按钮

---

## §7 抖店上传（Playwright web 自动化）

### 7.1 调研结论

抖店开放平台 API 申请要软件著作权，普通商家拿不到 key. **只能走 Playwright web 自动化**.

### 7.2 流程

- 商家后台：`https://fxg.jinritemai.com/`
- 老婆扫码登录 → storage_state 保存 → cookie 复用
- 失败立刻停（不自动重试）+ 每步 screenshot 留底

### 7.3 上架字段（PDP 准备齐）

| 字段 | 来源 |
|---|---|
| 商品标题（≤ 15 字）| `MAYAGI <中文命名> <signature> <品类>` |
| 主图 1:1（必填）| 5 张 |
| 主图 3:4（选填，加 3% 流量）| 5 张 |
| 详情图 | 9-10 段 750×N JPG |
| 价格 | ¥XXX |
| 类目 | 女鞋 / 凉鞋 / ... |
| 预售期 | 15 天（合规必开，[[project-business-model]]）|

### 7.4 工具债

`tools/upload_douyin.py` 待封装 — 当前手动上传.

---

## §8 资产路径速查

```
~/mayagi-ops/
├── tests/<款号>/                       # 🧪 实验池（可删）
├── data/ops/<sku>/raw/                 # 📥 raw 中转（AI 跑出待审）
└── assets/products/<档口>/<款号>/      # 🏆 生产档案库（审过 OK 的）
    ├── pdp_main_v3_3x4/                # 真 3:4 (1024×1365)
    ├── pdp_main_v3_1x1/                # 1:1 (1024×1024)
    ├── model/                          # Model（1024 + 2048）
    ├── pdp_html/                       # 详情页 HTML + 内嵌 imgs
    ├── pdp_segments/                   # Playwright 渲染分段 JPG
    └── STATUS.md                       # 该款进度（已入库视角清单）
```

### 8.1 入库铁律

1. ✅ **只有用户/老婆明确说"OK"的图才入库**
2. ✅ 入库 = `cp tests/<款号>/<file> assets/products/<档口>/<款号>/<图类型>/<规范文件名>`
3. ✅ 文件命名 schema：`<款号>_<colorway>_<视角>.jpg`
4. ❌ 不要把 `tests/` 当生产档案
5. ❌ 不要直接修改 `assets/products/` 里的图（覆盖 = 丢历史，要替换先 git mv 旧文件）

### 8.2 档口命名

- 发财Rich1991 → `assets/products/发财Rich1991/`
- 黑妹HM → `assets/products/黑妹HM/`
- 其他档口同理（汉字+英文，跟 go2 显示名一致）

---

## §9 工具脚本（极简，单一职责）

```
tools/                  # ⭐ 生产级工具（参数化, 所有 SKU 复用）
├── derive_1x1.py       <raw> [<out>] [--ratio 0.60] [--logo ...]
├── post.py             <sku> → PIL 后期（logo + 抖店尺寸 + JPG q=88）
├── render_pdp.py       <sku> → Jinja2 + Playwright 分段截图（待封装）
└── upload_douyin.py    <sku> → web 自动化上传抖店（待封装）

scripts/<SKU>/          # ⚠️ 实验性脚本（跟 SKU 绑死, 跑通后封装到 tools/）
├── derive_v3_full.py   # 派生（PDP 3:4 + 1:1 + Model 1024 + 2048）
├── render_pdp_segments.py  # Playwright 分段
└── package_zip.py      # 打包
```

跑款时如果工具不存在，**先在 `scripts/<sku>_<task>.py` 跑通**，**验证后再封装到 `tools/`**（不要为了写工具而写工具）.

---

## §10 跨 skill 跳转

- 生 PDP / Model → `Skill(skill="sku-generate")`
- 写详情页 HTML → `Skill(skill="sku-htmlpage")`

---

## §11 改进备忘

- **2026-05-15** 1:1 主图升级 800→1024+ / 模特 1:1 → 1536 supersampling（行业 1080+ 标准）
- **2026-05-15** Model logo opacity 0.90 → 0.30 淡水印（lookbook 风格）
- **2026-05-15** 抖店真 3:4 (0.75) 修复 — PIL 必裁 1024×1536 → 1024×1365 / 2048×3072 → 1536×2048
