提前声明

  • 仅作为个人学习使用,任何版权问题作者概不负责
  • 本文的语言不会且不可能很严谨
  • 博客园的编辑器有点BUG把我搞晕头了,所以本文可能有点鬼畜

前情

不知道各位有几个是对国内大厂的软件设计很满意的?

至少我是几乎受不了的。

所以我就没装过网易云的Windows端……

这段时间用着网页也受不了了。

于是我就想:既然我几乎每次用网易云都是听收藏,那能不能……

直接用系统的!?

正片

首先,我需要把我收藏的音乐拿到手。

其次,我们需要把音乐下载下来,才能让一个长得漂亮,但是不咋聪明的系统播放器播放。

探索

收藏的问题麻烦了我很久,直到有一天,我注意到了某网易云第三方客户端……

我当时就想,它能显示收藏,为嘛我不行?

于是我就赶紧看了它的GitHub,作者也很好,直接提供了一整套API的来源。

于是我就把API部署到了Vercel,它也顺利地跑了起来

我是个乐于分享的人,所以在此直接送上现成的API地址和它的GitHub:

https://netease-cloud-music-cwl0bfvmk-totowang-hhh.vercel.app/
https://github.com/Binaryify/NeteaseCloudMusicApi

获取收藏歌单

登录

看收藏歌单前,我们要登录。

登陆是啥来着?一个界面,要输入账号密码……

那就自己写!

def loginui(event=''):
global up,e_usr,e_pwd,e_dir
up = tk.Tk()
up.title("配置") #第一行,用户名标签及输入框
tk.Label(up,text='邮箱').pack(fill=tk.X)
e_usr = ttk.Entry(up)
e_usr.pack(fill=tk.X)
tk.Label(up,text='密码').pack(fill=tk.X)
e_pwd = ttk.Entry(up,show='●')
e_pwd.pack(fill=tk.X) #第三行登陆按扭,command绑定事件
ttk.Button(up,text='一键下载网易云收藏',command=login).pack(side=tk.BOTTOM,fill=tk.X)
e_usr.bind('<KeyPress-Return>',lambda event:e_pwd.focus())
e_pwd.bind('<KeyPress-Return>',lambda event:login())
e_usr.focus() up.mainloop() def login():
global usr,pwd,path
usr=e_usr.get()
pwd=e_pwd.get()
path=filebox.askdirectory(title='请选择音乐保存路径')
up.destroy()

登录之后,电脑里存了啥来着?Cookie呀!

正好,我们的API也会返回Cookie。我们只需要在后面的请求中把Cookie硬塞到cookie参数里就可以了。

管他三七二十一,直接先把Cookie拿到手

res=requests.get(url="https://netease-cloud-music-cwl0bfvmk-totowang-hhh.vercel.app/login?email="+usr+"&password="+pwd)
json=res.json()
cookie=json['cookie']

你以为这就可以获取到收藏歌单了?不是不是,你可不知道为了获取一个收藏歌单网易云付出了多少……

众所周知,收藏的本质就是一个歌单,所以我们直接查看获取歌单所有音乐的API

说明 : 由于网易云接口限制,歌单详情只会提供 10 首歌,通过调用此接口,传入对应的歌单id,即可获得对应的所有歌曲

必选参数 : id : 歌单 id

可以看到,我们还要把id搞到手,所以我们应该先看看用户的歌单,这就去看文档

说明 : 登录后调用此接口 , 传入用户 id, 可以获取用户歌单

必选参数 : uid : 用户 id

