创建音乐下载器-代码实现

VIP音乐下载,播放

在我们听歌的时候,总是被各种会员的限制,导致无法听到完整的音乐。当然有的人单单喜欢通过软件去听歌,这里面有很多优质评论可以看。但是当我们想下载一首歌的时候,不是会员就没有办法实现了。在这里给大家介绍一下如何通过python来实现软件vip音乐的下载。。

一、分析网址

(1)搜索音乐网址分析

如下,我们以检索“周深”为例:通过Fetch/XHR找到网址为http://www.xxxx.cn/api/www/search/searchMusicBykeyWord?key=%E5%91%A8%E6%B7%B1&pn=1&rn=20&httpsStatus=1&reqId=8d9c7880-b12d-11ed-ae17-a1e6fcda1289,这里key后面写的就是搜索的名称,pn代表页数,rn代表每页显示的音乐条数。后面的可以不考虑,最后分析搜索的网址为http://www.xxxx.cn/api/www/search/searchMusicBykeyWord?key={}&pn={}&rn=20
在这里插入图片描述

(2)音乐的源址

点击播放一首歌曲,然后点击network->media,可以查看播放歌曲的源码,如下:
源码地址为:https://ls-sycdn.xxxx.cn/44e4a52eb5fc53900864a5d0620fa57c/63f38b19/resource/n3/32/21/2372595038.mp3
在这里插入图片描述
记住这个源码的格式,Ctrl+F去寻找这个源码,发现在PlayUrl这个地址中包含了这个源码从而确定信息交互时采用的地址。
在这里插入图片描述
这个地址为:http://www.xxxx.cn/api/v1/www/music/playUrl?mid=261942443&type=music&httpsStatus=1&reqId=4b9b5111-b130-11ed-8a64-c94e3438e075。通过分析这个地址,我们可以得出这个网址中的关键字段mid,如果获取到它,他们所有音乐的源码地址我们都将可以获取到,从而实现VIP音乐的下载。
在这里插入图片描述

二、代码分析

(1)伪造用户登录界面

很多网站都是带有反爬机制,当你使用自动化一直访问一个网址,那么他就会检测出来,并做出相应处理,因此我们通过带用户表示去访问一个网址。
首先分析头headers,通过上述我们搜索界面进行分析。
在这里插入图片描述
因此在这里构建一个请求头:
User-Agent:表示浏览器的版本信息。当服务器收到浏览器的这个请求后,会经过一系列处理,返回一个数据包给浏览器,而响应头里就会描述这个数据包的基本信息。
Host:请求的主机地址
Referer:表示当前页面是通过此来源页面里的链接进入的。
Cookie:很多和用户相关的信息都存在 Cookie 里,用户在向服务器发送请求数据时会带上。
csrf':跨站点请求伪造信息

header = {'User-Agent': 'Chrome/107.0.0.0 Safari/537.36',
          'Host': 'www.xxxx.cn',
          'Referer': 'http://www.xxxx.cn/search/list?key=%E5%91%A8%E6%9D%B0%E4%BC%A6',
          'Cookie': '_ga=GA1.2.759282231.1676731363; _gid=GA1.2.81167573.1676731363; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1676731361,1676778763; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1676786566; kw_token=Q3XXTYYVGYK',
          'csrf': 'Q3XXTYYVGYK'
          }
(2)返回检索音乐信息

综上分析的检索音乐网址,构造代码如下:

import requests
import re
import urllib

# 1.伪装浏览器构造
# User-Agent:
header = {'User-Agent': 'Chrome/107.0.0.0 Safari/537.36',
          'Host': 'www.xxxx.cn',
          'Referer': 'http://www.xxxx.cn/search/list?key=%E5%91%A8%E6%9D%B0%E4%BC%A6',
          'Cookie': '_ga=GA1.2.759282231.1676731363; _gid=GA1.2.81167573.1676731363; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1676731361,1676778763; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1676786566; kw_token=Q3XXTYYVGYK',
          'csrf': 'Q3XXTYYVGYK'
          }
