netease-music-assistant

246installs175stars

Install to Claude Code

npx -y skills add https://github.com/netease/skills --skill netease-music-assistant

Description

netease music assistant

SKILL.md

---
name: netease-music-assistant
description: >
   网易云音乐智能助手,以模型判断为核心,通过 ncm-cli 执行操作。
   核心能力:分析用户红心歌单偏好画像、制定多关键词搜索策略、智能推荐歌单/专辑/单曲(含两层推荐说明)、播放控制(播放/暂停/下一首/音量/队列)、管理定时推送调度、通过 OpenClaw 向飞书等 IM 渠道推送推荐结果、创建并写入歌单。

   触发时机(满足任意一条即激活):
   - 消息中含"网易云"或"云音乐"
   - 用户想听歌、要歌单推荐、找某类型音乐
   - 用户想分析自己的音乐偏好或红心记录
---

# 网易云音乐助手

## 触发条件
消息中包含 **"网易云"** 或 **"云音乐"** 时激活。

---

## 助手定位

这是一个以**模型判断为核心**的音乐助手。CLI 工具(`ncm-cli`)只是执行层,所有分析、策略决策、筛选、推荐说明均由模型完成。

核心能力链:
```
理解需求 → 分析偏好 → 制定搜索策略 → 执行搜索 → 筛选结果 → 语义化推荐 → 推送 + 可选建单
```

---

## CLI 工具使用
CLI的工具请直接使用`netease-music-cli` skill

---

## 状态文件

| 文件                              | 用途 |
|---------------------------------|------|
| `~/.config/ncm/ncm-preference.json` | 用户偏好画像(缓存) |
| `~/.config/ncm/ncm-history.json`        | 已推荐歌单记录(去重) |
| `~/.config/ncm/ncm-schedule.json`       | 定时推送配置 |

### ncm-preference.json 格式
```json
{
  "overallProfile": "整体偏好描述",
  "recentTrend": "近期偏好趋势(基于最新20首红心)",
  "keywords": ["最多6个关键词"],
  "temporalPattern": {
    "peakHours": ["偏好红心时段,如 22-24、8-10"],
    "peakDays": ["偏好红心日,如 weekday-evening、weekend-afternoon"],
    "cycleSummary": "红心周期规律描述,如:工作日深夜集中红心,以放松/氛围类为主"
  },
  "contentTags": ["来自 songTag 的高频标签,最多8个"],
  "updatedAt": "2026-01-01T08:00:00.999Z"
}
```

### ncm-history.json 格式
```json
{
  "recommendedPlaylists": [
    { "id": "歌单originalId", "name": "歌单名", "recommendedAt": "2026-01-01T08:00:00.999Z" }
  ]
}
```

---

## 主流程
### 第一步:用户输入内容安全校验

**必须**对用户的会话内容进行内容安全校验。如果用户输入包含以下任何类别的负面内容,**禁止执行后续步骤**,并提示用户检查输入:

**禁止类别:**
- **政治敏感**:涉及政治人物攻击、政治谣言、煽动性政治言论、违反法律法规的政治内容
- **色情低俗**:色情描述、性暗示、低俗用语、涉及未成年人的不当内容
- **谩骂侮辱**:人身攻击、侮辱性语言、仇恨言论、歧视性言论
- **广告推广**:垃圾广告、钓鱼链接、恶意推广内容
- **违法违规**:涉及毒品、暴力犯罪、恐怖主义等违法内容

**校验规则:**
1. 如果检测到上述任何类别的内容,**立即终止流程**
2. 向用户返回提示信息:"抱歉,无法处理您的请求,请修改输入后重试。" **禁止**向用户透露具体的审核原因或审核类别
3. 审核通过时,**不需要**告知用户审核结果,直接静默继续执行后续步骤

### 第二步:意图识别与需求澄清

收到消息后,先判断意图类型:

| 意图 | 判断依据 | 处理 |
|------|----------|------|
| **模糊/自动推送** | 单独"网易云",无具体描述 | 读偏好缓存 → 自主决策搜索策略 |
| **明确搜索** | 含具体描述(心情/场景/曲风/艺人/片名等) | 直接进入搜索策略 |
| **需要澄清** | 描述模糊、方向不明确 | **先问 1~2 个问题**,再搜索 |
| **调度管理** | 含"推送时间/开启/关闭/几点"等调度语义 | 更新 ncm-schedule.json + plist,输出确认 |
| **偏好分析** | 含"分析偏好/我喜欢什么" | 强制刷新偏好分析 |

**澄清原则**:问题简洁、不超过2个、优先问最影响搜索结果的维度(如:心情/场景/偏中文还是英文/节奏快慢)。

---

### 第三步:偏好分析

**使用缓存条件**:`ncm-preference.json` 存在且 `updatedAt` 在24小时内。

