2025-05-13 · 技术
干员寻访记录统计
前言
这段时间也是粥游的六周年之际,最近也看到很多人分享来自 明日方舟寻访记录分析 或者小黑盒的寻访统计图,因此咱也尝试了下写了个简易的脚本来获取粥的寻访记录以及保存,也提供给有需要的博士们。
下载与使用
- 前往 Github 仓库 进行克隆仓库或通过 Releases 进行下载。
- 下载后,建议先判断 Python 版本,目前仅在 3.11.6 版本中测试过。
- (可选)检查后,可以先通过
python3 -m venv venv创建虚拟环境,Linux 下通过source venv/bin/activate激活虚拟环境,Windows PowerShell 下则通过.\venv\Scripts\activate.ps1激活环境变量。 - 使用
pip install -r requirements.txt即可安装依赖。 - 完善配置文件
config.yml的内容,详细可看下方的配置文件说明。 - 前往 游戏角色信息页面 并设置默认角色。
- 通过
python3 main.py运行本项目或使用nohup python3 main.py > log.txt 2>&1 &保持在后台运行。
配置文件说明
| 字段 | 说明 | 样例 |
|---|---|---|
| token | 账号 Token | F3N6kX1n6Q14vWO50 |
| api | 官方相关 API(用于寻访记录获取) | 详见配置文件 |
| schedule.day | 计划任务(天) | 7(默认 1) |
| schedule.hour | 计划任务(小时) | 2(默认 0) |
| schedule.minute | 计划任务(分钟) | 30(默认 0) |
| sftp.enabled | SFTP 功能开关 | false(默认关) |
| sftp.host | SFTP 功能开关 | 233.233.233.233 |
| sftp.port | SFTP 功能开关 | 22(默认 22) |
| sftp.username | SFTP 功能开关 | your_username |
| sftp.private_key | SFTP 功能开关 | ./private_key(即根目录下的 private_key ) |
| sftp.remote_dir | SFTP 功能开关 | /home/your_username/AK/data |
使用示例 (Nuxt 3)
生成出的数据通过 SFTP 上传至服务器中,并通过简易的 HTTP 服务器以将数据提供给 Nuxt ,实现当脚本数据更新时站点可实时同步进行更新哦。
统计图使用 Nuxt ECharts 生成,故需将源数据转换为能直接使用的数据。
展示数据:各卡池/全部卡池干员稀有度分布、按卡池/按月寻访统计(参考自 IOS 的罗德岛助理)。
export default defineEventHandler(async(event) => {
const config = useRuntimeConfig()
const gachaAKURL = config.gachaAkURL;
const rawData = await $fetch<Record<string, { c: [string, number, number][], p: string }>>(gachaAKURL, { method: 'GET' }); // 源数据即上述脚本输出的 JSON 数据
const sortedKeys = Object.keys(rawData).sort((a, b) => Number(b) - Number(a)) // 倒序(可选)
const poolStats: Record<string, { starData: { value: number, name: string }[] }> = {} // 各卡池各星级统计
const totalCount: Record<string, number> = {} // 各卡池总抽数
const monthlyStats: Record<string, number> = {} // 月份总抽数
const allCounter = [
{ value: 0, name: '3★' },
{ value: 0, name: '4★' },
{ value: 0, name: '5★' },
{ value: 0, name: '6★' },
] // 所有卡池各星级统计
let allTotal = 0
for (const key of sortedKeys) {
const { c: chars, p: poolName } = rawData[key]
if (!poolStats[poolName]) {
poolStats[poolName] = {
starData: [
{ value: 0, name: '3★' },
{ value: 0, name: '4★' },
{ value: 0, name: '5★' },
{ value: 0, name: '6★' },
],
}
totalCount[poolName] = 0
}
for (const [_, star] of chars) {
if (star >= 2 && star <= 5) {
const index = star - 2
poolStats[poolName].starData[index].value += 1
totalCount[poolName] += 1
allCounter[index].value += 1
allTotal += 1
}
}
const date = new Date(Number(key) * 1000)
const monthKey = `${date.getFullYear()}.${(date.getMonth() + 1).toString().padStart(2, '0')}`
monthlyStats[monthKey] = (monthlyStats[monthKey] || 0) + chars.length
}
poolStats['所有卡池'] = {
starData: allCounter,
}
return {
poolStats,
monthlyStats,
totalCount
}
});
本文采用 CC BY-NC-SA 4.0 许可协议,允许您分享和改编,但仅限于非商业用途。转载时,请务必附上原文出处链接及上述许可声明。