key = '邓紫棋'
page = 1
# 1.向接口发送请求,从获取json数据中获取音乐id(rid)/歌曲名字/歌手  key:搜索歌手名字、page:爬取的第几页
url = 'http://www.xxxx.cn/api/www/search/searchMusicBykeyWord?key={}&pn={}&rn=1'.format(str(key), str(page))
# 将请求的数据转为json格式,方便我们通过字典的形式提取数据。
music_data = requests.get(url, headers=header).json()
print(music_data)

执行结果为,里面包含了检索到的歌曲信息:

D:\WorkPlace\venv\Scripts\python.exe D:\WorkPlace\Music\kuwo_test.py 
{'code': 200, 'curTime': 1676907553761, 'data': {'total': '305', 'list': [{'musicrid': 'MUSIC_39515638', 'barrage': '0', 'artist': 'G.E.M.邓紫棋', 'mvpayinfo': {'play': '0', 'vid': '7593309', 'download': '0'}, 'pic': 'https://img4.kuwo.cn/star/albumcover/120/36/57/1029628864.jpg', 'isstar': 0, 'rid': 39515638, 'duration': 219, 'score100': '95', 'content_type': '0', 'track': 0, 'hasLossless': False, 'hasmv': 1, 'album': '上古情歌 电视剧原声带', 'albumid': '3668654', 'pay': '16515324', 'artistid': 5371, 'albumpic': 'https://img4.kuwo.cn/star/albumcover/120/36/57/1029628864.jpg', 'originalsongtype': 1, 'songTimeMinutes': '03:39', 'isListenFee': False, 'pic120': 'https://img4.kuwo.cn/star/albumcover/120/36/57/1029628864.jpg', 'name': '桃花诺-《上古情歌》电视剧片尾曲', 'online': 1, 'payInfo': {'nplay': '001111', 'play': '1100', 'overseas_nplay': '001111', 'local_encrypt': '1', 'limitfree': '0', 'refrain_start': '73975', 'feeType': {'song': '1', 'album': '0', 'vip': '1', 'bookvip': '0'}, 'ndown': '111111', 'download': '1111', 'cannotDownload': '0', 'overseas_ndown': '111111', 'cannotOnlinePlay': '0', 'listen_fragment': '0', 'refrain_end': '101975', 'tips_intercept': '0'}}]}, 'msg': 'success', 'profileId': 'site', 'reqId': '6452deca1f87b5dc8689d526d9af39e5', 'tId': ''}

Process finished with exit code 0
(3)提取mid,歌曲名称,歌手名称

我们的主要是提取mid值也就是上面获取的vid值,同时获取歌曲名称以及歌手来协助我们进行音乐的存储。代码如下,歌曲遍历:

for id in music_data['data']['list']:
    rid = id['rid']
    singer = id['artist']
    song_name = id['name']
    print(rid, singer, song_name)

执行结果为:

D:\WorkPlace\venv\Scripts\python.exe D:\WorkPlace\Music\xxxx_test.py 
39515638 G.E.M.邓紫棋 桃花诺-《上古情歌》电视剧片尾曲

Process finished with exit code 0
(4)根据获取到的mid值,套入分析过的地址中获取音乐源码网址
    base_url = 'https://www.xxxx.cn/api/v1/www/music/playUrl?mid={}&type=convert_url'.format(str(rid))
    response = requests.get(base_url, headers=header).json()
    print(response)

此时执行结果为,包括歌曲源码地址https://nn01-sycdn.xxxx.cn/dc9b8e825e5c8f1896cf005de164492d/63f3961f/resource/n3/22/32/2480823959.mp3,这样我们就可以进行下一步音乐下载了:

D:\WorkPlace\venv\Scripts\python.exe D:\WorkPlace\Music\xxxx_test.py 
{'code': 200, 'msg': 'success', 'reqId': '1fe4ff0c0c6e3aa8ba0a2766d0de77a6', 'tId': '', 'data': {'url': 'https://nn01-sycdn.xxxx.cn/dc9b8e825e5c8f1896cf005de164492d/63f3961f/resource/n3/22/32/2480823959.mp3'}, 'profileId': 'site', 'curTime': 1676908063429, 'success': True}

