网易云音乐和QQ音乐歌单去重

1.写在前面

较早之前博主听音乐场景如下:主要在网易云音乐听歌,辅助QQ音乐听周董的歌。

之后网易云我喜欢的歌曲一首首变灰,博主心想QQ音乐版权比网易云多,然后把歌单导入QQ音乐了,网易云基本处于闲置状态,偶尔听听日推。这时网易云我喜欢歌单800多首,QQ音乐我喜欢歌单1100多首。

1100确实有点多了,在听歌过程中,我把不太喜欢的和听腻了的一点点取消喜欢,目前剩600多首(还会继续精简)。由于导入QQ音乐的时候,QQ音乐有的没版权导入不全,所以网易云我喜欢歌单里还夹杂着QQ音乐没有的歌曲(其中包括很多我已经不喜欢听的歌曲),所以也一直没能把网易云我喜欢歌单无脑全部删除。然后网易云日推听多了之后,新添的我喜欢歌曲越来越多,后来出来的心动模式也挺好用(心动模式只能在我喜欢歌单里使用)。

网易云新添的歌越来越多,就不好每次听歌都用顺序播放;而且QQ音乐好多正听着的歌突然就灰了,但是网易云有版权,所以我萌生出删除网易云里在QQ音乐存在的歌曲,网易云用来听一些小众和QQ音乐突然就灰了的歌。一个800多首,一个600多首,人工筛选根本不可能,所以得靠技术。

所以我先咨询大哥iMSW此路是否可行,大哥iMSW表示此路可行,并对我给予肯定和很多帮助。

关于Api接口方面,来自于Binaryify开发者 https://github.com/Binaryify/NeteaseCloudMusicApi

这个是对应的使用文档 https://binaryify.github.io/NeteaseCloudMusicApi/#/

这是博主在使用Binaryify提供的Api支持,写的网易云音乐和QQ音乐歌单去重项目 https://github.com/Weikido/NeteaseCloudMusicApi

既然已经有可用的Api,可以根据歌曲id进行取消喜欢,满足我的需求需要以下步骤:

​ 1.获取网易云我喜欢歌曲id及对应歌名和QQ音乐我喜欢歌曲歌名

​ 2.获取QQ音乐我喜欢歌单里包含的网易云我喜欢歌曲id

​ 3.根据获取的歌曲id进行取消喜欢

2.获取网易云我喜欢歌曲id及对应歌名和QQ音乐我喜欢歌曲歌名

2.1网页获取我喜欢歌曲id及对应歌名

正愁怎样才能获得网易云我喜欢歌曲id及对应歌名,这篇帖子如天神下凡给了我很大帮助。https://blog.51cto.com/xianhuan/5110240?b=totalstatistic

获取html文件后,用VS Code的html格式化插件把html格式化,由于我俩目的不同,不仅仅需要歌曲歌名,更重要的是歌曲id,所以下一步要获取我喜欢歌曲id及对应歌名。

2.2处理我喜欢歌曲id及对应歌名

对应的get_html_info.py文件在 https://github.com/Weikido/NeteaseCloudMusicApi/blob/master/dislike_ncm_likesong/get_csv/get_html_info.py

例子:根据每首歌所对应的唯一 <a href="/song?id=1467971656">唯一 <b title="想在夏日撞见你">,获取我喜欢列表歌曲的id和对应歌名,获取ncmlike_list.csv

3.获取QQ音乐我喜欢歌单里包含的网易云我喜欢歌曲id

根据这篇帖子可以获取QQ音乐我喜欢歌单id https://blog.csdn.net/acmzw/article/details/123121259

然后到 https://yyrcd.com/n2s/ 获取QQ音乐我喜欢歌单里的歌曲歌名。

将获取的QQ音乐我喜欢歌单里的歌曲歌名写入qqlike_list.csv

获取QQ音乐我喜欢歌单里包含的网易云我喜欢歌曲id

对应的ncm_song_id.py文件在 https://github.com/Weikido/NeteaseCloudMusicApi/blob/master/dislike_ncm_likesong/get_csv/ncm_song_id.py

获取delete_song_norepeat.csv

4.根据获取的歌曲id进行取消喜欢

4.1Api接口和cookie 处理

4.1.1Api接口处理

由于博主对Api接口方面不是很懂,算鼓捣肯定要浪费时间,所以Api接口封装和Api接口测试文件是由大哥iMSW来完成的,分别为:

ncm_api.py

ncm_fuc.py

test.py

为了方便调用接口,在原/public/index.html基础新增:账号登录(网页方式)、账号登录(接口方式)、获取喜欢歌曲列表(接口方式)

具体代码在 https://github.com/Weikido/NeteaseCloudMusicApi/blob/master/public/index.html

1
2
3
4
5
6
<h2>功能:</h2>
<ul>
<li><a href="./login.html" target="_blank">账号登录(网页方式)</a></li>
<li><a href="./login/cellphone?phone=xxxxx&password=xxxxx" target="_blank">账号登录(接口方式)</a></li> // 这里填手机号和密码
<li><a href="./likelist?uid=xxxxx" target="_blank">获取喜欢歌曲列表(接口方式)</a></li> // 这里填用户id
</ul>

4.1.2cookie 处理

因为是跨域请求,根据Api使用手册,所以需要手动传入 cookie ,其他处理方法移步 https://binaryify.github.io/NeteaseCloudMusicApi/#/id=%e8%b0%83%e7%94%a8%e5%89%8d%e9%a1%bb%e7%9f%a5

获取cookie步骤

如上图,在登录成功界面,右键进入Network,点击Copy as cURL(bash)复制获取cookie,然后去 https://curlconverter.com/#python

粘贴后,获取cookie,替换如下部分。

1
2
3
4
5
6
7
8
# 因为是跨域请求,直接手动传入 cookie,否则会因为没带上 cookie 导致 301, 具体例子可看 public/test.html, 访问http://localhost:3000/test.html(默认端口的话) 例子使用 jQuery 和 axios
# 具体获得cookie方法见README.MD
cookies = {
'__remember_me': 'true',
'NMTID': '00OccQZINTn3z5vn0gcihEZCqr_TzoAAAGAZhwNCA',
'MUSIC_U': '154c4268bee57a34afa84b741fb17aa60f50b79ae78fdcd71f021f958c43528e993166e004087dd3cbf09c25dba672dda842e7a8e3dc18aafd57581773fb0e339bb192f7a7cc78eea89fe7c55eac81f3',
'__csrf': '2ccaa0c4950c9fb3048234f1018c97fa',
}

4.2根据歌曲id取消喜欢

最后根据delete_song_norepeat.csv内的歌曲id进行取消喜欢。

对应的dislikeFuc.py文件在 https://github.com/Weikido/NeteaseCloudMusicApi/blob/master/dislike_ncm_likesong/_my_fuc/dislikeFuc.py

读取delete_song_id.csv文件 获取歌曲id并取消喜欢

5.总结

运行程序前博主网易云我喜欢歌单共844首歌,获取需要删除的歌曲id 447个,运行完成后剩397首。

建议前期运行时,可以10首,20首试运行。

由于频繁取消喜欢会触发系统风控,导致运行失败,所以正式运行也建议30首,50首运行。

本意就是写个小程序满足自己的需求,且博主技术有限,所以代码很粗糙。