某音乐平台歌曲信息逆向之参数寻找

news2024/12/29 10:20:29

如何逆向加密参数:某音乐平台歌曲信息逆向之webpack扣取-CSDN博客

参数构建

{
	"comm": {
		"cv": 4747474,
		"ct": 24,
		"format": "json",
		"inCharset": "utf-8",
		"outCharset": "utf-8",
		"notice": 0,
		"platform": "yqq.json",
		"needNewCode": 1,
		"uin": 0,
		"g_tk_new_20200303": 5381,
		"g_tk": 5381
	},
	"req_1": {
		"module": "vkey.GetVkeyServer",
		"method": "CgiGetVkey",
		"param": {
			"guid": "7146813132",
			"songmid": ["002dw4gv1ZmiGt"],
			"songtype": [0],
			"uin": "0",
			"loginflag": 1,
			"platform": "20"
		}
	},
	"req_2": {
		"module": "music.musicasset.SongFavRead",
		"method": "IsSongFanByMid",
		"param": {
			"v_songMid": ["002dw4gv1ZmiGt"]
		}
	},
	"req_3": {
		"module": "music.musichallSong.PlayLyricInfo",
		"method": "GetPlayLyricInfo",
		"param": {
			"songMID": "002dw4gv1ZmiGt",
			"songID": 372639235
		}
	},
	"req_4": {
		"method": "GetCommentCount",
		"module": "music.globalComment.GlobalCommentRead",
		"param": {
			"request_list": [{
				"biz_type": 1,
				"biz_id": "372639235",
				"biz_sub_type": 0
			}]
		}
	},
	"req_5": {
		"module": "music.musichallAlbum.AlbumInfoServer",
		"method": "GetAlbumDetail",
		"param": {
			"albumMid": "003QIVDT3UB8zG"
		}
	},
	"req_6": {
		"module": "vkey.GetVkeyServer",
		"method": "CgiGetVkey",
		"param": {
			"guid": "9868485411",
			"songmid": ["002dw4gv1ZmiGt"],
			"songtype": [0],
			"uin": "0",
			"loginflag": 1,
			"platform": "20"
		}
	}
}

分析参数

  • req_1 中参数  【guid】,【songmid】,
  • req_2中参数【v_songMid】,
  • req_3中参数【songMID】,【songID】
  • req_4中参数【biz_id】
  • req_5 中参数【albumMid】
  • req_6中参数【guid】,【songmid】

由请求参数中可看出:

songmid == v_songMid ==  songMID == biz_id

那么这几个可以根据歌曲详情页链接后缀得到

问题参数

guid   

songID   歌曲编号

albumMid  专辑短链

guid 参数逆向

调试跟栈可定位到giud生成位置

function getGuid() {
    a = (new Date).getUTCMilliseconds()

    return String(Math.round(2147483647 * Math.random()) * a % 1e10);
}

那么其余参数如何获取呢 ??? 带着这个问题开始寻找之路

寻找接口

来到歌曲详情页面开始各种搜索发现前文章中提到得接口被反复请求,仔细观察之下发现有需要得结果。

请求参数

{
	"comm": {
		"cv": 4747474,
		"ct": 24,
		"format": "json",
		"inCharset": "utf-8",
		"outCharset": "utf-8",
		"notice": 0,
		"platform": "yqq.json",
		"needNewCode": 1,
		"uin": 0,
		"g_tk_new_20200303": 5381,
		"g_tk": 5381
	},
	"req_1": {
		"module": "music.musicsearch.HotkeyService",
		"method": "GetHotkeyForQQMusicMobile",
		"param": {
			"searchid": "26594278617551874",
			"remoteplace": "txt.yqq.top",
			"from": "yqqweb"
		}
	},
	"req_2": {
		"method": "get_song_detail_yqq",
		"module": "music.pf_song_detail_svr",
		"param": {
			"song_mid": "002dw4gv1ZmiGt"
		}
	},
	"req_3": {
		"module": "music.paycenterapi.LoginStateVerificationApi",
		"method": "GetChargeAccount",
		"param": {
			"appid": "mlive"
		}
	}
}

参数刨析

  • req_1 中参数  【searchid】
  • req_2中参数【song_mid】,

由首次分析可知  song_mid  为歌曲得短链,可有歌曲详情页中链接提取到

调试取参

【searchid】26594278617551874

断点跟栈

如上方式跟栈大概到  k.request  处发现关键位置

