1.声明
抽卡分析记录所有者为上海米哈游影铁科技有限公司(原神发行商),如若此篇博文侵害了上海米哈游影铁科技有限公司相关利益,请联系我邮箱804022023@qq.com,我会在第一时间删除此博文,并致歉!
此篇博文最主要的目的是分享,请各位看官切勿拿去做一些非法交易!!!
2.历史记录页面分析
我们在手机上玩原神的时候,进入祈愿页面,可以在左下角看到历史记录按钮,点击历史记录按钮就可以看到近六个月的抽卡历史记录,如果接触过安卓开发的同学应该可以看出来,这个页面应该是用WebView控件去实现的,这时候我们断开网络然后点击右上角的刷新按钮,就会出现类似下图的页面,这应该是安卓WebView的机制(我的猜想,因为开发安卓已经是很多年前的事情了)。
页面上出现的URL就是历史记录页面,也就是各种抽卡分析小程序需要你手动输入的URL,复制该URL然后粘贴到浏览器地址栏中,可以看到游戏祈愿历史记录一样的页面,如下图所示
3.历史记录API分析
在浏览器中按F12打开开发者模式,点击到网络TAB,可以看到获取历史记录的API。
如上图所示,可以看到这是通过GET请求携带路径参数获取祈愿历史记录,其路径参数一览表如下所示,下面只说明比较重要的参数,其他的参数按照默认值即可
- authkey: 账号认证key,就是登录认证token
- page: 当前页码,不过这个不起作用
- size: 每页的大小,默认为6,最大值为20
- end_id: 结束ID
- begin_id: 开始ID
- gacha_type: 祈愿类型
- 301:角色祈愿
- 200:常驻祈愿
- 302:武器祈愿
复制API链接,打开postman进行访问,如下所示,可以清楚的看到可以获取到对应的JSON数据(省略了后面的数据)
{
"retcode": 0,
"message": "OK",
"data": {
"page": "1",
"size": "6",
"total": "0",
"list": [
{
"uid": "***",
"gacha_type": "400",
"item_id": "",
"count": "1",
"time": "2022-02-08 09:39:39",
"name": "铁影阔剑",
"lang": "zh-cn",
"item_type": "武器",
"rank_type": "3",
"id": "***"
},
...
],
"region": "cn_gf01"
}
}
这里需要注意的authkey的必须经过url_encode编码后才是有效的authkey,否则会返回authkey error的错误!
然后我们修改page的值范围2,发现获取的还是第一页的数据,如下图
继续在浏览器中点击下一页的按钮,我们可以发现end_id这个参数是发生变化的,如下图所示。
第一页时,end_id的值为0,从第二页开始end_id的值就发生了变化了。这里应该是通过JavaScript代码使end_id的值动态变化,后端在请求查询的时候从end_id这个值开始查询,因此如果我们end_id这个值一直不变化的话,那么永远只能获取当前这一页的值,那么end_id的值是怎么来的呢?仔细查看页面,我发现我浏览器右上角的vue开发工具插件亮了,发现这个页面是用Vue开发的,于是我切换到开发者工具源代码页面,在bundle_***.js文件中搜索end_id关键字,可以看到如下图所示的代码。
这下就豁然开朗了,end_id的值就是当前页面查询结果最后一条记录的id的值,在postman中手动改变end_id的值,就可以愉快的获取下一页的记录啦,如下图所示
4.保存历史记录到本地
原神祈愿历史记录页面只提供最近六个月的祈愿历史记录,因此我们可以通过代码将历史记录保存到本地,下面的Python代码就可以将历史记录保存到本地。
import requests
import json
import datetime
import time
# 需要先安装requests库 pip install requests
# 替换你自己的authkey,必须是url_encode编码
authkey = ''
size = 20
end_id = 0
end_flag = False
gacha_type = {301: '角色祈愿', 302: '武器祈愿', 200: '常驻祈愿'}
# 替换为自己个gacha_id
gacha_id = ''
today = datetime.datetime.today().strftime('%Y%m%d_%H%M%S')
url = 'https://hk4e-api.mihoyo.com/event/gacha_info/api/getGachaLog?authkey_ver=1&sign_type=2&auth_appid' \
'=webview_gacha&init_type=301&gacha_id={}×tamp=1641338923&lang=zh-cn' \
'&device_type=pc&game_version=CNRELWin2.4.0_R5691054_S5715829_D5736476&plat_type=pc®ion=cn_gf01&authkey={' \
'}&game_biz=hk4e_cn&gacha_type={}&page=2&size={}&end_id={}'
for gt in gacha_type.keys():
index = 1
end_flag = False
end_id = 0
data = []
while not end_flag:
wishes = requests.get(url.format(gacha_id, authkey, gt, size, end_id)).json()
print(f'正在获取{gacha_type.get(gt)}祈愿第{index}页...')
if not wishes['data']['list']:
end_flag = True
print(f'{"*"*10}{gacha_type.get(gt)}祈愿获取完成!{"*"*10}')
break
data += wishes['data']['list']
end_id = wishes['data']['list'][-1]['id']
time.sleep(0.2)
index += 1
with open(f'{today}_{gacha_type.get(gt)}.json', 'w', encoding='utf8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
5.再次声明
抽卡分析记录所有者为上海米哈游影铁科技有限公司(原神发行商),如若此篇博文侵害了上海米哈游影铁科技有限公司相关利益,请联系我邮箱804022023@qq.com,我会在第一时间删除此博文,并致歉!
此篇博文最主要的目的是分享,请各位看官切勿拿去做一些非法交易!!!
yya 用户 2023-01-09T04:13:41
测试