QQ音乐API爬取全过程

article/2025/3/4 22:05:06

QQ音乐API爬取全过程

1. 前序:

在以前的QQ音乐的API爬取中,是非常容易的,采用的是jsonp的请求方式,但现在QQ音乐请求已经全部改成XHR的ajax的方式发送请求,所以要爬取QQ音乐的数据就需要破解QQ音乐发送请求的参数。

2. 对于前端:

在前端发送XHR请求的话会有请求端跨域限制,所以对于前端不能直接发送XHR请求到QQ音乐后端,而是要自己另外搭一个服务器,用我们的服务器去向QQ音乐发送请求。

3. QQ音乐接口分析:

以获取QQ音乐的焦点图为例。
在这里插入图片描述
这是我们要爬取的图片。在浏览器中按F12,然后查看network的xhr请求,可以看到。
QQ音乐是从这里拿到的数据,所以对于这个接口分析。
Request Header:
在这里插入图片描述
在这个请求的header中,是有服务端referer和origin限制的,所以为了骗过QQ音乐的服务器,我们在我们后台发的请求的header中也要把origin和referer设置成和QQ音乐一样。
Query String Parameters:
在这里插入图片描述
可以看到QQ音乐的params中是有’-'和sign签名的,我们要拿到这个数据,首先就是要这两个的加密的获取方式,而在其他中,实际上都是一些静态数据,直接复制上去就好了。

4. ‘-’和Sign的获取

要知道怎么获取’-‘或者sign就必须知道这两个加密是怎么产生的,所以在浏览器的控制台中按ctrl+shift+f。
首先我们搜索recom,在’-'中recom是一个不变的量。
在ctrl+shift+f搜索到的文件中,先把它格式化,然后按ctrl+f就可以在文件中搜索我们要的数据。
在这里插入图片描述
在这里插入图片描述
在这个请求中我们可以看到recom的获取是通过。

'recom' + (Math.random() + '').replace('0.', '')

这么一个方法。所以我们这个加在请求中就可以了。
然后是sign的获取,sign的获取会些许麻烦。
在这里插入图片描述
用相同的方法,我们可以看到sign是从一个getSecuritySign获取的,然后这个方法使用通过一个js文件获取,链接挂在下面。

'地址y.qq.com/component/m/qmfe-security-sign/index.umd.js?max_age=2592000'

先把这个js格式化之后,可以大概的看一下这个js文件。
在这里插入图片描述
可以看到,封装了一个__sign_hash_20200305的function。
所以我们把这个js复制下来,放到自己的文件当中,然后自己写一个方法去获取这个sign的值,然后把这个方法导出去。

export default function getSecuritySign(data) {let str = 'abcdefghijklmnopqrstuvwxyz0123456789'let count = Math.floor(Math.random() * 7 + 10)let sign = 'zza'for (let i = 0; i < count; i++) {sign += str[Math.floor(Math.random() * 36)]}sign += window.__sign_hash_20200305('CJBPACrRuNy7' + JSON.stringify(data))return sign
}

这个data,就是我们在前面分析的Query String Parameters中的data数据。

5.代码实现

既然加密的数据我们都有自己的获取方式了,我们就可以写请求来获取数据了。
笔者是是用vue-cli加上webpack打包写的,所以我前端的代码是封装了一个js文件,然后后端使用nodejs写在webpack.dev.config.js的before(app)中。
前端:

export function getRecommendAndDicsList () {const url = '/api/getTopBanner'let dataValue = {'comm': { 'ct': 24 },'category': { 'method': 'get_hot_category', 'param': { 'qq': '' }, 'module': 'music.web_category_svr' },'recomPlaylist': {'method': 'get_hot_recommend','param': { 'async': 1, 'cmd': 2 },'module': 'playlist.HotRecommendServer'},'playlist': {'method': 'get_playlist_by_category','param': { 'id': 8, 'curPage': 1, 'size': 40, 'order': 5, 'titleid': 8 },'module': 'playlist.PlayListPlazaServer'},'new_song': { 'module': 'newsong.NewSongServer', 'method': 'get_new_song_info', 'param': { 'type': 5 } },'new_album': {'module': 'newalbum.NewAlbumServer','method': 'get_new_album_info','param': { 'area': 1, 'sin': 0, 'num': 10 }},'new_album_tag': { 'module': 'newalbum.NewAlbumServer', 'method': 'get_new_album_area', 'param': {} },'toplist': { 'module': 'musicToplist.ToplistInfoServer', 'method': 'GetAll', 'param': {} },'focus': { 'module': 'music.musicHall.MusicHallPlatform', 'method': 'GetFocus', 'param': {} }}let sign = getSecuritySign(dataValue)const data = Object.assign({}, commonParams, {'-': 'recom' + (Math.random() + '').replace('0.', ''),platform: 'yqq.json',loginUin: 0,hostUin: 0,sign: sign,needNewCode: 0,inCharset: 'utf8',format: 'json',data: dataValue})return axios.get(url, {params: data}).then((res) => {return Promise.resolve(res.data)})
}