这么说,我们还要用户的id(禁止套娃

那么这个id从哪来?

从“获取账号信息”来

说明 : 登录后调用此接口 ,可获取用户账号信息

接口地址 : /user/account

所以,我们只要再反着套娃回去,然后稍加亿点数据处理的细节,就可以得到收藏音乐的列表了。

获取UID

res=requests.get(url="https://netease-cloud-music-cwl0bfvmk-totowang-hhh.vercel.app/user/account?cookie="+str(cookie))
json=res.json()
uid=str(json['account']['id'])

获取用户歌单并截出收藏歌单的ID

res=requests.get(url="https://netease-cloud-music-cwl0bfvmk-totowang-hhh.vercel.app/user/playlist?limit=1&uid="+uid)
json=res.json()
favlstid=str(json['playlist'][0]['id'])

获取收藏歌单

res=requests.get(url="https://netease-cloud-music-cwl0bfvmk-totowang-hhh.vercel.app/playlist/track/all?id="+favlstid+"&cookie="+cookie)
json=res.json()

数据整理

获得了收藏歌单之后,我们可以看看里面的信息有多全,每首歌的名字、id、专辑、封面、歌手……几乎你能在网易云里看到的信息都已经全了,我们当然不会浪费对吧,要榨干:)

for song in json['songs']:
favlst.append(str(song['id']))
favnamelst.append(str(song['name']))
favallst.append(str(song['al']['name']))
favarlst.append([])
for ar in song['ar']:
favarlst[json['songs'].index(song)].append(ar['name'])

