效果图

代码中用到了Crypto模块,Windows安装时会报错,① 建议选择对应解释器的版本搜索安装依赖.whl后缀的依赖包文件,找到之后直接pip install XXX.whl就可以了,在文章后面我提供了百度网盘连接,可以下载安装依赖、源码以及打包后的exe文件,我下载的是python3.6的依赖包,② window下安装pycryptodome模块也可以,pip install pycryptodome,但是由于这个模块暂时没有更新维护,安装了有时候无法使用,python3.6和python3.7已经亲测无法使用,③ Linux不需要考虑这个编译环境问题,可以直接安装Crypto即可

from copy import deepcopyimport requests, json, base64from binascii import hexlify
from Crypto.Cipher import AESfrom tkinter import *
from tkinter.filedialog import askdirectory
from urllib.request import urlretrieve
import osclass Encrypyed():'''传入歌曲的ID,加密生成'params'、'encSecKey 返回'''def __init__(self):self.pub_key = '010001'self.modulus = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7'self.nonce = '0CoJUm6Qyw8W8jud'def create_secret_key(self, size):return hexlify(os.urandom(size))[:16].decode('utf-8')def aes_encrypt(self, text, key):iv = '0102030405060708'pad = 16 - len(text) % 16text = text + pad * chr(pad)encryptor = AES.new(key, AES.MODE_CBC, iv)result = encryptor.encrypt(text)result_str = base64.b64encode(result).decode('utf-8')return result_strdef rsa_encrpt(self, text, pubKey, modulus):text = text[::-1]rs = pow(int(hexlify(text.encode('utf-8')), 16), int(pubKey, 16), int(modulus, 16))return format(rs, 'x').zfill(256)def work(self, ids, br=128000):text = {'ids': [ids], 'br': br, 'csrf_token': ''}text = json.dumps(text)i = self.create_secret_key(16)encText = self.aes_encrypt(text, self.nonce)encText = self.aes_encrypt(encText, i)encSecKey = self.rsa_encrpt(i, self.pub_key, self.modulus)data = {'params': encText, 'encSecKey': encSecKey}return datadef search(self, text):text = json.dumps(text)i = self.create_secret_key(16)encText = self.aes_encrypt(text, self.nonce)encText = self.aes_encrypt(encText, i)encSecKey = self.rsa_encrpt(i, self.pub_key, self.modulus)data = {'params': encText, 'encSecKey': encSecKey}return dataclass search():'''跟歌单直接下载的不同之处,1.就是headers的referer2.加密的text内容不一样!3.搜索的URL也是不一样的输入搜索内容,可以根据歌曲ID进行下载,大家可以看我根据跟单下载那章,自行组合'''def __init__(self):self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36','Host': 'music.163.com','Referer': 'http://music.163.com/search/'}  ###!!注意,搜索跟歌单的不同之处!!self.main_url = 'http://music.163.com/'self.session = requests.Session()self.session.headers = self.headersself.ep = Encrypyed()self.detail_list = []def search_song(self, search_content, search_type=1, limit=9):"""根据音乐名搜索:params search_content: 音乐名:params search_type: 不知:params limit: 返回结果数量return: 可以得到id 再进去歌曲具体的url"""url = 'http://music.163.com/weapi/cloudsearch/get/web?csrf_token='text = {'s': search_content, 'type': search_type, 'offset': 0, 'sub': 'false', 'limit': limit}data = self.ep.search(text)resp = self.session.post(url, data=data)result = resp.json()if result['result']['songCount'] <= 0:print('搜不到!!')else:songs = result['result']['songs']# 搜索到的所有歌曲信息(id,name,singer)detail_list = []i = 1for song in songs:song_id, song_name, singer, alia = song['id'], song['name'], song['ar'][0]['name'], song['al']['name']print(song_id, song_name, singer, alia)item = {}item['num'] = iitem['song_id'] = song_iditem['song_name'] = song_nameitem['author_name'] = singerdetail_list.append(item)i += 1# 将得到的歌曲详细信息初始化,方便后续调用self.detail_list += detail_list# def __str__(self):#     return str(self.detail_list)def song_load(new_detail_list, num):num = int(num)# GUI文本框输入的信息text.insert(END, '正在下载...')text.see(END)text.update()# 根据输入歌曲编号,在列表中取出对应的歌曲信息# 组装urlitem = new_detail_list[num - 1]song_id = item['song_id']song_name = item['song_name']singer = item['author_name']song_url = 'http://music.163.com/song/media/outer/url?id={}.mp3'.format(song_id)# 判断是否选择下载路径print(selects_path)if selects_path:# 拼接路径os.makedirs('{}/music_netease'.format(selects_path), exist_ok=True)path = '{}/music_netease/{}.mp3'.format(selects_path, song_name)else:os.makedirs('music_netease', exist_ok=True)path = 'music_netease/{}.mp3'.format(song_name)print(selects_path)# path = 'music_netease/{}.mp3'.format(song_name)# path = '{}/music_netease/{}.mp3'.format(select_path,song_name)print(path)# 下载路径显示text.insert(END, path)text.see(END)text.update()# 显示数据到文本框text.insert(END, '歌曲:{}, 歌手: {},正在下载...'.format(song_name, singer))text.see(END)text.update()urlretrieve(song_url, path)text.insert(END, '下载完毕: {},请试听!'.format(song_name))text.see(END)text.update()if __name__ == '__main__':selects_path = None# 搜索歌曲名字def get_music_name():# 获取输入框输入的歌曲名字name = entry.get()d = search()d.search_song(name)detail_list = d.detail_listglobal new_detail_listnew_detail_list = []for i in detail_list:new_detail_list.append(deepcopy(i))i.pop('song_id')text.insert(END, i)text.see(END)text.update()def load_song():# 获取下载歌曲编号num = entry1.get()# 下载歌曲song_load(new_detail_list, num)def select_path():def selectPath():path_ = askdirectory()# print(path_)path.set(path_)# print('*'*100)global selects_pathselects_path = path_print(path_)root1.destroy()return path_root1 = Tk()root1.geometry('+550+300')path = StringVar()Label(root1, text="目标路径:").grid(row=0, column=0)Entry(root1, textvariable=path).grid(row=0, column=1)Button(root1, text="路径选择", command=selectPath).grid(row=0, column=2)root1.mainloop()# 搭建界面# 创建界面root = Tk()# 添加标题root.title('网易云音乐')# 设置窗口大小 x 小写x连,不能用乘号 后面两位是x,y坐标,固定初始位置root.geometry('545x460+400+150')# 设置图形界面的大小锁定,禁止改变root.resizable(width=False, height=False)# 标签控件label = Label(root, text='请输入下载的歌曲:', font=('华文行楷', 20))# 标签定位 grid 网格式定位label.grid(row=0, column=0, sticky=W)  # 默认 row=0,column=0# 输入框entry = Entry(root, font=('隶书', 20))entry.grid(row=0, column=1, sticky=W)# command 点击触发方法  搜索歌曲button2 = Button(root, text='搜  索', font=('隶书', 15), command=get_music_name)# 定位 sticky 对齐方式 W E N S  东南西北button2.grid(row=1, column=1, sticky=E)# command 点击触发方法  文件保存路径选择button3 = Button(root, text='下载路径', font=('隶书', 15), command=select_path)# 定位 sticky 对齐方式 W E N S  东南西北button3.grid(row=1, column=0, sticky=W)# 列表框text = Listbox(root, font=('楷书', 12), width=68, heigh=18)# 定位 columnspan 组件横跨的列数text.grid(row=2, columnspan=2)label1 = Label(root, text='输入下载歌曲编号:', font=('华文行楷', 20))label1.grid(row=3, column=0)entry1 = Entry(root, font=('隶书', 20))entry1.grid(row=3, column=1, sticky=E)# 点击按钮button = Button(root, text='开始下载', font=('隶书', 15), command=load_song)# 定位 sticky 对齐方式 W E N S  东南西北button.grid(row=4, column=0, sticky=W)button1 = Button(root, text='退出程序', font=('隶书', 15), command=root.quit)button1.grid(row=4, column=1, sticky=E)# 显示界面root.mainloop()

一些细节问题请查看本人博客另外两篇关于网易云下载的文章

python网易云音乐下载打包exe文件,Windows可运行
python网易云音乐下载_GUI图形化界面

源码、安装依赖文件以及打包后的exe文件连接地址(永久有效)
https://pan.baidu.com/s/1OmND7lblnkxypIF4dTLy_Q

python网易云音乐下载,可选择歌曲,下载路径相关推荐

  1. python网易云音乐下载_GUI图形化界面

    效果展示 1,打包exe文件,window直接可以运行 2,输入歌曲名字可以直接下载 3,下载后的歌曲保存在netease.exe文件所在的同一个文件夹中,music_netease文件夹是程序自动创 ...

  2. python网易云音乐下载打包exe文件,Windows可运行

    下载原理: 通过官方的下载链接http://music.163.com/song/media/outer/url?id=歌曲id.mp3, 分析网页寻找歌曲id组装成song_url,urlretri ...

  3. Python 网易云音乐 MV 下载

    Python 网易云音乐 MV 下载 from selenium import webdriver from selenium.webdriver.common.by import By from s ...

  4. python爬虫爬取网易云音乐歌曲_如何用爬虫获取网易云音乐歌单中的歌曲?

    --------------------------------- 泻药,以我抓取了307835首网易云音乐的歌单歌曲的经验,讲一下这个问题. 喜欢用Github的可以直接看我的项目源码,代码简单.具 ...

  5. python爬网易云_如何用爬虫获取网易云音乐歌单中的歌曲?

    --------------------------------- 泻药,以我抓取了307835首网易云音乐的歌单歌曲的经验,讲一下这个问题. 喜欢用Github的可以直接看我的项目源码,代码简单.具 ...

  6. 解锁网易云音乐客户端变灰歌曲

    解锁网易云音乐客户端变灰歌曲 最近周杰伦出新歌了,可是最喜欢的网易云木有版权?为了听歌不得不安装多个音乐播放器?喜欢的歌还要收费开会员?这里安利一个超好用的方法,以上问题通通搞定!在分享之前首先分享原 ...

  7. 网易云音乐关键字搜索并生成下载url

    网易云音乐关键字搜索并生成下载url 一.获取搜索的歌单信息 ​ 通过在网易云音乐进行关键字搜索,并通过F12检测,发现网页给网站https://music.163.com/weapi/cloudse ...

  8. Python网易云音乐单曲爬取

    Python网易云音乐单曲爬取 代码: import requests import osdef develop(path,url):song_url = urlsong_id = song_url[ ...

  9. Windows解锁网易云音乐客户端变灰歌曲

    变灰歌曲不再有 Windows解锁网易云音乐客户端变灰歌曲 在开启前 我们先打开网易云音乐windows版配置代理服务器 然后返回下载github的项目的地址 解压 在根目录 打开cmd终端命令窗口 ...

最新文章

  1. ftp服务器 文件目录,如何列出ftp服务器上的目录中的文件?
  2. CSS实现文字环绕图片
  3. python平均工资-杭州Python开发平均工资高不高?
  4. Educational Codeforces Round 10 A. Gabriel and Caterpillar 模拟
  5. OpenCV跟踪支持的实例(附完整源代码)
  6. 06_NoSQL数据库之Redis数据库:Redis的高级应用之登录授权和主从复制
  7. Oracle 行列转换
  8. jquery实现的3D缩略图悬停效果
  9. python基础知识 os.path.join()
  10. linux 调优系列
  11. python random模块
  12. 中国磷矿市场趋势报告、技术动态创新及市场预测
  13. python中的位置怎么看_如何获得字符在Python中的位置?
  14. 高仿一元云购IOS应用源码项目
  15. Manjaro安装deb包
  16. Java游戏项目之黄金矿工
  17. 什么是等保?为什么要做等保?
  18. 《迅雷链精品课》第一课:认识区块链
  19. Scp全量远程拷贝(推送、拉取)
  20. 《动手实现一款简单的拦阻球游戏》

热门文章

  1. html值改变频率,频率赫兹与时间的关系 赫兹(Hz)和秒怎样转换?
  2. linux、centOS虚拟机出现entering emergency mode解决方案
  3. 下一代智能扫码报修系统介绍
  4. Pytorch加载模型并进行图像分类预测
  5. 02_搭建项目(servlet+java bean+jsp的商城教程)
  6. 艺术签名微信小程序源码/支持微信流量主
  7. sql float保留两位
  8. 十分钟设置android状态栏一体化开源工程推荐
  9. 数据结构实验课_实验四 队列
  10. 正则表达式提取html内容