文章目录
- 1. 写在前面
- 2. 请求分析
- 3. 加密分析
- 4. 算法实现
1. 写在前面
之前出过一个关于榜单analysis的分析,有兴趣的可以查看这篇文章:七麦榜单analysis加密分析
最近运营团队那边有同事找到我们,说工作中偶尔需要统计分析一下某APP在一些主流应用市场的下载量趋势数据
这个目前也只在一些成熟的移动应用数据聚合平台有,有的需要付费有的则数据有限。所以就有了这篇文章的出现!
分析目标:
aHR0cHM6Ly93d3cucWltYWkuY24vYW5kYXBwL2Rvd25Ub3RhbC9hcHBpZC8xOTM1NDU1
作者声明:
本文章中所有内容仅供学习交流使用!严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!本文章未经许可禁止转载,若有侵权,请联系作者立即删除!
2. 请求分析
首先我们选择最近一周提交请求,可以看到请求的参数所下图所示。加密参数analysis猜测是base64加密!appid(APP应用的ID),type(固定值天),sdate、edate(起始日期与截日期)
3. 加密分析
这里我们搜索加密参数analysis或者一些加密特征关键词是很难搜索到有用的信息。还是需要使用XHR断点的方式!
下完断点我们直接往上找堆栈信息,因为断点截停处加密已经完成。之前文章说过加密的方式都一样,换汤不换药!下载量趋势这块着重在参数加密这块跟评论一样有点小细节
榜单是没有请求参数加密的,搜索有参数加密(不过参数不需要处理)
如下所示,我们直接定位到加密函数这里,断点调试分析可以非常清晰的看到a就是参数拼接之后的值(参数拼接是有讲究的,a是经过排序的):
然后接下断点继续往下走,会发现参数排序拼接后会经过base64编码,如下所示:
截止到这里我们尝试使用Python编码来实现一下对参数拼接后再Base64编码,如下所示:
这里要说一下的是这个d,一串字符。这个可能是后续会不定期更新的,如果你发现加密失效了,不一定是加密算法人家换了,可能就是这个字符串更新了而已!
4. 算法实现
最后,使用Python实现一下完整的代码,如下所示:
import base64
import random
import time
params = {
'type': 'day',
'edate': '2023-08-31',
'sdate': '2023-08-25',
'appid': '1935455'
}
data = ''.join(sorted([str(v) for v in params.values()]))
print(base64.b64encode(data.encode()).decode()
def get_analysis(params, url):
# 定义字符集
charset = 'xyz517cda96efgh'
# 随机数
random_value = -(random.randint(100, 10000))
# 时间戳
current_time = int(time.time() * 1000)
# 计算o的值
o = current_time - (random_value or 0) - 1515125653845
# 对params进行Base64编码
encoded_params = base64.b64encode(params.encode()).decode()
# 构建字符串
combined_string = f'{encoded_params}@#{url}@#{o}@#1'
# 初始化结果字符串
result = ''
# 计算长度
e = len(combined_string)
n = len(charset)
# 逐字符进行异或运算
for i in range(e):
result += chr(ord(combined_string[i]) ^ ord(charset[(i + 10) % n]))
# 对结果进行Base64编码
encoded_result = base64.b64encode(result.encode()).decode()
return encoded_result
def get_download():
cookies = '必填项,填自己的即可!'
baseurl = 'https://api.qimai.cn'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/92.0.4515.159 Safari/537.36',
'referer': 'https://www.qimai.cn/',
'cookie': cookies,
}
url = '/andapp/download'
params = {
'type': 'day',
'edate': '2023-08-31',
'sdate': '2023-08-25',
'appid': '1935455'
}
data = ''.join(sorted([str(v) for v in params.values()]))
analysis = get_analysis(data, url)
params['analysis'] = analysis
res = requests.get(f'{baseurl}{url}', params=params, headers=headers).json()
print(res)
使用上述Python代码测试结果如下:
好了,到这里又到了跟大家说再见的时候了。创作不易,帮忙点个赞再走吧。你的支持是我创作的动力,希望能带给大家更多优质的文章