然后我们就把这些信息整理到了好几个列表里面……(虽然这么做用处不大

下载

所以……怎么下载呢?

直接用外链肯定是不行的,不然我可能只能下载里面的一丢丢,这可是我无法接受的

欸,我们的收藏歌单咋来的来着?

网易云API是个好东西!

这部分思路很简单,我们只需要遍历歌单id,然后把id作为参数,对获取播放直链的API进行GET请求,再拿到音乐直链,然后直接再GET一次进行下载,就搞定了。

这样,理论上来讲,只要是你能播放的,都能下载!

不对……要实现你能播放的都能下载,那我们还得带个Cookie啊!嘿嘿我真是天才!

以下是下载部分的完整代码:

for mid in favlst:
rpg('正在下载('+str(favlst.index(mid)+1)+'/'+str(len(favlst))+')',favnamelst[favlst.index(mid)],(favlst.index(mid)/len(favlst))*100)
if not os.path.exists(path+'/'+favnamelst[favlst.index(mid)]+".mp3"):#避免重复下载
res=requests.get(url="https://netease-cloud-music-cwl0bfvmk-totowang-hhh.vercel.app/song/url?id="+mid+"&br=320000"+'&cookie='+cookie)
json=res.json()
murl=json['data'][0]['url']
res=requests.get(url=murl)
m=res.content
f=open(path+'/'+favnamelst[favlst.index(mid)]+".mp3",'wb')
f.write(m)
f.close()

界面和其他细节

虽然我们的数据处理搞完了(希望我强行拆散的这些代码跑起来没问题

但是!你不感觉等着不耐烦吗?

所以,进度条得整上!

为了避免程序员对#FF0000”这个颜色过于敏感,我在进度显示窗口里显示常见错误类型,还贴心地选用了比较淡的红“FF9090”作为背景

(不会真有人信我的这套鬼话吧

另外,为了自己顺眼,我把动画也整上了。

不过由于这部分代码过于分散

Python下载网易云收藏的更多相关文章

  1. 如何下载网易云音乐APP里的MV和短视频?

    本人:网易云音乐死粉,朋友圈大多都用的是云音乐,因为推荐功能牛逼 然后:发现云音乐APP里越来越多吸引我的短视频,经常看到好的就想保存到相册,然后微信发给朋友 但是:不知道怎么下载网易云音乐的短视频, ...

  2. 使用python3下载网易云音乐歌单歌曲,附源代码

    """ 用selenium+PhantomJS配合,不需要进行逆向工程 python 3下的selenium不能默认安装,需要指定版本2.48.0 "" ...

  3. 下载网易云音乐的MV

    网易云音乐有很多经典视频, 但是苦于没有下载按钮...今天就记录下如何保存MV到本地, 又get一项新技能!!! 一. 安装360极速浏览器(非安利) 二. 打开网易云音乐客户端, 点击"等 ...

  4. python3爬虫-下载网易云音乐,评论

    # -*- coding: utf-8 -*- ''' 16位随机字符的字符串 参数一 获取歌曲下载地址 "{"ids":"[1361348080]" ...

  5. python3爬虫:下载网易云音乐排行榜

    #!/usr/bin/python3# -*- encoding:utf-8 -*- # 网易云音乐批量下载 import requestsimport urllib # 榜单歌曲批量下载# r = ...

  6. python下载网-易-公-开-课的视频

    import requests url='http://v.stu.126.net/mooc-video/nos/mp4/2016/03/19/1004187130_5b0f0056936d4f78a ...

  7. 下载网易云VIP音乐

    有偿帮助.联系方式在个人信息里.

  8. Python解密网易云音乐缓存文件获取MP3

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:GeneralMonkey Python解密网易云音乐缓存文件获取MP3 ...

  9. Python下opencv使用笔记(图像频域滤波与傅里叶变换)

    Python下opencv使用笔记(图像频域滤波与傅里叶变换) 转载一只程序喵 最后发布于2018-04-06 19:07:26 阅读数 1654  收藏 展开 本文转载自  https://blog ...

随机推荐

  1. web安全之自己写一个扫描器

    web安全之自己写一个扫描器 自己来写一个简单的目录扫描器,了解扫描器的运转机制和原理,因为python写脚本比较容易所以用python写一个网站目录扫描器. 第一步:我们需要导入所需要的库 1 im ...

  2. KMP算法学习以及小结(好马不吃回头草系列)

    首先请允许我对KMP算法的三位创始人Knuth,Morris,Pratt致敬,这三位优秀的算法科学家发明的这种匹配模式可以大大避免重复遍历的情况,从而使得字符串的匹配的速度更快,效率更高. 首先引入对 ...

  3. 『忘了再学』Shell基础 — 22、主要的环境变量配置文件说明

    目录 1.source命令 2.Linux系统中环境变量配置文件 (1)登录时生效的环境变量配置文件 (2)/etc/profile环境变量配置文件 (3)/etc/profile.d/*.sh环境变 ...

  4. HMS Core分析服务6.5.0版本更新啦

    卸载用户价值的合理评估对制定相应的用户召回策略具有重要意义. HMS Core分析服务新版本支持查看用户卸载前使用次数.崩溃次数等指标.通过这些数据,您可以更直观地判断已卸载人群粘性以及崩溃问题对用户 ...

  5. ElasticSearch7.3学习(三十)----ES7.X SQL新特性解析及使用Java api实现sql功能

    一.ES7 sql新特性 1.1 数据准备 创建索引及映射 建立价格.颜色.品牌.售卖日期 四个字段 PUT /tvs PUT /tvs/_mapping { "properties&quo ...

  6. BI 如何让SaaS产品具有 “安全感”和“敏锐感”(上)

    SaaS模式一经推出,凭借自身的高性价比.低维护成本,无需软硬件维护.无需运维等明晃晃的优点,得到了爆发式的增长,甚至全面改变了软件的开发模式.各位老总的问候语,不知从什么时候开始,都变成了:&quo ...

  7. 初步了解认识正则表达式(Regex)

    如果你感到这篇文章对您有所帮助,那请您给我一个免费的赞吧QWQ! 如果想要深入理解什么是正则表达式,请购买教材<形式语言与自动机>,相信学完它之后一定会让你更加理解正则表达式! 1.你的同 ...

  8. 云原生存储解决方案Rook-Ceph与Rainbond结合的实践

    基础不牢,地动山摇.无论是何种体系架构,底层存储的选择都是一个值得探讨的话题.存储承载着业务的数据,其性能直接影响到业务应用的实际表现.也正因为存储和业务的数据关联紧密,其可靠性也必须得到关注,存储的 ...

  9. Spire.Office激活

    更新记录: 2022年5月28日 初始代码便于复用 注意:最多支持到:E-ICEBLUE Spire.Office Platinum v6.10.3 引入命名空间: using Spire.Licen ...

  10. 从零开始实现lmax-Disruptor队列(三)多线程消费者WorkerPool原理解析

    MyDisruptor V3版本介绍 在v2版本的MyDisruptor实现多消费者.消费者组间依赖功能后.按照计划,v3版本的MyDisruptor需要支持多线程消费者的功能. 由于该文属于系列博客 ...