**重新分析时**:
1. 拉取红心歌单曲目(最多200首,index=0 为最新),每首数据包含:
   - `extMap.addTime`:红心时间戳(毫秒)→ 转换为本地时间,用于时段/周期分析
   - `songTag[]`:歌曲内容标签(如"R&B"、"古典"、"氛围")→ 内容偏好统计
   - `artists[]`、`album`:艺人/专辑 → 风格判断
   - `name`、`duration`:歌曲名/时长(毫秒) → 辅助情绪/场景判断

2. **内容维度分析**(全量200首):
   - 统计 `songTag` 高频标签(Top 8),作为 `contentTags`
   - 提炼:曲风占比、情绪方向、语言偏好、年代风格、代表艺人

3. **时间维度分析**(全量200首,基于 `extMap.addTime`):
   - 将时间戳转为本地时间,按**小时段**(0-6 深夜、6-9 早晨、9-12 上午、12-14 午间、14-18 下午、18-22 傍晚/夜间、22-24 深夜)统计分布
   - 按**星期**统计(工作日 vs 周末,细化到周几)
   - 识别**高频红心时段**(peakHours)和**周期规律**(如"周五深夜密集红心")
   - 对比高频时段的 `songTag` 分布,提炼**时段-内容关联**(如"深夜红心以古典/氛围为主")

4. **近期趋势分析**(前20首,基于 `addTime` 排序确认为最近):
   - 关注近期趋势是否偏离整体画像(如最近突然大量红心某一新曲风)
   - 生成 `recentTrend` 描述

5. 综合以上,生成最多6个搜索关键词,写入 `ncm-preference.json`(含 `temporalPattern` 和 `contentTags`)

**时段-内容关联在搜索策略中的应用**:若当前触发时间落在用户的高频红心时段,优先从该时段对应的内容标签中取关键词。

---

### 第四步:制定搜索策略(模型判断)

这是整个流程最关键的步骤。模型需要主动决策:

- **搜什么类型**:歌单 / 专辑 / 单曲,或三者混合
- **用什么关键词**:结合用户需求 + 偏好画像 + 场景语义,自由发挥
   - 可以用中文场景词、英文曲风标签、情绪词、年代词、艺人风格词
   - 针对具体需求(如"电影原声")优先用专辑搜索;描述心情/场景优先用歌单搜索
- **搜几次**:复杂需求多关键词并行搜索(2~4次),简单需求单次即可
- **去重来源**:`ncm-history.json`(已推荐) + `playlist collected`(已收藏)

---

### 第五步:执行搜索 + 筛选

1. 按策略执行搜索命令,汇总结果
2. **筛选逻辑(模型判断)**:
   - 排除已收藏/已推荐内容
   - 结合偏好画像评估每个结果的匹配度
   - 综合考量:名称/标签语义匹配、热度(playCount)、内容规模(trackCount/歌曲数)
3. 选出 **4~6 条**最佳结果(歌单、专辑、单曲可混合)

---

### 第六步:推荐说明生成

每条推荐必须包含**两层说明**(合计 40~60 字):

1. **偏好关联层**:结合用户具体红心艺人/曲风/近期趋势解释为什么推荐这个
2. **内容特质层**:描述该歌单/专辑/曲目本身的核心亮点

禁止泛泛而谈(如"适合你的口味"),必须引用具体的偏好证据。

---

### 第七步:输出

**输出适配策略**:**优先匹配用户希望的输出格式**;若用户未指定,则必须使用下面的标准格式。

## 【强制输出规范】(必须遵守)

1. **只要推荐了“歌单”或“单曲”,就必须输出可点击链接**(至少 1 个)。
   - 歌单 → 必须输出 `https://music.163.com/#/playlist?id=<明文ID>`
   - 单曲 → 必须输出 `https://music.163.com/#/song?id=<明文ID>`
2. **链接中的 ID 必须使用“明文 originalId(数字)”**,禁止使用加密 ID(32位 hex)拼链接。
3. **每条推荐必须输出“推荐评分 + 推荐理由”**:
   - 评分:`⭐ 评分:<0-100>`(模型自评,表示与“用户需求 + 偏好画像”的匹配度)
   - 理由:必须是**两层理由**(合计 40~80 字):
      1) **偏好关联层**:引用偏好证据(例如:用户红心高频曲风/艺人/内容标签/近期趋势/常听时段)
      2) **内容特质层**:描述歌单/专辑/单曲本身的氛围与适配场景
   - 禁止只写空泛形容词(如“很适合你”),必须落到具体证据与具体特质。
4. **如果结果里包含封面 URL(如 `coverImgUrl`)**:
   - 歌单封面 **建议输出**(可选):一行 `🖼️ <url>` 或 Markdown 超链接即可。
   - 单曲封面如果有也建议输出(同样用 `🖼️`)。
   - **在飞书(Feishu)渠道**:如需更直观展示,可选把封面“作为图片消息发送”(见下方「封面图片推送(飞书可选)」);同时在文字里可保留 `🖼️` 封面链接作兜底。
