寻找数据

打开F12中的网络页面,播放音乐后,筛选媒体,会发现当前这首歌曲音频链接地址,打开后,点击“标头”就能能看到请求URL
在这里插入图片描述
截取“.mp3”前面的一部分进行搜索,搜索出来了很多数据包,但都是重复的,其实只有两个。一个就是我们已经找到的音频链接,另一个就是网易云音乐的接口文件
在这里插入图片描述
打开这个“v1”数据包,在标头可以看到他的请求URL,在负载
可以看到有两个表单数据分别是paramsencSecKey
在这里插入图片描述
在这里插入图片描述
在预览页面中,可以看到请求的返回值,是一个JSON格式的数据,而我们要的音乐链接就是url所对应的值
在这里插入图片描述

代码实现

有了上面这些请求数据,我们可以用代码来向网易云音乐发送请求,然后下载歌曲到本地。其中,headers里的cookie需要在标头中的“请求标头”中复制,这里我就不展示我的cookie了。代码模拟浏览器给网易云音乐发送请求,获取到一个json数据,从中找到所需要的url,接着向这个url发送请求进一步获取二进制的音频内容,然后以二进制写入的方式打开文件,把音乐保存到了本地。

import requestsheaders = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0","referer":"https://music.163.com/","cookie":your_cookie
}
def download_music():url = "https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token=528a132e63865dc4c681934d2a7bb31f"data = {"params":"sZ3h9aF5g8SsP4JiHaXuJqi4E+V+aP/ut4FZfUkzOi0bJbr2N7/PvLx3xTcrAeu05Bcb+LG2c77NKfZ01ShNSMYBd8iVxGggg2QFkM8Enes/2kqHwYziVSFB0dHl3NgY2SSBadA2UwJrt28eDXNDsiIATRORvGkCCFmXDEJXCb83sqJWJixEB2sE57L2jZ5oesC9Dsv1mHczuPyC7+OZYw==","encSecKey":"16c8e6d77d5831c34d374bf7c4c9fbf1993cdd0145eb9dcf2eeca8cdf037edda15c0f58c36c60b3765ee7087d6df32e3cf37976e0fe4bc4dfd4e4acf06e45e73317d8b9d4f27941076c5bf334f5456f687854797e2966a14a2fe0bc27592dc5a5553d6ad8339b4fd0e9094726d8633c06f2fdf16a0f90b94103ce79dab78c5f7"}response = requests.post(url=url,data=data,headers=headers)json_data = response.json()music_url = json_data["data"][0]["url"]music_content = requests.get(url=music_url,headers=headers).content# 向音频链接发起请求,获取二进制的音频内容with open(f"music.mp3","wb") as f:# 以二进制写入的方式打开文件,写入音频内容f.write(music_content)print("下载成功")
download_music()

逆向解密

上面的代码是我们在已知paramencSecKey这两个数据的情况下实现下载音频文件。通过尝试下载其他歌曲也不难看出,只要提供正确的paramencSecKey我们就能下载到所对应的音乐了。而这两个值到底从何而来呢?
在搜索框中搜索"encSecKey",我们找到了一个JS文件
在这里插入图片描述
点击后在响应面板中右键,在源面板中打开
在这里插入图片描述
在源代码页面进行搜索,找到了一段代码
在这里插入图片描述

var bVz9q = window.asrsea(JSON.stringify(i9b), bsC6w(["流泪", "强"]), bsC6w(BA5F.md), bsC6w(["爱心", "女孩", "惊恐", "大笑"]));
e9f.data = j9a.cr0x({params: bVz9q.encText,encSecKey: bVz9q.encSecKey
})