Process finished with exit code 0
(5)在下载之前,我们首先对获取到的歌手名称及歌曲名称格式进行一个处理,以免保存失败。
        #提取源码
        song_url = response['data']['url']
        # 对音乐播放地址再次发送请求获取二进制内容数据
        song_content = requests.get(song_url).content
        # 将歌名或者作者名当中的奇怪符号去掉,防止保存
        singer1 = re.sub('[\\/:?*<>"|]', '', singer)
        song_name1 = re.sub('[\\/:?*<>"|]', '', song_name)
(6)处理后,编写下载语句urllib

urllib.request.urlretrieve:URL 中的网络资源拷贝到本地(网址,拷贝到本地地址)

    try:
        print('正在下载', song_name)
        urllib.request.urlretrieve(song_url, './网易歌单/%s.mp3' % song_name)
        print('下载成功....')
    except:
        pass

三、完整代码

代码
import requests
import re
import urllib

# 1.伪装浏览器构造
# User-Agent:
header = {'User-Agent': 'Chrome/107.0.0.0 Safari/537.36',
          'Host': 'www.xxxx.cn',
          'Referer': 'http://www.xxxx.cn/search/list?key=%E5%91%A8%E6%9D%B0%E4%BC%A6',
          'Cookie': '_ga=GA1.2.759282231.1676731363; _gid=GA1.2.81167573.1676731363; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1676731361,1676778763; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1676786566; kw_token=Q3XXTYYVGYK',
          'csrf': 'Q3XXTYYVGYK'
          }
key = '邓紫棋'
page = 1
# 1.向接口发送请求,从获取json数据中获取音乐id(rid)/歌曲名字/歌手  key:搜索歌手名字、page:爬取的第几页
url = 'http://www.xxxx.cn/api/www/search/searchMusicBykeyWord?key={}&pn={}&rn=5'.format(str(key), str(page))
# 将请求的数据转为json格式
music_data = requests.get(url, headers=header).json()
for id in music_data['data']['list']:
    rid = id['rid']
    singer = id['artist']
    song_name = id['name']
    # 根据音乐id拼接音乐地址,发送请求返回json并获取音乐播放地址
    base_url = 'https://www.xxxx.cn/api/v1/www/music/playUrl?mid={}&type=convert_url'.format(str(rid))
    response = requests.get(base_url, headers=header).json()
    song_url = response['data']['url']
    # 对音乐播放地址再次发送请求获取二进制内容数据
    song_content = requests.get(song_url).content
    # 将歌名或者作者名当中的奇怪符号去掉,防止保存
    singer1 = re.sub('[\\/:?*<>"|]', '', singer)
    song_name1 = re.sub('[\\/:?*<>"|]', '', song_name)
    try:
        print('正在下载', song_name)
        urllib.request.urlretrieve(song_url, './歌单/%s.mp3' % song_name)
        print('下载成功....')
    except:
        pass
执行测试

测试结果:

D:\WorkPlace\venv\Scripts\python.exe D:\WorkPlace\Music\xxxx_test.py 
正在下载 桃花诺-《上古情歌》电视剧片尾曲
下载成功....
正在下载 倒数-好好的爱你
下载成功....
正在下载 多远都要在一起
下载成功....
正在下载 喜欢你
下载成功....
正在下载 泡沫
下载成功....

Process finished with exit code 0

在这里插入图片描述
可以点击播放。

总结