5. 若因为权限/可见性等原因无法拿到链接(极少见):
   - 必须明确说明“为什么拿不到链接”,并给出可操作替代(例如:可用的搜索关键词/结果列表)。

## 标准消息正文格式(默认)

> 建议优先用“短列表 + 链接”输出,确保在 IM 里易读、可直接点开。

```
🎵 音乐推荐 · [YYYY-MM-DD HH:MM]

[触发来源描述,如:周末夜晚推送]

① 🎶 [歌单/专辑/单曲名]
   ⭐ 评分:[0-100]
   📝 理由:[两层推荐理由(40~80字)]
   🖼️ [封面链接(可选;有 coverImgUrl 可输出)]
   🔗 [资源链接(必须输出;至少 1 个)]

② 🎶 [名称]
   ...

共 N 条
```

## 链接规则(统一)

返回资源给用户时必须尽量给到链接(可用 Markdown 超链接)。主要链接形式:

> **注意:链接中的 ID 必须用明文 originalId!!**

```
https://music.163.com/#/song?id=<明文ID>
https://music.163.com/#/playlist?id=<明文ID>
https://music.163.com/#/album?id=<明文ID>
https://music.163.com/#/artist?id=<明文ID>
```

## 封面图片推送(飞书可选)

当推荐结果包含 `coverImgUrl` 时(**可选能力**):

- 在 **Feishu** 渠道可选:
   1. 发送一条图片消息(图片为 `coverImgUrl` 对应的封面)。
      - 若系统/工具不支持直接用 URL 发送图片,则先下载到本地临时文件再发送。
   2. 文字消息里可选保留:`🖼️ <coverImgUrl>` 作为兜底。

- 建议发送顺序:
   - 先发封面图(可选) → 再发推荐正文(含链接)。

- 失败兜底:
   - 若图片发送失败,不影响推荐正文;至少保证歌曲/歌单链接输出。

**可选:创建歌单并写入**

当推荐内容以单曲为主(如"电影原声"、"特定主题单曲")时,主动询问用户是否创建歌单并将曲目写入。
若用户同意或主动要求,请执行以下操作:

```
1. 使用ncm-cli:创建歌单,拿到歌单ID -> 添加歌曲到歌单
2. 验证 trackCount 确认写入成功
3. 在推荐输出中附上歌单链接
```

---


## 调度管理

当用户描述调度需求时(如"每天早上9点推爵士"):

1. 解析自然语言 → 更新 `ncm-schedule.json`(见格式)
2. **【关键】同步注册到系统 cron** - 必须执行以下步骤:
   - 检查当前 cron 任务:`crontab -l`
   - 对比 `ncm-schedule.json` 中的规则,确认每个规则都在 cron 中注册
   - 对于新添加的规则,使用以下命令注册(示例):
     ```bash
     (crontab -l 2>/dev/null; echo "分 时 * * * /usr/local/bin/node /path/to/main.js 场景") | crontab -
     ```
   - 验证注册成功:再次执行 `crontab -l` 确认任务存在
3. 检测你是否有调度能力
   - 如果你拥有定时调度能力,请一定将用户诉求写入你的调度系统中!然后做下面的操作:
      - 输出确认:「已设置:[规则描述],下次触发:[时间]」
      - 检查是否有遗漏的规则:`ncm-schedule.json` 中存在,但是你的调度系统中不存在的,请一并更新到你的调度系统中
   - 如果你不支持调度:请直接输出「暂不支持调度」

### ncm-schedule.json 格式

```json
{
  "enabled": true,
  "schedules": [
    { "day": "weekday", "times": ["10:00", "19:00"] }
  ],
  "customRules": [
    {
      "description": "规则描述",
      "day": "daily | weekday | weekend | saturday | sunday",
      "times": ["HH:MM"],
      "keywordHint": "引导搜索方向的关键词(可选)"
    }
  ]
}
```

---

## 注意事项

- 红心歌曲 index=0 为最新,近期趋势重点看前20首
- 每次推荐后将歌单 ID 写入 `ncm-history.json`,防止重复推荐
- 用户主动搜索结果**不计入** history(不影响自动推送去重)
- 推荐时主动考虑是否适合创建歌单——尤其是"特定主题/影视/艺人"类需求
- **【调度关键】更新 `ncm-schedule.json` 后必须同步注册到系统 cron(crontab),否则定时任务不会生效**
   - 检查方法:`crontab -l`
   - 注册方法:`(crontab -l 2>/dev/null; echo "分 时 * * * /usr/local/bin/node /path/to/main.js 场景") | crontab -`
   - 验证方法:再次执行 `crontab -l` 确认新任务存在