从这个代码可以看出,我们要找的paramsencSecKey来自于一个名为bVz9q的对象中。而他又来自于一个window.asrsea的函数。
给这行代码打上断点,鼠标悬停在asrsea上。
在这里插入图片描述
我们直接定位到了这个函数所在的地方,点击蓝色下划线的文字跳转
在这里插入图片描述
跳转到了一个名为d的函数,原来这个window.asrsea就是d
函数d中需要传入四个参数分别是a,b,c,d,而在刚刚调用部分的代码中,我们可以看到他传入的四个参数分别为

  • JSON.stringify(i9b)
  • bsC6w([“流泪”, “强”])
  • bsC6w(BA5F.md)
  • bsC6w([“爱心”, “女孩”, “惊恐”, “大笑”])
    其中,在控制台输入后面四个参数,我们得到的都是如下的定值
    在这里插入图片描述
    而第一个参数中的i9b比较特殊,通过断点调试发现这是一个变化的值。网易云音乐的所有接口都会经过这一行代码,而在播放音乐后我们找到了一个i9b的值如下图
    在这里插入图片描述
    这个值就是在调用音频接口时候的值,不难看出,这个i9b中的编号就是歌曲网址中最后的那一串数字。至于csrf_token,这其实是一个固定值,他就是请求URL最后的那串东西。这么一来问题就迎刃而解了。
    我们只要有歌曲的id就能得到i9b,然后把JSON.stringify(i9b)和其余三个参数传入到asrsea获得加密的数据——paramsencSecKey然后作为负载发送请求给网易云音乐,就能下载到歌曲了。
    在这个js代码中,把相应加密的代码复制下来到本地的js文件。
    最后我们定义如下函数方便通过python中的execjs模块调用。
function json_encode(i9b){return JSON.stringify(i9b);
}

完整的js文件太大了就不展示了。

批量下载

现在已经可以实现通过歌曲id下载到对应的歌曲了,而如果想实现批量下载也非常简单。只要获取到歌单的url然后发送请求,通过re正则表达式提取出页面中的歌曲超链接中的歌曲id,然后分别下载这些歌曲id对应的音频文件就行了。

完整代码

下面附上完整的代码

import requests
import execjs
import reheaders = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0","referer":"https://music.163.com/","cookie":your_cookie
}
def download_music(music_id,music_name):# 编译js代码js_code = execjs.compile(open("爬网易云/网易.js",encoding = 'utf-8').read())#加密参数i9b = {"ids": '', "level": 'exhigh', "encodeType": 'aac', "csrf_token": '528a132e63865dc4c681934d2a7bb31f'}i9b['ids'] = f"[{music_id}]"# 调用解密函数e = '010001';f = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7';g = '0CoJUm6Qyw8W8jud';i9b = js_code.call("json_encode",i9b)rdata = js_code.call("asrsea", i9b,e,f,g)url = "https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token=528a132e63865dc4c681934d2a7bb31f"data = {"params":rdata["encText"],"encSecKey":rdata["encSecKey"]}response = requests.post(url=url,data=data,headers=headers)json_data = response.json()music_url = json_data["data"][0]["url"]music_content = requests.get(url=music_url,headers=headers).content# 向音频链接发起请求,获取二进制的音频内容with open(f"爬网易云/music/{music_name}.mp3","wb") as f:# 以二进制写入的方式打开文件,写入音频内容f.write(music_content)def get_info_list(list_id):list_url = f"https://music.163.com/playlist?id={list_id}"response = requests.get(url=list_url,headers=headers)html = response.text# <a href="/song?id=1360122230">花月</a>info = re.findall('<a href="/song\?id=(\d+)">(.*?)</a>',html)info_list = [[music_id,music_name] for music_id,music_name in info]return info_listdef get_song_name(music_id):url = f"https://music.163.com/song?id={music_id}"response = requests.get(url=url,headers=headers)html = response.text# <em class="f-ff2">花月</em>name = re.findall('<em class="f-ff2">(.*?)</em>',html)[0]return namemode = input("选择爬取模式:\n 1.单曲下载 \n 2.批量下载\n")if __name__ == '__main__':if mode == "1":music_id = input("请输入歌曲ID:")music_name = get_song_name(music_id)download_music(music_id,music_name)print(f"《{music_name}》下载完成")elif mode == "2":list_id = input("请输入歌单ID:")info_list = get_info_list(list_id)for music_id,music_name in info_list:download_music(music_id,music_name)print(f"《{music_name}》下载完成")print("批量下载完成")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89913.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89913.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/89913.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CppCon 2018 学习:Fancy Pointers for Fun and Profit