在这里是请求我们后端的一个/api/getTopBanner的接口。我们把需要的数据封装到请求的params中,然后在服务端,我们可以通过query来拿到需要的数据。
在build/webpack.dev.config.js中写我们的nodejs代码

app.get('/api/getTopBanner', function (req, res) {const url = 'https://u.y.qq.com/cgi-bin/musics.fcg'axios.get(url, {headers: {referer: 'https://y.qq.com/',origin: 'https://y.qq.com'},params: req.query}).then((response) => {response = response.datalet category = response.category.data.category[0].itemslet dicsList = response.recomPlaylist.data.v_hotlet content = response.focus.data && response.focus.data.shelf.v_niche[0].v_cardlet toplist = response.toplist.data.groupif (dicsList.length > 10) {let newDicsList = []for (let i = 0; i < 10; i++) {newDicsList[i] = dicsList[i]}dicsList = newDicsList}let newCategory = []let randomNumList = []while (newCategory.length < 4) {let randomNum = Math.floor(Math.random() * 16)if (randomNumList.indexOf(randomNum) > -1) {continue}randomNumList.push(randomNum)newCategory.push(category[randomNum])}category = newCategoryres.json({code: 0,data: {slider: content,dicsList: dicsList,category: category,toplist: toplist}})}).catch((e) => {console.log(e)})})

在这里我们会拿到所需要的数据然后用res.json返回json数据给前端了。
然后我们打印一下拿到的数据
在这里插入图片描述
这就是爬取QQ音乐的全过程了!
from Tyreal


http://chatgpt.dhexx.cn/article/Qmrqcbm7.shtml

相关文章

QQ音乐API分析之-加密参数分析(sign计算)

QQ音乐API加密参数分析 1、背景2、QQ音乐sign计算3、Java代码实现4、总结 1、背景 不知道什么时候开始&#xff0c;各家音乐APP都开始对API进行加密&#xff0c;最近一段时间对六大音乐平台的加密算法进行了研究&#xff0c;逆向了网页端、安卓端等等&#xff0c;已经掌握了各…

微信小程序使用QQ音乐API完整实例

微信小程序使用QQ音乐API完整实例 一、QQ音乐常用API接口&#xff1a;1.1、音乐搜索接口&#xff1a;1.2、最新音乐排行榜top1001.3. 随机推荐 二、请求数据格式&#xff08;以搜索为例&#xff09;三、播放链接&#xff08;重点&#xff09;3.1、获取歌曲信息3.2 获取token3.3…

音乐播放器之QQ音乐最新api,亲测可用

大家好&#xff0c;前段时间重写了自己的音乐播放器&#xff0c;源码放在github上&#xff0c;源码地址和项目地址下面都有&#xff0c;如果喜欢记得star一下哈。 由于之前给大家分享的api虽然可以用&#xff0c;但是版本太旧了&#xff0c;很多也没有了歌词&#xff0c;今天博…

步数精灵v3.0运动安卓版

软件介绍: 一键修改微信运动、支付宝运动的步数&#xff0c;让你在家足不出户也能走几万步&#xff0c;天天霸占好友排行榜首位&#xff01; 软件预览图&#xff1a; 软件版本号&#xff1a;3.0 软件是否收费&#xff1a;免费软件/共享软件 运行环境&#xff1a;安卓 软件…

艾出行广告精灵挂机源码+对接码支付即时到账+充值系统+推广下级系统+封装app

简介&#xff1a; 安装说明&#xff1a;请使用win系统 apache php5.6 mysql5.6 进行安装。 1、上传到网站根目录 2、用phpMyadmin导入数据库文件.sql 3、修改数据库链接文件 /APP/Conf/config.php &#xff08;记得不要用记事本修改&#xff0c;否则可能会出现验证码显示不了问…

支付平台架构:终端安全技术实现

前蚂蚁集团宣布即将IPO之后&#xff0c;9月11日晚间&#xff0c;以金融支付起家的京东数科也要上市了。近年来&#xff0c;第三方支付业务的资金规模不断扩大&#xff0c;支付业务量稳步增长&#xff0c;“第三方支付”及“移动支付”已成为年度搜索热词&#xff0c;支付平台作…

键盘精灵_键盘

键盘精灵 They folks over at DasKeyboard loaned me a reviewers copy of their totally blank keyboard about three weeks ago and Ive been typing on it since. 大约在三周前&#xff0c; DasKeyboard的同事们借给了我审阅他们完全空白的键盘的副本&#xff0c;此后我一直…

Telink ble mesh天猫精灵应用

文章目录 1 前言2 完美对接天猫精灵平台2.1 创建新产品2.1.1 添加产品类型2.1.2 添加产品信息2.1.3 添加产品功能 2.2 设置人机交互2.2.1 设置控制口令2.2.2 添加产品展示图2.2.3 添加配网指导2.2.4 添加升级指导2.2.5 添加控制面板 2.3 选择品牌模组2.4 下载并保管好三元组2.5…

