为了确保您的开发体验,建议您使用Apifox浏览器插件或客户端进行调试。
注意: 此端点实际为 WebSocket 协议( ws://),在 OpenAPI 中以 GET 方式描述。导入 Apifox 后请手动修改接口类型为 WebSocket。
统一事件格式: 所有 WebSocket 和 SSE 推送的消息均使用 {"type": "事件名", "player": "播放器名", "data": 载荷}格式。
无数据时data为{}(空对象)。例外:all_lyrics在平台未返回歌词时仍是完整对象——lyrics为空数组、count为 0,而title/duration照常有值。
下游客户端统一按msg.type分发,msg.player识别来源,msg.data读取载荷即可。
初始化行为: 若连入时存在活跃播放器,会按顺序补发该播放器当前缓存的 status_update→song_info_update→all_lyrics→lyric_update。只补发缓存中已存在的类型——某类型尚无缓存数据时,该条不发送(并非发一条data:{})。若连入时当前没有活跃播放器,则只收到一个player_clear初始事件。
status_update - 状态更新{"type":"status_update","player":"wesing","data":{"status":"playing","detail":"晚风 - 陈婧霏"}}{"type":"status_update","player":"wesing","data":{}}"waiting_process" - 播放器进程未启动"waiting_song" - 播放器已启动但未选择歌曲"loading" - 保留值:当前版本各播放器均不产出此状态(wesing 的 loading 发送已停用,其余四家不产生),下游可不为它单独处理"playing" - 播放中,detail 为歌曲标题。拼接顺序按播放器而异(wesing / cloudmusicv3 / qqmusic 为 歌曲名 - 歌手,kugou / sodamusic 为 歌手 - 歌曲名),详见 SongInfo.title"paused" - 暂停中,detail 为歌曲标题。同时会收到一条 playback_pause 事件"standby" - 待机状态。detail 按播放器而异:cloudmusicv3 为 "网易云音乐已退出" 或 "网易云音乐 v<版本号> 不支持(需 v3+)"(后者表示进程仍在运行、仅版本过低,该状态每 30 秒重发一次且不去重,版本号为实际读到的值);qqmusic 为 "QQ音乐已退出";wesing 为 "K歌客户端已退出";kugou 为 "酷狗音乐 CDP 已断开";sodamusic 为 "汽水音乐 CDP 已断开"。kugou 例外:切歌瞬间还会多发一条 standby、detail 是新歌标题,约 200 毫秒后即被 song_info_update 覆盖——这是当前实现的缺陷、不属契约,下游不应据此进入待机界面,可用 detail 是否匹配上述固定文案来区分"error" - 故障终态,仅 kugou 会产生:"未找到酷狗安装,已停止" / "酷狗 libcef.dll 版本不受支持,已停止" / "未取得管理员权限,已停止自动修复"。detail 为具体原因,此后该播放器停止自动修复、不再变更状态song_info_update - 歌曲信息更新{"type":"song_info_update","player":"wesing","data":{"name":"晚风","singer":"陈婧霏","title":"晚风 - 陈婧霏","cover":"http://imgcache.qq.com/music/photo/mid_album_800/r/k/003JA09X2m9xrk.jpg","cover_base64":"data:image/jpeg;base64,/9j/4AAQSkZJRg..."}}{"type":"song_info_update","player":"wesing","data":{}}cover_base64 的 song_info_update(仅含 cover URL),待封面下载完成后再补发一条含 cover_base64 的完整版本。前端应使用最新收到的数据覆盖即可。lyric_update - 实时歌词更新{"type":"lyric_update","player":"wesing","data":{"index":1,"text":"往事就像流星刹那划过心房","sub_text":"","timestamp":31.483,"play_time":31.282999,"position":31.282999,"progress":0.105743244,"text_detailed":{}}}{"type":"lyric_update","player":"wesing","data":{}}all_lyrics - 完整歌词列表{"type":"all_lyrics","player":"wesing","data":{"title":"都是夜归人 - 许美静","duration":296,"position":1.75,"progress":0.0059121624,"count":38,"lyrics":[{"index":0,"timestamp":25.44,"play_time":25.24,"text":"是冰冻的时分 已过夜深的夜晚","sub_text":"","text_detailed":{}},{"index":1,"timestamp":31.483,"play_time":31.282999,"text":"往事就像流星刹那划过心房","sub_text":"","text_detailed":{}},{"index":2,"timestamp":37.716,"play_time":37.516,"text":"灰暗的深夜 是寂寞的世界","sub_text":"","text_detailed":{}}],"lyrics_detailed":[]}}(lyrics 已裁剪至 3 行,实际 38 行){"type":"all_lyrics","player":"wesing","data":{}}lyric_idle - 歌词空闲通知lyric_idle,接这四家的下游不应等待它。{"type":"lyric_idle","player":"wesing","data":{}}data 始终为 {}。前端可自行决定是否响应。playback_pause - 暂停播放data.position 为暂停时刻的整曲播放位置(秒),data.progress 为对应进度:{"type":"playback_pause","player":"wesing","data":{"position":31.282999,"progress":0.105743244}}playback_resume - 恢复播放 / 跳转position 发生非连续跳变时发送,两种情形都会触发:从暂停中恢复播放;以及 seek / 拖动进度条。position 是跳转后的新位置,可能小于上一次的值。playback_pause 成对出现,实际收到的 playback_resume 通常多于 playback_pause。{"type":"playback_resume","player":"wesing","data":{"position":37.516,"progress":0.1268581}}playback_pause 应停止时间插值,收到 playback_resume 应以 position 为锚点重新开始插值。player_switch - 播放器切换(仅根订阅者收到)/ws)会收到此事件:{"type":"player_switch","player":"cloudmusicv3","data":{"from":"wesing","to":"cloudmusicv3"}}player 字段为切换后的新播放器from - 切换前的播放器标识名to - 切换后的播放器标识名(为空字符串 "" 时表示活跃播放器已清除,无播放器输出)/wesing/ws)不会收到此事件to 非空时,紧随其后会收到新播放器的已缓存状态事件(status_update + song_info_update + all_lyrics + lyric_update 中已有的部分)player_clear - 活跃播放器清除(仅根订阅者收到){"type":"player_clear","player":"","data":{}}player_switch(to="") 一起发送(双重通知,向后兼容)player_switch)/wesing/ws)不会收到此事件lyrics / lyrics_detailed 内容以 ... 略去):(客户端连入根端点 /ws,当前没有活跃播放器)
← {"type":"player_clear","player":"","data":{}}
(wesing 开始播放,触发从「无活跃播放器」到 wesing 的切换)
← {"type":"player_switch","player":"wesing","data":{"from":"","to":"wesing"}}
← {"type":"status_update","player":"wesing","data":{"status":"playing","detail":"晚风 - 陈婧霏"}}
← {"type":"song_info_update","player":"wesing","data":{"name":"晚风","singer":"陈婧霏","title":"晚风 - 陈婧霏","cover":"http://imgcache.qq.com/music/photo/mid_album_800/r/k/003JA09X2m9xrk.jpg","cover_base64":""}}
← {"type":"all_lyrics","player":"wesing","data":{"title":"晚风 - 陈婧霏","duration":176,"position":0,"progress":0,"count":34,"lyrics":[...],"lyrics_detailed":[]}}
(封面异步下载完成,补发第二条 song_info_update,此时 cover_base64 有值)
← {"type":"song_info_update","player":"wesing","data":{"name":"晚风","singer":"陈婧霏","title":"晚风 - 陈婧霏","cover":"http://imgcache.qq.com/music/photo/mid_album_800/r/k/003JA09X2m9xrk.jpg","cover_base64":"data:image/jpeg;base64,..."}}
(随播放进度逐行推送 lyric_update,格式见 /lyric_update 端点)
(用户暂停 / 恢复;resume 也可由拖动进度条触发)
← {"type":"playback_pause","player":"wesing","data":{"position":32.2,"progress":0.105743244}}
← {"type":"playback_resume","player":"wesing","data":{"position":32.25,"progress":0.1268581}}
(wesing 歌曲播放结束 / 切歌 / 窗口关闭——lyric_idle 仅 wesing 发送)
← {"type":"lyric_idle","player":"wesing","data":{}}
(K歌客户端退出)
← {"type":"status_update","player":"wesing","data":{"status":"standby","detail":"K歌客户端已退出"}}