“Fancy Pointers for Fun and Profit” 这个标题听起来像是在讨论**“高级指针用法”**&#xff0c;尤其是在C里&#xff0c;如何利用智能指针、定制指针类型&#xff0c;或者其他高级指针技巧来写更安全、更高效、更优雅的代码。 可能的理解和内容方向&#xff1a; 1. 什么是…

思辨场域丨数字信号技术重塑农林牧渔:从“靠天吃饭”到“靠数吃饭”

凌晨三点&#xff0c;山东莱芜的养猪户老李被手机震动惊醒。屏幕显示&#xff1a;3号猪舍&#xff0c;母猪即将分娩。他轻点屏幕启动远程监控&#xff0c;翻身继续入睡——而在几年前&#xff0c;这样的夜晚他只能在猪圈里守着。 清晨的茶园里&#xff0c;兴业县的茶农王大姐掏…

文心大模型及百度大模型内容安全平台齐获信通院大模型安全认证

近日&#xff0c;文心大模型与百度大模型内容安全平台——红线大模型双双荣获中国信息通信研究院泰尔认证中心颁发的“大规模预训练模型&#xff08;文本生成功能&#xff09;安全认证证书”&#xff0c;且二者的认证级别皆“增强级”的最高级别。 大规模预训练模型&#xff08…

香港服务器查询缓存禁用-性能优化关键技术解析

在香港服务器运维过程中&#xff0c;查询缓存禁用是提升数据库性能的关键操作。本文将深入解析禁用查询缓存的原理、操作步骤、适用场景及注意事项&#xff0c;帮助管理员优化MySQL服务器配置&#xff0c;解决高并发环境下的性能瓶颈问题。香港服务器查询缓存禁用-性能优化关键…

深度学习图像分类数据集—七种动物识别分类

该数据集为图像分类数据集&#xff0c;适用于ResNet、VGG等卷积神经网络&#xff0c;SENet、CBAM等注意力机制相关算法&#xff0c;Vision Transformer等Transformer相关算法。 数据集信息介绍&#xff1a;七种动物识别分类&#xff1a;[Chinese_Merganser, panda, Sika_Deer, …

ubuntu22桌面版中文输入法 fcitx5

不要去 ubuntu software 下载 fcitx5 快捷键用不了 直接 sudo apt install fcitx5 \ fcitx5-chinese-addons \ fcitx5-frontend-gtk4 fcitx5-frontend-gtk3 fcitx5-frontend-gtk2 \ fcitx5-frontend-qt5不要在fcitx5里面设置快捷键&#xff0c;有些应用可能无法生效 在设置里全…

推客系统小程序终极指南:从0到1构建自动裂变增长引擎,实现业绩10倍增长!

&#x1f4cc; 前言&#xff1a;为什么传统营销越来越难做&#xff1f;在流量红利消失的今天&#xff0c;企业普遍面临三大增长困境&#xff1a;获客成本飙升&#xff1a;电商、教育等行业单客成本突破500元&#xff0c;ROI持续走低用户粘性差&#xff1a;90%的活动用户只参与一…

【数据结构】排序算法:归并与堆

归并排序&#xff1a;分治策略的经典实现 算法原理 归并排序采用分治法策略&#xff0c;包含三个关键步骤&#xff1a; 分解&#xff1a;递归地将数组分成两半 解决&#xff1a;对子数组进行排序 合并&#xff1a;将两个有序子数组合并为一个有序数组 C语言实现 #includ…

