🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

网易云每日推荐 zxcvbnmlxy/dsh-netease-daily

DeepSeek Harness
zxcvbnmlxy7 天前有提交已提供中文文档扫描:含敏感能力

每日听歌 · DeepSeek Harness 插件

31.5/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/27 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add zxcvbnmlxy/dsh-netease-daily
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · other
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 7 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 49 处,展示前 44 条)
  • 发起网络请求
    client.js:22
    const jget = (path) => fetch(API + path, { credentials: 'same-origin' }).then(asJson);
  • 发起网络请求
    client.js:23
    const jpost = (path, body) => fetch(API + path, {
  • 写入本地文件
    src/service.js:17
    await writeFile(temporary_path, content, { encoding: 'utf8', mode: 0o600 });
  • 写入本地文件
    src/service.js:18
    await rename(temporary_path, path);
  • 读取本地文件
    src/service.js:22
    try { return JSON.parse(await readFile(path, 'utf8')); }
  • 写入本地文件
    src/service.js:88
    await mkdir(this.data_dir, { recursive: true, mode: 0o700 });
  • 写入本地文件
    src/service.js:148
    await writeFile(qr_path, Buffer.from(qr.qrimg.split(',')[1], 'base64'), { mode: 0o600 });
  • 读取本地文件
    src/service.js:152
    const data = await readFile(png);
  • 写入本地文件
    src/settings.js:48
    await mkdir(target, { recursive: true });
  • 写入本地文件
    src/settings.js:50
    await writeFile(probe, 'ok', 'utf8');
  • 读取本地文件
    src/settings.js:51
    await access(probe);
  • 写入本地文件
    src/settings.js:102
    await mkdir(this.data_dir, { recursive: true, mode: 0o700 });
  • 读取本地文件
    src/settings.js:105
    stored = JSON.parse(await readFile(this.path, 'utf8'));
  • 写入本地文件
    src/settings.js:128
    await writeFile(tmp, JSON.stringify(next, null, 2), { encoding: 'utf8', mode: 0o600 });
  • 写入本地文件
    src/settings.js:129
    await rename(tmp, this.path);
  • 写入本地文件
    src/logger.js:40
    await mkdir(dir, { recursive: true });
  • 读取本地文件
    src/logger.js:41
    await access(dir);
  • 写入本地文件
    src/logger.js:51
    await mkdir(dir, { recursive: true });
  • 写入本地文件
    src/logger.js:53
    await writeFile(probe, 'ok', 'utf8');
  • 删除本地文件
    src/logger.js:54
    await unlink(probe).catch(() => {});
  • 写入本地文件
    src/logger.js:66
    await appendFile(join(dir, 'events.jsonl'), `${JSON.stringify(record)}\n`, 'utf8');
  • 写入本地文件
    src/logger.js:77
    await writeFile(path, `${lines.join('\n')}\n`, 'utf8');
  • 读取本地文件
    src/logger.js:87
    try { existing = await readFile(path, 'utf8'); } catch {}
  • 写入本地文件
    src/logger.js:89
    await writeFile(path, `${head}## ${markdown_text(title)}\n\n${lines.join('\n')}\n\n`, 'utf8');
  • 读取本地文件
    src/logger.js:103
    try { names = await readdir(dir); } catch { return { ok: false }; }
  • 读取本地文件
    src/logger.js:111
    const info = await stat(path).catch(() => null);
  • 删除本地文件
    src/logger.js:114
    await unlink(path).catch(() => {});
  • 读取本地文件
    src/logger.js:124
    try { await writeFile(join(dir, 'latest.md'), await readFile(join(dir, today), 'utf8'), 'utf8'); } catch {}
  • 读取本地文件
    src/logger.js:142
    const raw = await readFile(events_path, 'utf8');
  • 执行外部命令来自配置/变量
    src/deps.js:9
    execFile(command, args, { windowsHide: true, timeout: timeout_ms, maxBuffer: 1 << 20 }, (error, stdout, stderr) => {
  • 读取本地文件
    src/deps.js:53
    if (!existsSync(candidate.path)) continue;
  • 执行外部命令固定命令
    src/deps.js:80
    const child = spawn('winget', ['install', '--id', 'shinchiro.mpv', '--exact', '--silent', '--accept-package-agreements', '--accept-source-agreements']
  • 执行外部命令来自配置/变量
    src/netease_client.js:28
    execFile(command, args, { windowsHide: true, timeout: timeout_ms, maxBuffer: 1 << 20 }, (error, stdout, stderr) => {
  • 读取本地文件
    src/netease_client.js:91
    if (existsSync(path)) {
  • 读取本地文件
    src/netease_client.js:117
    if (existsSync(bin)) {
  • 执行外部命令固定命令
    src/netease_client.js:140
    if (IS_WIN) child = spawn('rundll32.exe', ['url.dll,FileProtocolHandler', url], { windowsHide: true, detached: true, stdio: 'ignore' });
  • 执行外部命令固定命令
    src/netease_client.js:141
    else if (process.platform === 'darwin') child = spawn('open', [url], { windowsHide: true, detached: true, stdio: 'ignore' });
  • 执行外部命令固定命令
    src/netease_client.js:142
    else child = spawn('xdg-open', [url], { windowsHide: true, detached: true, stdio: 'ignore' });
  • 执行外部命令来自配置/变量
    src/netease_client.js:154
    const child = spawn(exe, [url], { windowsHide: true, detached: true, stdio: 'ignore', shell: false });
  • 执行外部命令固定命令
    src/netease_client.js:168
    const child = spawn('powershell.exe', ['-NoProfile', '-NonInteractive', '-Command', `Set-Clipboard -Value '${safe}'`], { windowsHide: true, stdio: 'ig
  • 执行外部命令来自配置/变量
    src/netease_api.js:62
    child = fork(fileURLToPath(new URL('./api_worker.js', import.meta.url)), [], {
  • 执行外部命令来自配置/变量
    src/silent_player.js:46
    child = spawn(player_path, args, { windowsHide: true, shell: false, stdio: ['ignore', 'ignore', 'ignore'] });
  • 发起网络请求
    src/netease_cdp.js:18
    const request = http.get(url, response => {
  • 读取本地文件
    src/api_worker.js:17
    if (existsSync(key_path)) return;
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DeepSeek Harness 插件生态本周动态:21:00 起更新 5 条,mpv 相关 30 条,新增 3 个插件。

README

由 DeepSeek 最新模型翻译生成
每日听歌 · DeepSeek Harness 插件 每天北京时间 21:00,从你登录的网易云音乐「每日推荐」挑 5 首候选,每首用本机播放器试听 30 秒,由 DeepSeek 选出 3 首、写推荐理由和歌曲链接,发送到开启任务的 Harness 对话。日报另存本机。可以告诉它喜欢 / 不喜欢哪首歌,之后选歌会参考本地偏好,并避开近 14 天推荐过的歌曲。 这里的「听歌」是本机播放器真实播放。 DeepSeek 根据歌曲资料、可用歌词和你的偏好写推荐理由;文本模型不会因为播放了音乐就获得音频理解能力。没有播放器、歌曲不可播或试听失败时,仍可推荐,但明确标记「未完成试听」。不提交虚假播放记录,不绕过会员 / 版权限制,不自动修改收藏。 安装 已针对 Harness Desktop 0.2.1-rc.2 的真实工具和排程接口编写。使用 Node.js 22.19+(建议 24),无需另填 DeepSeek API Key,使用当前 Harness 会话的模型。
展开完整文档(README 剩余 1 节)
每日听歌 · DeepSeek Harness 插件

每天北京时间 21:00,从你登录的网易云音乐「每日推荐」挑 5 首候选,每首用本机播放器试听 30 秒,由 DeepSeek 选出 3 首、写推荐理由和歌曲链接,发送到开启任务的 Harness 对话。日报另存本机。可以告诉它喜欢 / 不喜欢哪首歌,之后选歌会参考本地偏好,并避开近 14 天推荐过的歌曲。

这里的「听歌」是本机播放器真实播放。 DeepSeek 根据歌曲资料、可用歌词和你的偏好写推荐理由;文本模型不会因为播放了音乐就获得音频理解能力。没有播放器、歌曲不可播或试听失败时,仍可推荐,但明确标记「未完成试听」。不提交虚假播放记录,不绕过会员 / 版权限制,不自动修改收藏。

安装

已针对 Harness Desktop 0.2.1-rc.2 的真实工具和排程接口编写。使用 Node.js 22.19+(建议 24),无需另填 DeepSeek API Key,使用当前 Harness 会话的模型。

从 GitHub 安装(开发版 / 最新未发布代码)

dsh plugin --profile <profile> add github:zxcvbnmlxy/dsh-netease-daily#9843d6f

或安装不带固定提交的最新 main:

dsh plugin --profile <profile> add github:zxcvbnmlxy/dsh-netease-daily

在 Harness 的对话里(profile 已启用 plugin_manager 时)也可以直接说:

安装 bundle github:zxcvbnmlxy/dsh-netease-daily,然后确认 netease_status 工具可用。

从 npm 安装

dsh plugin --profile <profile> add dsh-netease-daily

npm 最新版本以 npm view dsh-netease-daily version 为准。注意 pnpm 11 起默认 minimumReleaseAge: 1440(新发布的版本要满 1 天才参与按范围的解析),所以刚发布的新版本用裸包名可能仍解析到上一版。三种处理方式:

- 显式指定版本(立即生效):dsh plugin --profile <profile> add dsh-netease-daily@<版本号>
- 等约 1 天后裸包名自动解析到新版;
- 或在 profile 的 pnpm-workspace.yaml 里设 minimumReleaseAge: 0(会放宽整个 profile 的供应链冷却,谨慎)。

市场登记:<https://dsh-plugin.market/plugin/zxcvbnmlxy/dsh-netease-daily>。

从本地目录安装(开发版)

1. 在本目录运行:

npm.cmd ci --ignore-scripts

2. 打开 Harness Desktop 的插件管理,使用本地插件 / 本地目录安装,选择本目录;如果界面没有本地安装入口,在 Harness 的对话里请它调用自带的 plugin_manager 安装:

安装本地 bundle(指向本目录),包名 dsh-netease-daily,然后确认 netease_status 工具可用。

根据 Harness 提示重载或重启。不要手工替换 Desktop 的核心包。

3. 扫码登录网易云(任选其一):

- 在本目录运行 npm.cmd run login,用网易云 App 扫描浏览器中的二维码并确认,网页会自动检查登录;
- 或者直接在 Harness 里说:

调用 netease_login_start,把本机二维码图片显示给我;我扫码确认后,再调用 netease_login_check。

4. 登录后,在准备接收日报的 Harness 对话里说:

启用网易云每日听歌任务:北京时间每天 21:00,从我的每日推荐挑 5 首,每首试听 30 秒,给我推荐 3 首并说明理由。现在先执行一次。

这会调用 netease_schedule_enable。以工具返回的任务 ID 和下次执行时间为准;仅安装插件不会自行创建任务。先登录、再开启任务。

设置页

安装(或升级)插件后重启一次 DSH,设置页左侧会出现「每日听歌」。这一页集中管理所有可变项,不用改代码或配置文件,保存后立即生效、重启后保留:

- 每日运行时间(默认 21:00)与启用开关;
- 推荐描述:心情 / 场景 / 风格,AI 按它从每日推荐和关键词搜索里挑歌;
- mpv 依赖:显示是否就绪(路径与版本),可一键检测或用 winget 安装;
- 播放器路径:留空则自动查找(PATH / Program Files / 插件目录);
- 日志目录:所有日志写入这里,不可写会在面板上直接报红;点 浏览… 可用系统文件夹对话框直接选(本机桌面),远程浏览器场景退回应用内逐级浏览,也可手动填路径;
- 试听时长(默认 15 秒,5–120 秒);
- 扫码登录:生成二维码、检查登录结果;
- 任务开关:开启 / 停止每日任务,并显示下次运行时间。

面板顶部还有一块 「最近推荐」:今日 3 首(带评分,点歌名直接打开网易云),以及最近 7 天的折叠历史——不用打开任何日志文件就能回看。

点歌直接播放(VIP 歌曲的解法)

网页版播不了 VIP 歌曲,所以「最近推荐」里的歌名改成了「打开并播放」动作。按你安装的客户端形态自动选择路径:

1. 经典桌面版(C:\Program Files\NetEase\CloudMusic\):实测客户端 3.1.42 不响应 orpheus://song/<id> 深链(手动粘贴到浏览器也不播放),所以插件改用客户端自带的 本地调试通道(Chromium DevTools Protocol,127.0.0.1:9223):在客户端搜索框里输入「歌名 歌手」→ 回车 → 点搜索结果的「播放」按钮,效果等同于你在客户端里手动点歌。
- 客户端未运行时:插件用 --remote-debugging-port=9223 启动它,等页面就绪后播放(约 5–10 秒);
- 客户端已在运行,但没有控制通道(比如你从开始菜单打开的):插件只能唤起客户端并复制歌名,同时在提示里说明「关掉客户端后,下次点歌即可直接播放」;
- 点歌后切歌约 2–3 秒(搜索 → 点击播放 → 确认切换),这期间客户端里正在放的音乐会继续播放,直到切换完成;
- 连续快速点第二首时,第二个请求会立即返回「上一首还在打开中,请稍等一两秒再点」,不会排队,避免请求堆积;
- 调试端口只绑定 127.0.0.1,不对外网开放,也不会读取账号凭证。
2. Microsoft Store(MSIX)版(运行路径在 C:\Program Files\WindowsApps\ 下):包清单里没有协议扩展,也不能带参数启动,所以无法定位到某一首;插件会打开应用,并把「歌名 歌手」复制到剪贴板。
3. 未安装客户端:回退网页版 https://music.163.com/#/song?id=<id>,并提示 VIP 限制。

每首歌右侧另有 「网页」 按钮,强制走浏览器;对话里也可以说「打开第 2 首」(netease_open 工具),逻辑一致。

客户端是否安装,由外部证据判断:HKCR\orpheus 协议注册项、shell\open\command 里的 exe、常见安装路径、运行中的 cloudmusic 进程,或开始菜单里的 Store 应用;结果缓存 60 秒。

Store 版的限制

如果你装的是微软商店版网易云(运行路径在 C:\Program Files\WindowsApps\ 下):

- 该版本的包清单里没有注册 orpheus 深链,也不能直接执行 exe(Windows 会拒绝),所以无法做到「点歌名直接播放某一首」;
- 插件会识别到 Store 版,点击歌名时:打开网易云应用 + 把「歌名 歌手」复制到剪贴板,并在提示里说明原因——你到客户端里粘贴搜索即可;
- 想要「点一下就直接播放」,需要安装经典桌面版;装好后插件会检测到它,并通过本地调试通道在客户端里搜索播放,无需改配置。

黑箱测试

照单执行见 docs/blackbox-test-checklist.md:覆盖安装可见性、配置持久化、依赖、扫码登录、定时静默运行、推荐与评价、日志、异常状态、唤起/降级、边界回归。

静默播放与评价

播放使用 mpv --ao=null --volume=0 --mute=yes --no-video:解码与进度照常推进,但不打开任何音频设备、不弹窗口,全程没有声音。

AI 评价基于歌曲资料、可用歌词、时长与播放状态,并在评价里明确标注「未直接听到音频」——文本模型确实听不到声音,不编造旋律、音色、编曲或试听感受。

未安装 mpv 时,工具返回 PLAYER_NOT_READY,设置页会提示安装;不会静默跳过。

日常使用

- 「按描述推荐」(netease_plan):读设置页里的推荐描述,返回每日推荐 + 关键词搜索的候选与歌词摘要。
- 「搜歌」(netease_search):按关键词搜索候选。
- 「静默试听」(netease_listen):ao=null 播放指定候选,返回真实播放状态。
- 「写评价」(netease_evaluate):把 1–5 分与评价写入日志目录(events.jsonl + 当日 .md)。
- 「保存推荐」(netease_daily_save):保存 3 首推荐与理由,并写入日志。
- 「改设置」(netease_settings):在对话里也能改时间、描述、日志目录等,与设置页同一份存储。
- 「我喜欢 / 不喜欢」(netease_feedback):只记录本机偏好,下次选歌生效。
- 「检查状态」(netease_status):登录、依赖、日志可写、任务、今日进度一屏返回。

同一天重复触发会复用当天候选,已完成的日报不重复改写;去重后没有新歌会如实告知。

配置和数据

默认数据目录为 %USERPROFILE%\.dsh\netease-daily(尊重 DSH_HOME),可用环境变量 DSH_NETEASE_DATA_DIR 指定。可变项都通过设置页配置,存放在 settings.json,不写死在代码里:

- settings.json:每日时间、时区、推荐描述、日志目录、试听时长、播放器路径、任务与会话绑定。设置页保存后立即生效。
- logs/events.jsonl:追加式事件日志(设置变更、候选计划、静默播放、评价、推荐、错误)。
- logs/YYYY-MM-DD.md:当天的推荐与逐首评价(每天一个文件,写入设置页指定的日志目录)。
- logs/latest.md:最新一次结果的镜像,适合收藏/分享。
- logs/index.html:可点击的历史索引(本地双击即可浏览最近 30 天)。
- 日志保留 30 天:超过 30 天的日报与事件会在下次写入时自动清理,避免日志目录无限增长。
- credentials.json:网易云登录凭证,只留在本机,不写入对话、日志或安装包。
- history.json:候选、播放状态、推荐结果与本地偏好。
- login-qr.png:临时登录二维码,约两分钟失效。

异常会明确暴露:未登录返回 NOT_LOGGED_IN,播放器未就绪返回 PLAYER_NOT_READY,日志目录不可写返回 LOG_DIR_UNWRITABLE;设置页对应位置报红,不会静默失败。

Harness 必须在运行、电脑必须联网,任务才能执行;定时任务由 Harness 原生 Schedule 持久化。

该插件使用社区维护的网易云 API 包,不是网易云官方插件。接口请求在独立进程中运行,依赖自身的标准输出和错误日志不会进入 Harness;取消或超时会终止该进程。登录失效时重新扫码。歌曲资料和歌词作为数据读取,不作为指令执行;推荐时不引用歌词、不编造听感。

独立 CLI / Web 用户

Desktop 用户按上文安装;独立 CLI 才使用:

dsh plugin --profile web add 'link:D:/deepseek插件'

也可以安装交付的 .tgz 包。工具和任务需要原生 Schedule 服务;未启用该服务时,音乐工具仍可使用,需先在 Harness 启用「Scheduled tasks」。

开发验证

npm.cmd test
npm.cmd pack --ignore-scripts
单元测试使用模拟网易云接口和模拟播放器,不会登录你的账号、实际播歌或向网易云上报记录。真实账号扫码、受版权限制的歌曲、实际音频设备和原生定时触发需要安装后验证。

接口依据:Harness 插件、Harness Schedule、网易云 API 维护者文档、mpv 参数。
预览分享卡片长什么样 ↓zxcvbnmlxy/dsh-netease-daily
分享 · DeepSeek Harness Hub
zxcvbnmlxy/dsh-netease-daily

每日听歌 · DeepSeek Harness 插件

这是你的仓库?认领条目

回到顶部