this.request = function(t) {
    var n = t instanceof Array ? t : [t];
    e.wait || (e.wait = e.sendRequest());
    var r = {};
    return n.forEach((function(t) {
        e.index += 1,
        t.param || (t.param = {}),
            r["req_" + e.index] = t
        }
        )),
        e.reqData = Object.assign(Object.assign({}, e.reqData), r),
        e.wait.then((function(t) {
            var e = Object.keys(r);
            return 0 === e.length ? [] : e.map((function(e) {
                return t[e]
        }
        ))
    }
    ))
}

e.reqData = Object.assign(Object.assign({}, e.reqData), r),

 此处打上断点看变量 r 值结果

存在需要得变量   【searchid】

进一步跟栈可跟踪到我们需要得位置: searchid: Object(_.a)(1)

扣取代码
, function(e, t, n) {
    "use strict";
    n.d(t, "a", (function() {
        return i
    }
    ));
    var a = function(e, t) {
        for (var n = "".concat(e).split("").reverse(), a = "".concat(t).split("").reverse(), r = [], i = n.length, o = a.length, c = 0, s = i + o - 1; c <= s; c++)
            r[c] = 0;
        for (var l = 0; l < o; l++)
            for (var u = 0; u < i; u++)
                r[u + l] += parseInt(n[u], 10) * parseInt(a[l], 10),
                r[u + 1 + l] += Math.floor(r[u + l] / 10),
                r[u + l] = r[u + l] % 10;
        return r.reverse(),
        0 == r[0] && r.shift(),
        r.join("")
    }
      , r = function(e, t) {
        for (var n = "".concat(e).split("").reverse(), a = "".concat(t).split("").reverse(), r = n.length, i = a.length, o = 0, c = 0, s = 0, l = 0, u = 0, m = Math.max(r, i); u < m; u++)
            c = u < r ? parseInt(n[u], 10) : 0,
            s = u < i ? parseInt(a[u], 10) : 0,
            l = Math.round(c) + Math.round(s) + o,
            n[u] = "".concat(l % 10),
            o = l >= 10 ? 1 : 0;
        return 1 == o && n.push("1"),
        n.reverse().join("")
    }
      , i = function(e) {
        var t = a(e, "18014398509481984")
          , n = a(Math.round(Math.random() * parseInt("4194304", 10)), "4294967296")
          , i = new Date
          , o = 1e3 * (3600 * i.getHours() + 60 * i.getMinutes() + i.getSeconds()) + i.getMilliseconds();
        return r(r(t, n), o)
    }
}

通看下来 没有进行其余操作, 我们可以将该内容加入到前文webpack加载器中,也可自行更改函数,

方式二实现

function getSearchId( e ){
     var a = function(e, t) {
        for (var n = "".concat(e).split("").reverse(), a = "".concat(t).split("").reverse(), r = [], i = n.length, o = a.length, c = 0, s = i + o - 1; c <= s; c++)
            r[c] = 0;
        for (var l = 0; l < o; l++)
            for (var u = 0; u < i; u++)
                r[u + l] += parseInt(n[u], 10) * parseInt(a[l], 10),
                r[u + 1 + l] += Math.floor(r[u + l] / 10),
                r[u + l] = r[u + l] % 10;
        return r.reverse(),
        0 == r[0] && r.shift(),
        r.join("")
    }
      , r = function(e, t) {
        for (var n = "".concat(e).split("").reverse(), a = "".concat(t).split("").reverse(), r = n.length, i = a.length, o = 0, c = 0, s = 0, l = 0, u = 0, m = Math.max(r, i); u < m; u++)
            c = u < r ? parseInt(n[u], 10) : 0,
            s = u < i ? parseInt(a[u], 10) : 0,
            l = Math.round(c) + Math.round(s) + o,
            n[u] = "".concat(l % 10),
            o = l >= 10 ? 1 : 0;
        return 1 == o && n.push("1"),
        n.reverse().join("")
    };

    var t = a(e, "18014398509481984")
      , n = a(Math.round(Math.random() * parseInt("4194304", 10)), "4294967296")
      , i = new Date
      , o = 1e3 * (3600 * i.getHours() + 60 * i.getMinutes() + i.getSeconds()) + i.getMilliseconds();
    return r(r(t, n), o)

}
调用方式

 

整合调试

详情接口

组建参数

【searchid】,【song_mid】