[超详细] 2021支付宝集五福【攻略】来了-附自动化脚本

一年一度的支付宝集五福在2月1号的凌晨开始了&#xff0c;虽然一年比一年瓜分的少&#xff0c;但不知不觉集福卡成了过年最佳的消遣娱乐方式了。活动从2月1日开始至1月11日结束。 扫下面这个福字&#xff0c;必得沾福卡&#xff01; 零、额外福利 额外福卡二维码扫福器下载地址…

小程序图标-精灵图

文章来源&#xff1a;刘俊涛的博客 欢迎关注&#xff0c;有问题一起学习欢迎留言、评论。

python调用按键精灵插件_【按键精灵】三分钟教你实现自动解决各种验证码

金猪脚本(原飞猪脚本)以按键精灵教学为主,涉及UiBot&#xff0c;Python,Lua等脚本编程语言,教学包括全自动办公脚本,游戏辅助脚本,引流脚本,网页脚本,安卓脚本,IOS脚本,注册脚本,点赞脚本,阅读脚本以及网赚脚本等各个领域。想制作脚本和学习按键精灵的朋友可以添加按键精灵学习…

python调用按键精灵插件_【按键精灵教程】此帖在手,打码不愁

金猪脚本(原飞猪脚本)以按键精灵教学为主,涉及UiBot&#xff0c;Python,Lua等脚本编程语言,教学包括全自动办公脚本,游戏辅助脚本,引流脚本,网页脚本,安卓脚本,IOS脚本,注册脚本,点赞脚本,阅读脚本以及网赚脚本等各个领域。想制作脚本和学习按键精灵的朋友可以添加按键精灵学习…

python调用按键精灵插件_按键精灵教程打码平台接入

金猪脚本(原飞猪脚本)以按键精灵教学为主,涉及UiBot&#xff0c;Python,Lua等脚本编程语言,教学包括全自动办公脚本,游戏辅助脚本,引流脚本,网页脚本,安卓脚本,IOS脚本,注册脚本,点赞脚本,阅读脚本以及网赚脚本等各个领域。想制作脚本和学习按键精灵的朋友可以添加按键精灵学习…

手机端APP调起支付宝客户端支付!!!!

需要商户登录支付宝后台&#xff0c;在“账户中心-密钥管理”下配置MAPI网关产品密钥&#xff0c;用支付宝官方提供的openssl-1.0.2m工具生成一对私钥和公钥&#xff0c;把公钥配置上去就可以了。不清楚的也可以咨询支付宝的在线客服技术人员&#xff0c;很好的客服 赋代码&am…

支付宝蚂蚁森林php自动,auto.js蚂蚁森林智能脚本使用方法分享 支付宝蚂蚁森林自动辅助...

auto.js蚂蚁森林智能脚本使用方法分享 支付宝蚂蚁森林自动辅助 这个项目是 github上的一个开源项目&#xff0c;作者应该是 SuperMonster &#xff0c;此人在52也有ID 不管怎么说是一个长期维护的开源项目&#xff0c;安全性 跟可用性完全不用担心了 重点就是你玩不玩蚂蚁森林了…

按键精灵初接触

初衷 当目前想模拟人工操作的时候&#xff0c;而且不想去操作底层协议去攻破各大系统漏洞&#xff0c;还想自动化的操作&#xff0c;加流量&#xff0c;加粉丝&#xff0c;加关注&#xff0c;自动挂机等等。解放双手&#xff0c;按键精灵就是你需要的。 目前按键精灵类似软件…

MacOS 按键精灵推荐

前段时间本人被反复枯燥的工作折磨&#xff0c;后突发奇想使用按键精灵。 按键精灵是一款功能强大的自动化操作工具&#xff0c;可以用来完成一系列重复性的操作&#xff0c;比如键盘快捷键的模拟、文本自动输入、鼠标操作的模拟等等&#xff0c;可以大大提高工作效率。 工具…

支付宝集五福攻略

新年到了&#xff0c;支付宝又开启了一年一度的集五福活动 &#xff08;说实话一般情况下得不到多少钱&#xff09;&#xff0c;主要还是图个喜庆&#xff0c;图个高兴。下面小编为你奉上集五福攻略。 AR扫福这张图片大概率可以获得沾沾卡 第二是支付宝分别搜&#xff1a;滴滴…

1.3 JavaScript 输入与输出

1.3 JavaScript 输入与输出 输入 从HTML与用户的交互中输入信息&#xff0c;例如通过input、textarea等标签获取用户的键盘输入&#xff0c;通过click、hover等事件获取用户的鼠标输入。通过Ajax与WebSocket从服务器端获取输入标准输入&#xff0c;参考AcWing 1. A B let fs…

js控制文本框只能输入数字 及 常用字符对应ASCII码值

方法一: < INPUT TYPE =text NAME =text onkeypress ="a()" > < script language =javascript > ... function a()...{ var k = window.event.keyCode;if ( (k > 47 && k < 58) ||