前言
最近半个月项目问题,比较忙了,没有及时更新。今天JaJa弟来水一波某音乐的加密参数params、encSecKey,望各位海涵。本文章仅供学习研究,如若侵犯到贵公司权益请联系229456906@qq.com第一时间进行删除;各位朋友切忌用于一切非法途径,否则后果自行承担!
地址:https://music.163.com/
一、抓包分析
老规矩,打开登录框输入138****8888,1234567点击登录按钮进行抓包。
当点击登录后,出现了两个请求地址,这里的登录请求为第二条:
看响应即可一目了然,当然,他的参数如下图:
两个参数params、encSecKey,接下来寻找加密位置。
二、参数解析
1.加密定位
还是一样,直接搜索大法:
可以看到这段代码片:
// 定义bWv4z
var bWv4z = window.asrsea(JSON.stringify(i3x), bsK6E(["流泪", "强"]), bsK6E(XR0x.md), bsK6E(["爱心", "女孩", "惊恐", "大笑"]));
e3x.data = j3x.cr4v({
params: bWv4z.encText, // 从bWv4z 中取encText赋值给params
encSecKey: bWv4z.encSecKey // 从bWv4z 中取encSecKey 赋值给encSecKey
})
so,这里两个参数params、encSecKey生成位置找到,接下来看看window.asrsea方法以及参数情况。
2.参数分析
先看参数
共4个参数,分别是JSON.stringify(i3x)、bsK6E([“流泪”, “强”])、bsK6E(XR0x.md)、bsK6E([“爱心”, “女孩”, “惊恐”, “大笑”]);
后三个参数都是由bsK6E方法生成,第一个参数将i3x转换成JSON格式传入。
经过多次抓包,后三个参数为固定值:
看看第一个参数i3x:这里可以认为i3x是一个字典(在py中),checkToken、password、phone,
还是一样通过几次抓包,checkToken固定不变,而password、phonek几次抓包下来也没有发生改变,但是既然我们是登录,那就得需要考虑业务使用的舒适度。比如我们需要更换账号及其密码,那这里就能任为他是动态参数。所以先分析一下password如何生成。
首先通过右边堆栈往下找
当找到第5个时
发现这里password:j3x.kD7w(gx6r.password)
下断点重新抓包:
基本没问题了,进入函数看看
将密码明文传入,进行一系列处理。
进入Mp5u函数看看
emmm,md5嘛,标准的。那这里password不用js代码,python还原即可:
def Md5passowrd(pwd):
xyz = hashlib.md5(pwd.encode(encoding='UTF-8')).hexdigest()
print('md5pwd:', xyz)
return xyz
mou得问题吧?
下面看看window.asrsea方法是啥玩意,先文本搜索大法:
window.asrsea = d;而d函数就在上方。so,这里将代码拿出,差啥补啥。
部分代码片段:
执行结果:
登录代码实现:
# -- coding: utf-8 --
# @Time : 2021/3/22 11:07
# @Author : JaJa
# @Email: 229456906@qq.com
# @sinaemail: angelesclippers@sina.com
import hashlib
import execjs
import requests
from JaJa.DictTools import HandleToDictTools
def Md5passowrd(pwd):
xyz = hashlib.md5(pwd.encode(encoding='UTF-8')).hexdigest()
print('md5pwd:', xyz)
return xyz
def getCjsParams(username, md5pwd):
with open('0322.js', 'r', encoding='utf-8') as f:
jsCode = f.read()
f.close()
params = execjs.compile(jsCode).call('getData', md5pwd, username)
return params
def logining(params):
url = "https://music.163.com/weapi/w/login/cellphone?csrf_token="
hd = """
content-type: application/x-www-form-urlencoded
origin: https://music.163.com
referer: https://music.163.com/
sec-ch-ua: "Google Chrome";v="89", "Chromium";v="89", ";Not A Brand";v="99"
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4389.90 Safari/537.36
"""
headers = HandleToDictTools(hd)
data = {
'params': params['encText'],
'encSecKey': params['encSecKey']
}
print(data)
response = requests.post(url, data=data, headers=headers)
print(response)
print(response.text)
print(response.cookies)
if __name__ == '__main__':
username = ""
password = ""
md5pwd = Md5passowrd(password)
params = getCjsParams(username, md5pwd)
logining(params)
成了。今天就到这里。今天并未对daima进行详细介绍,其实js玩多了也就一个样,这里只对思路稍作说明,实现还得靠各位朋友多加练习(大佬请忽视)。
总结
总结:good good xuexi,day day up,少掉头发。
码字不易,如果本篇文章对你有帮助请动动小手点个赞8,谢谢~
合作及源码获取vx:OneSisxoc 【注明来意】
QQ交流群:735418202
需要源码请扫下方二维码关注微信公众号回复【网易云音乐JS】获取 :
*注:本文为原创文章,转载文章请附上本文链接!否则将追究相关责任,请自重!谢谢!