之前一直在搞网易云歌曲,但是网易云反爬设置很强,导致一直不能实现VIP歌曲的下载,我在这里可以把普通歌曲下载的方式放在这里,如果有小伙伴搞定也分享一下给我。谢谢!下一节,我们创建一个下载音乐的小工具,做到真正的学以致用。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: de2-115是一款FPGA开发板,它可以用于设计和实现各种数字电路和嵌入式系统。要在de2-115上实现弹球游戏,需要以下步骤: 1. 设计游戏逻辑:首先,需要设计游戏的逻辑,包括弹球的运动方向,碰撞检测,得分逻辑等。可以使用硬件描述语言(如VHDL或Verilog)来描述游戏逻辑。 2. 编写硬件描述语言代码:将游戏逻辑转换为硬件描述语言代码,并对其进行编写。使用硬件描述语言可以将游戏逻辑转化为可在FPGA上实现的电路。 3. 进行仿真和验证:在将代码加载到FPGA之前,可以使用仿真工具对其进行验证。仿真工具可以模拟游戏逻辑的行为,并验证其正确性。 4. 系统集成:将已验证的代码加载到de2-115开发板上的FPGA中。这可以通过将代码编译成可以在开发板上运行的位流文件来实现。 5. 连接输入输出设备:弹球游戏需要接收玩家的输入操作(如移动弹板),并将游戏画面显示在显示屏上。可以通过连接外设(如键盘和显示)来实现输入和输出功能。 6. 调试和优化:在加载代码到FPGA之后,可能会发现一些问题或需要进一步优化。可以使用调试工具对游戏进行调试,并根据需要进行优化,以提高性能或改进游戏体验。 综上所述,通过以上步骤可以在de2-115上实现弹球游戏。这个过程需要有一定的硬件设计和编程知识,以及对FPGA开发板的理解和使用能力。 ### 回答2: de2-115是一款常用于FPGA(现场可编程门阵列)系统设计的开发板。要实现FPGA弹球游戏,我们可以用de2-115开发板上的FPGA芯片来实现游戏的逻辑和控制。 在实现弹球游戏的过程中,首先需要使用硬件描述语言(如VHDL或Verilog)编写游戏的逻辑代码。这些代码会定义游戏的规则,控制球的移动,检测碰撞和计算分数等功能。 我们可以利用de2-115开发板上的输入输出接口,连接输入的按钮或开关来控制游戏的开始、暂停、继续和重新开始等功能。同时,我们可以使用板上的LED灯来显示游戏的分数或其他重要信息。 为了让玩家能够看到游戏画面,我们可以使用开发板上的VGA接口连接一个显示。通过编写逻辑代码,我们可以将游戏画面绘制在显示上,并且实时更新球的位置和移动情况。 此外,我们还可以利用板上的音频接口,给游戏增加声音效果。例如,当球和挡板碰撞时,可以播放一个撞击声音,或者在游戏结束时播放一段胜利或失败的音乐。 最后,在实现完成后,我们可以通过将逻辑代码下载到de2-115开发板的FPGA芯片中,运行游戏并进行测试。如果需要的话,我们还可以进行调试和优化,以达到更好的游戏性能和用户体验。 总结来说,利用de2-115开发板上的FPGA芯片和各种输入输出接口,我们可以很方便地实现弹球游戏,包括游戏逻辑、控制、显示和音效等功能。 ### 回答3: de2-115实现FPGA弹球游戏可以按照以下步骤进行: 1. 首先,在DE2-115 FPGA开发板上进行设计,我们需要使用Quartus Prime软件来创建我们的项目。 2. 在Quartus Prime中,我们需要使用硬件描述语言(HDL)来编写我们的游戏逻辑。可以使用Verilog或VHDL进行编程。 3. 游戏的主要组成部分是球和挡板。我们需要为球和挡板设计相应的模块。 4. 对于球模块,我们需要定义球的位置、速度和移动方向。我们可以使用计时来控制球的移动,并在碰撞检测时改变球的方向。 5. 对于挡板模块,我们需要定义挡板的位置、大小和移动方式。我们可以使用开发板上的按钮或开关来控制挡板的移动,以阻止球的移动。 6. 在游戏的主模块中,我们需要将球和挡板模块相互连接,并在FPGA开发板的显示上显示游戏画面。我们可以使用VGA接口来连接显示,并使用适当的时钟信号来控制帧率。 7. 在游戏的逻辑中,我们需要实现碰撞检测和分数计算等功能。当球碰到挡板时,分数会增加,并且球的方向会改变。 8. 最后,我们需要将设计好的游戏逻辑编译并烧录到FPGA开发板上,以实现游戏的运行。 通过以上步骤,我们可以在DE2-115 FPGA开发板上成功实现一个基于硬件描述语言的弹球游戏。这样的设计不仅可以提高我们对FPGA开发的理解,还可以帮助我们熟悉使用Quartus Prime软件进行FPGA开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值