发起请求
_ 为时间戳, sign 值为前文逆向出来将请求参数传递进入可得到加密后得结果
歌曲id = result['req_2'][ 'data' ][ 'track_info' ][ 'id' ]
专辑短链 = result['req_2'][ 'data' ][ 'track_info' ][ 'album' ][ 'mid' ]

播放接口

将上述拿到得信息写入对应参数位置后,则可发起请求

songID   result['req_2'][ 'data' ][ 'track_info' ][ 'id' ]

albumMid  result['req_2'][ 'data' ][ 'track_info' ][ 'album' ][ 'mid' ]

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何开发创建自己的npm包并成功发布、维护至npm官方网站

npm&#xff0c;全称为Node Package Manager&#xff0c;是专为JavaScript生态系统设计的软件包管理系统&#xff0c;尤其与Node.js平台紧密关联。作为Node.js的默认包管理工具&#xff0c;npm为开发者提供了便捷的方式来安装、共享、分发和管理代码模块。 npm作为JavaScript世…

【Python面试题收录】Python的可变对象与不可变对象

一、可变对象与不可变对象的定义 在Python中&#xff0c;对象的可变性是指对象的内部状态&#xff08;值&#xff09;是否允许在对象创建后发生改变。根据这一特性&#xff0c;Python的数据类型可以分为两大类&#xff1a;可变对象&#xff08;mutable objects&#xff09;和不…

Nginx三大常用功能“反向代理,负载均衡,动静分离”

注意&#xff1a;以下案例在Windows系统计算机作为宿主机&#xff0c;Linux CentOS 作为虚拟机的环境中实现 一&#xff0c;Nginx配置实例-反向代理 1.反向代理 案例一 实现效果&#xff1a;使用nginx反向代理&#xff0c;访问 www.123.com 直接跳转到127.0.0.1:8080 准备工…

大数据学习第十二天(hadoop概念)

1、服务器之间数据文件传递 1&#xff09;服务器之间传递数据&#xff0c;依赖ssh协议 2&#xff09;http协议是web网站之间的通讯协议&#xff0c;用户可已通过http网址访问到对应网站数据 3&#xff09;ssh协议是服务器之间&#xff0c;或windos和服务器之间传递的数据的协议…

STM32-03基于HAL库(CubeMX+MDK+Proteus)输入检测案例(按键控制LED)

文章目录 一、功能需求分析二、Proteus绘制电路原理图三、STMCubeMX 配置引脚及模式&#xff0c;生成代码四、MDK打开生成项目&#xff0c;编写HAL库的按键检测代码五、运行仿真程序&#xff0c;调试代码 一、功能需求分析 搭建完成开发STM32开发环境之后&#xff0c;开始GPIO…

OpenCv —— cv::VideoCapture设置摄像头图像格式为“MJPEG“

背景 今天恰巧同事有台USB摄像头,她想要在Windows系统下通过OpenCV读取该摄像头宽高为1080x768、帧率为60的视频,用来做图像算法处理。但无奈通过网上OpenCV教程 读取的视频对应尺寸的帧率仅为10帧左右,根本无法满足使用要求。于是作者通过本篇文章介绍如何解决,欢迎交流指…

0基础学习Mybatis系列数据库操作框架——多环境配置

大纲 配置代码参考资料 在实际开发中&#xff0c;我们往往会将开发环境分成&#xff1a;开发、测试、线上等环境。这些环境的数据源不一样&#xff0c;比如开发环境就不能访问线上环境&#xff0c;否则极容易出现线上数据污染等问题。Mybatis通过多环境配置分开定义来解决这个问…

python核心篇之网络通信

一. 发送请求 1. 发送get请求 2. 发送post请求 3. json数据与python数据的对应关系

WPF中继承ItemsControl子类控件数据模板获取选中属性

需求场景 列表类控件&#xff0c;如 ListBox、ListView、DataGrid等。显示的行数据中&#xff0c;部分内容依靠选中时触发控制&#xff0c;例如选中行时行记录复选&#xff0c;部分列内容控制显隐。 案例源码以ListView 为例。 Xaml 部分 <ListView ItemsSource"{Bi…

蓝桥杯—DS1302

目录 1.管脚 2.时序&官方提供的读写函数 3.如何使用读写函数 4.如何在数码管中显示在DS1302中读取出的数据&#xff1f; 1.管脚 2.时序&官方提供的读写函数 /* # DS1302代码片段说明1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。2. 参赛选手可以自行…

