logo_MG

重构了网易云解析工具

2025年3月28日
#tool·

在去年十月, 我因为想要把网易云的歌曲全部下载到手机上用本地播放器听歌, 就一直在找解析工具, 但是发现很多解析工具都只有单曲解, 这就比较麻烦了, 歌单里面几十上百首歌总不能我一首一首去下吧, 就寻思自己写一个批量下载.

最开始我是使用苏晓倩的网易云api, 但是我发现她这个只有单曲解析, 那就尴尬了, 但是想到之前有个很大型的网易云api项目, 翻了一下让我找到获取歌单所有歌曲的api. 那就好办了, 直接通过歌单id获取到所有歌曲的id再批量下载就好了, 原理就这么简单.


因为当时还没学nuxt, 所以我用了一个比较麻烦的方案, 直接把两个api项目部署到服务器上, 然后写一个vue应用去使用api实现批量下载.

这个方案的弊端也比较明显, 有些难维护, 因为我发现总是出现下载失败的问题, 而且问题大部分是服务器的锅, 例如不知道什么原因pm2托管的服务掉了, 或者nginx报错了.

而且因为苏晓倩的api是使用python编写的, 我也不会python, 想自己加一些功能比较麻烦.

终于, 前两天我实在受不了了, 就用nuxt直接重构, 顺便玩玩新学的typescripttailwind css.

我真的太喜欢了nuxt了, 直接可以把前后端写在一个项目中, 启动一次就好了, 之前写需要前后端的项目的时候, 每次都得手动启动两个项目, 非常不健康. 而且nuxt还有自动导入, 不需要我每次都写import


说实话要感谢科技的发展, 接口的转移大部分靠ai直接帮我从python翻译成typescript, 如果没有ai我得花更多的时间去理解那些我从来没学过的代码.

其实这些接口实际上是对网易云的接口进行了二次封装, 因为网易云的接口返回的数据很多很杂, 当然, 这并不意味着我们就需要大费心思去写后端, 直接用pinia去处理就好了.

实际上我对接口二次封装的原因是因为获取歌曲下载链接getSongUrl.get接口需要使用黑胶会员的cookie, 如果我直接在前端使用cookie获取, 会有泄漏的风险, 这明显不安全, 所以我写了个后端, 保证cookie不会在前端泄漏.


接下来按照解析流程来说说接口代码吧.

首先用户输入完url点击获取按钮后就会调用getPlaylist.get.js这个接口, 接口接受一个id, 既歌单id.

https://music.163.com/api/v6/playlist/detail这个接口发起请求, 获取歌单的信息, 因为这个接口能够获取到的单曲只有前十首有详细信息, 剩下的只有单曲idresult.playlist.trackIds.

所以我们需要另外一个接口去获取所有单曲.

这件事比较简单粗暴, 前端直接使用上一个接口返回的单曲id去向getSongInfo.get接口逐个获取, 这个接口会返回一些歌曲名, 作者专辑信息.

现在就可以开始下载需要的歌曲了, 我们需要下载歌曲本体歌词封面.

当按下下载时, 前端创建一个zip对象用于保存下载的文件, 然后下载getSongInfo.get接口返回的封面, 再向getSongLyric.get & getSongUrl.get接口发起请求, 获取歌词和下载链接, 下载完这三样直接打包下载.

就这样, 一首需要vip的歌就这样下载完成了.

我觉得比较抽象, 我弄这个玩意的本意就是想白嫖, 并且避免网易云的版权问题, 结果还是开了个会员去用这个接口, 有点本末倒置了.

Copyright ©2025.sooooooooooooooooootheby