今天《明日方舟:终末地》正式开启公测了。抽空体验了一段时间之后,想着将抽卡数据导入进我自己的抽卡分析应用中。但是可能是游戏刚开服的缘故,找了一轮都没能找到导出抽卡数据的工具,最终只能自己动手实现这个功能。下面分享主要思路,如果你需要实现这个功能希望对你有所帮助。
URL 里都有什么
首先,和其他游戏一样,我们可以通过抓包软件抓取这样的抽卡记录链接:
https://ef-webview.hypergryph.com/api/record/char?lang=zh-cn&seq_id={seqId}&pool_type={poolType}&token={token}&server_id={serverId}

抽卡记录链接
角色池
针对角色池,我们主要关注 pool_type 和 seq_id 这两个参数:
pool_type 是卡池枚举值,目前仅能取如下卡池之一:
- 启程寻访(新手池):
E_CharacterGachaPoolType_Beginner - 基础寻访(常驻池):
E_CharacterGachaPoolType_Standard - 特许寻访(限定池):
E_CharacterGachaPoolType_Special
而与原神,鸣潮等游戏不同,终末地的抽卡记录链接通常带有 seq_id 参数。
通过观察上面两个不同卡池的记录,我们可以发现 seq_id 参数的一些特征:
seq_id (seqId)是一个 账号级的、跨子卡池的、不同类型卡池互相独立的 递增序号,所有角色子卡池的抽卡记录共享同一条seq_id (seqId)序列,而武器子卡池的抽卡记录共享另一条seq_id (seqId)序列。在同一卡池类型(所有角色池或者所有武器池)下,即使我们更换子卡池的类型也不会让seq_id (seqId)重新开始计数。seq_id (seqId)数字越大,时间越晚、数据越新。- 当请求的链接不带
seq_id参数的时候会返回该卡池最新的五条记录(即seqId最大的五条记录)。
根据这些特征我们可以知道:在游戏里的抽卡记录展示页中,我们从第一页开始往后翻(从新记录到旧记录)的过程就是抽卡记录链接 seq_id 参数递减的过程。
在链接返回的抽卡记录中,还会带有一个 hasMore 参数。其代表的是当前返回结果的最小 seqId 之下是否还有数据,反映的是是否还能翻下一页。
武器池
武器池的 API 与角色池有所不同。武器池需要通过两个 API 来获取数据:
获取武器池列表
首先需要通过下面的链接获取用户存在抽卡记录的武器池列表:
返回的数据结构:
这里可以看到武器池分为两种类型:
- 武器限定池:
poolId格式为weponbox_*(如weponbox_1_0_1),对应当期 UP 武器 - 武器常驻池:
poolId格式为weaponbox_constant_*(如weaponbox_constant_2)
题外话:这里有意思的是武器限定池的
poolId的前缀拼写错误为了wepon,不知道是不是历史遗留问题。
获取武器抽卡记录
获取具体武器池的抽卡记录链接与角色池抽卡记录链接格式有所不同,武器池的抽卡记录链接将 pool_id 参数代替了 pool_type 参数:
其返回的数据结构为:
武器记录的字段与角色记录略有不同:
weaponId:武器 IDweaponName:武器名称weaponType:武器类型(E_WeaponType_Sword、E_WeaponType_Wand等)
武器池的 seq_id 特性与角色池相同,所有武器子卡池共享同一条 seqId 序列。
至此,我们已经基本搞清楚了《明日方舟:终末地》抽卡记录链接的逻辑。
主要思路
根据上面的介绍,我们能构想出通过一个有效的终末地抽卡记录链接来获取全部卡池所有记录的方法:
角色池
- 首先带上随便一个卡池的
pool_type,并且不带seq_id发起一次请求,获取该卡池最大seqId的最新的抽卡记录。 - 后续使用返回数据中最小
seqId作为游标,遍历该卡池的所有记录,直至后续抽卡数据被服务器清理或着到了该卡池的第一次抽卡hasMore === false停止。 - 切换为另一个卡池的
pool_type,继续重复第一步的操作即可。
武器池
- 首先调用武器池列表 API 获取用户有数据的武器池。
- 遍历每个武器池,使用
pool_id参数获取记录。 - 根据
poolId判断卡池类型:包含constant的为常驻池,否则为限定池。
代码实现
这样我们就实现了获取《明日方舟:终末地》的全部卡池所有记录。