展开

文章目录

修改历史

修改历史记录

  1. 2022-02-08 14:34:28
  2. 2022-02-08 14:34:27
  3. 2022-02-08 14:31:11

原神抽卡分析

2022-02-08 14:29:23 电子游戏 220

简介

相信玩过原神的朋友都用过小程序来分析自己的抽卡历史记录吧,使用抽卡分析小程序的时候,都会首先让你输入一段抽卡历史记录的URL,最近研究了一下如何实现抽卡分析功能,本篇文章就是来分析抽卡分析小程序是如何统计分析我们的抽卡历史记录的。

1.声明

抽卡分析记录所有者为上海米哈游影铁科技有限公司(原神发行商),如若此篇博文侵害了上海米哈游影铁科技有限公司相关利益,请联系我邮箱804022023@qq.com,我会在第一时间删除此博文,并致歉!

此篇博文最主要的目的是分享,请各位看官切勿拿去做一些非法交易!!!

2.历史记录页面分析

我们在手机上玩原神的时候,进入祈愿页面,可以在左下角看到历史记录按钮,点击历史记录按钮就可以看到近六个月的抽卡历史记录,如果接触过安卓开发的同学应该可以看出来,这个页面应该是用WebView控件去实现的,这时候我们断开网络然后点击右上角的刷新按钮,就会出现类似下图的页面,这应该是安卓WebView的机制(我的猜想,因为开发安卓已经是很多年前的事情了)。

Android-webview无网络

页面上出现的URL就是历史记录页面,也就是各种抽卡分析小程序需要你手动输入的URL,复制该URL然后粘贴到浏览器地址栏中,可以看到游戏祈愿历史记录一样的页面,如下图所示

祈愿历史记录页面

3.历史记录API分析

在浏览器中按F12打开开发者模式,点击到网络TAB,可以看到获取历史记录的API。

如上图所示,可以看到这是通过GET请求携带路径参数获取祈愿历史记录,其路径参数一览表如下所示,下面只说明比较重要的参数,其他的参数按照默认值即可

  1. authkey: 账号认证key,就是登录认证token
  2. page: 当前页码,不过这个不起作用
  3. size: 每页的大小,默认为6,最大值为20
  4. end_id: 结束ID
  5. begin_id: 开始ID
  6. gacha_type: 祈愿类型
    1. 301:角色祈愿
    2. 200:常驻祈愿
    3. 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={}&timestamp=1641338923&lang=zh-cn' \
      '&device_type=pc&game_version=CNRELWin2.4.0_R5691054_S5715829_D5736476&plat_type=pc&region=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,我会在第一时间删除此博文,并致歉!

此篇博文最主要的目的是分享,请各位看官切勿拿去做一些非法交易!!!

1条评论


libai001 用户

123

Macv 博主 回复:libai001

????