php获取千千音乐的sign,关于QQ音乐sign参数的获取

最近在抓取QQ音乐歌手粉丝数量时,发现参数多了一个sign

如果不传这个参数返回的结果

bd134b4730efae0df4dcda1e69c771a8.png

9bed96a5f67623d3ccc1c4495c1e056b.png

所以用了2个多小时一直debug看了一下生成sign参数的源码

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

刚开始我以为直接导入js,调用window.getSecuritySign(JSON.stringify(data)),可以直接获取sign,可是结果一直不正确。

我就想是不是源码里有什么比较,只让QQ音乐那边的页面返回正确结果,然后就开始了2个小时的debug

在此中间果然发现了蹊跷

2c24cbaa76b4d40fcd82a4cd4f879a17.png

后面继续debug

6954787a7b9e25ea55f4717ba51b391b.png

结果差不多已经出来了,QQ音乐那边 location.host = y.qq.com

又看到indexOf,后面肯定还有一个参数是y.qq.com

d08643a2803d9bc501da9c578797734b.png

后面执行函数

635246205c98d3a2f69e8f47100dcae0.png

"y.qq.com"['indexOf'].apply('y.qq.com',['y.qq.com']) ---->放到浏览器跑一下 返回值为0

下一步

95b702d30f2ca24eb146f061b3462009.png

0 === -1 返回false,所以g[15] = false

下一步

441d59a7bb273ee2c55303402daa2a9a.png

到这里 如果是我们本地运行的话,h是会赋值为963的,而QQ音乐那边则还是934(h是l数组的下标,而l数组存储的数据是调用n这个方法数组对应的方法的,具体就是n[l[h]]()

6a5eedf97c972a64a1fff6794ce3ab59.png),这样导致我们本地运行出来结果是错误的

最后,一直debug会看到如何获取sign参数。

分析出来的代码:

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));

data就是请求中data参数的值

0f282272bc709742c5c7fda0828064df.png

目前基本上没有什么问题

对于__sign_hash_20200305()这个加密算法,看不太明白,只能借助着这个方法来生成sgin

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用内容,以下是使用JMeter获取sign的步骤: 1. 首先,你需要在JMeter中创建一个线程组,并添加一个HTTP请求,默认情况下,JMeter会自动添加一个HTTP请求。 2. 在HTTP请求中,你需要设置请求的URL和方法。 3. 接下来,你需要在HTTP请求中添加一个HTTP Header Manager,用于设置请求头信息。在请求头中,你需要添加一个名为"sign"的参数,并设置其值为生成的sign值。 4. 生成sign值的方法可以根据你的具体需求来确定。你可以使用JMeter提供的函数来生成sign值,也可以使用自定义的方法来生成。 5. 如果你选择使用JMeter提供的函数来生成sign值,你可以使用__digest()函数来计算MD5或其他加密算法的值。例如,你可以使用如下代码来生成MD5加密的sign值: ``` ${__digest(MD5,${your_data},"")} ``` 其中,${your_data}是你要加密的数据。 6. 如果你选择使用自定义的方法来生成sign值,你可以在JMeter中使用BeanShell或JSR223 Sampler来编写自定义的代码。例如,你可以使用如下代码来生成sign值: ``` import java.security.MessageDigest; import java.util.Base64; String your_data = "your_data"; MessageDigest md = MessageDigest.getInstance("MD5"); byte[] digest = md.digest(your_data.getBytes("UTF-8")); String sign = Base64.getEncoder().encodeToString(digest); vars.put("sign", sign); ``` 这段代码使用了Java的MessageDigest类来计算MD5值,并使用Base64编码将结果转换为字符串。最后,将sign值存储在JMeter的变量中。 7. 完成以上步骤后,你可以运行JMeter脚本并查看生成的sign值是否正确。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值