C语言-------内存函数

前面向大家介绍了C语言中的字符函数和字符串函数&#xff0c;今天再向大家介绍一下类似的函数———— C语言中的内存函数。 1. memcpy函数的使用和模拟实现 memcoy函数是一种通过内存来复制内容的一种函数&#xff0c;以字节为基本单位进行&#xff0c;斌并且是一个可以复制…

Git分支提交时自动大写 fatal: the remote end hung up unexpectedly

先说结论&#xff1a; 进入 .git/refs/heads目录&#xff0c;会看到Feature文件夹&#xff0c;重命名为feature即可。 表现&#xff1a; 通过终端命令创建的分支 git checkout -b feature/name 使用git push后自动变成了Feature/name 并且有时候在本地创建feature/1234567…

etcdctl配置

下载etcdctl压缩文件 wget https://github.com/etcd-io/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-amd64.tar.gztar -xvf etcd-v3.5.0-linux-amd64.tar.gzsudo mv ./etcd-v3.5.0-linux-amd64/etcdctl /usr/local/bin/ chmod x /usr/local/bin/etcdctl 配置etcdctl 配…

6.8物联网RK3399项目开发实录-驱动开发之RTC实时时钟的使用(wulianjishu666)

90款行业常用传感器单片机程序及资料【stm32,stc89c52,arduino适用】 链接&#xff1a;https://pan.baidu.com/s/1M3u8lcznKuXfN8NRoLYtTA?pwdc53f RTC 使用 简介 AIO-3399J 开发板上有 一个集成于 RK808 上的RTC(Real Time Clock)&#xff0c;主要功能有时钟&#xff0c…

OpenHarmony实战:轻量系统芯片移植准备

由于OpenHarmony工程需要在Linux环境下进行编译&#xff0c;此章节将指导厂商搭建OpenHarmony的编译环境、获取OpenHarmony源码&#xff0c;并且创建厂商工作目录完成厂商芯片的编译框架适配。 搭建编译环境 开展移植前请参考开发环境准备完成环境搭建工作。 获取源码 获取…

非关系型数据库-----------探索 Redis高可用 与持久化

目录 一、Redis 高可用 1.1什么是高可用 1.2Redis的高可用技术 二、 Redis 持久化 2.1持久化的功能 2.2Redis 提供两种方式进行持久化 三、Redis 持久化之----------RDB 3.1触发条件 3.1.1手动触发 3.1.2自动触发 3.1.3其他自动触发机制 3.2执行流程 3.3启动时加载…

服务器远程桌面连接不上怎么办?

随着互联网的发展和远程办公的兴起&#xff0c;服务器远程桌面连接成为了许多企业和个人不可或缺的工具。偶尔我们可能会碰到服务器远程桌面连接不上的情况&#xff0c;这时候我们需要找到解决办法&#xff0c;确保高效地远程访问服务器。 天联组网——突破远程连接障碍 在我们…

Linux网络编程二(TCP图解三次握手及四次挥手、TCP滑动窗口、MSS、TCP状态转换、多进程/多线程服务器实现)

文章目录 1、TCP三次握手(1) 第一次握手(2) 第二次握手(3) 第三次握手 2、TCP四次挥手(1) 一次挥手(2) 二次挥手(3) 三次挥手(4) 四次挥手 3、TCP滑动窗口4、TCP状态时序图5、多进程并发服务器6、多线程并发服务器 1、TCP三次握手 TCP三次握手(TCP three-way handshake)是TCP协…

玩转ChatGPT:Kimi测评(科研写作)

一、写在前面 ChatGPT作为一款领先的语言模型&#xff0c;其强大的语言理解和生成能力&#xff0c;让无数用户惊叹不已。然而&#xff0c;使用的高门槛往往让国内普通用户望而却步。 最近&#xff0c;一款由月之暗面科技有限公司开发的智能助手——Kimi&#xff0c;很火爆哦。…

Vue3_2024_7天【回顾上篇watch常见的后两种场景】完

随笔&#xff1a;这年头工作不好找咯&#xff0c;大家有学历提升的赶快了&#xff0c;还有外出人多注意身体&#xff0c;没错我在深圳这边阳了&#xff0c;真的绝啊&#xff0c;最尴尬的还给朋友传染了&#xff01;&#xff01;&#xff01; 之前三种的监听情况&#xff0c;监听…