机器学习-CatBoost

参考书籍&#xff1a;《机器学习-公式推导和代码实现》 官方文档提供的原生接口代码参考书籍的P187&#xff5e;P188 简介 全称是Categorical Boosting&#xff0c;由俄罗斯搜索引擎巨头Yandex于2017年提出。突出的优势是在于可以高效地处理数据中的类别特征 ML中对类别特征…

MPLS 多协议标签交换

前言&#xff1a; 多协议标签交换MPLS&#xff08;Multiprotocol Label Switching&#xff09;是一种IP&#xff08;Internet Protocol&#xff09;骨干网技术。MPLS在无连接的IP网络上引入面向连接的标签交换概念&#xff0c;将第三层路由技术和第二层交换技术相结合&#xf…

CTF Web PHP弱类型比较与布尔值判断

题目源码与注释 <?php show_source("index.php"); // 显示自身源码&#xff0c;方便分析 include("flag.php"); // 包含flag变量 $a $_GET[a]; // 获取GET参数a&#xff0c;抑制报错// 关键判断 if($a 0 and $a){echo $flag; …

AntV G6动态连线

完整代码如下 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>AntV G6 动态连线</titl…

puppeteerSharp html转pdf

部属到linux 上报错&#xff1a; Failed to launch browser! /wwwroots/xxx/Chrome/Linux-138.0.7204.92/chrome-linux64/chrome: error while loading shared libraries: libatk-1.0.so.0: cannot open shared object file: No such file or directory 问题服务包缺少依赖&…

springBoot接口层时间参数JSON序列化问题,兼容处理

背景&#xff1a;解决前端传入时间参数格式不固定场景&#xff0c;避免接收参数报错时间格式不能序列化。一、概述在 Java 后端开发中&#xff0c;处理 JSON 数据时&#xff0c;经常需要对日期时间字段进行反序列化。Java 中常用的日期时间类型是 java.time.LocalDateTime&…

List、Set、Map三者之间的关系

1、数据结构与核心特性接口数据结构顺序性唯一性键值对null 元素List动态数组/链表有序&#xff08;插入顺序&#xff09;允许重复否允许多个 nullSet哈希表 / 红黑树无序&#xff08;HashSet&#xff09;有序&#xff08;LinkedHashSet/TreeSet&#xff09;不允许重复否仅 Has…

进程控制----进程终止

一、进程终止的核心场景正常终止&#xff08;代码完整运行完毕&#xff09;成功&#xff1a;进程执行到main函数结束或调用exit()&#xff0c;返回退出码 0&#xff08;约定为执行成功&#xff09;。失败&#xff1a;代码执行完毕但结果异常&#xff0c;返回非零退出码&#xf…

Milvus docker-compose 部署

文章目录 前言Milvus docker-compose 部署1. 下载2. 修改配置3. 启动4. 测试 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的…

EveryThing搜索具体路径下文件中的内容

1.打开EveryThing 2.点击搜索&#xff0c;选择高级搜索 3.选择需要搜索的文件的路径以及文件中需要包含的内容 4.之后就可以搜索到对应的目标文件

【算法】宽度优先遍历BFS

二叉树的宽搜 429、N叉树的层序遍历 题解 BFS核心思想 二叉树的宽搜一般都是借助队列来实现的&#xff0c;实现的原理为首先将根节点进行放入队列中&#xff0c;然后将根节点进行弹出的时候&#xff0c;将这个节点的孩子节点进行放入队列中&#xff0c;然后继续弹出队头的元…

【STM32】通用定时器基本原理

STM32 通用定时器基本原理&#xff08;基于 STM32F1&#xff09;参考资料&#xff1a;STM32F1xx官方资料&#xff1a;《STM32中文参考手册V10》-第14章通用定时器STM32 定时器分类 STM32F103 系列共有三类定时器&#xff1a;&#x1f50e; 通用定时器&#xff08;TIM2~TIM5&…