2025-05-13 · 技术

干员寻访记录统计

前言

这段时间也是粥游的六周年之际,最近也看到很多人分享来自 明日方舟寻访记录分析 或者小黑盒的寻访统计图,因此咱也尝试了下写了个简易的脚本来获取粥的寻访记录以及保存,也提供给有需要的博士们。

具体展示可以看看 这里 ,相关代码可以看看 这里

下载与使用

  1. 前往 Github 仓库 进行克隆仓库或通过 Releases 进行下载。
  2. 下载后,建议先判断 Python 版本,目前仅在 3.11.6 版本中测试过。
  3. (可选)检查后,可以先通过 python3 -m venv venv 创建虚拟环境,Linux 下通过 source venv/bin/activate 激活虚拟环境,Windows PowerShell 下则通过 .\venv\Scripts\activate.ps1 激活环境变量。
  4. 使用 pip install -r requirements.txt 即可安装依赖。
  5. 完善配置文件 config.yml 的内容,详细可看下方的配置文件说明。
  6. 前往 游戏角色信息页面 并设置默认角色。
  7. 通过 python3 main.py 运行本项目或使用 nohup python3 main.py > log.txt 2>&1 & 保持在后台运行。

配置文件说明

字段说明样例
token账号 TokenF3N6kX1n6Q14vWO50
api官方相关 API(用于寻访记录获取)详见配置文件
schedule.day计划任务(天)7(默认 1)
schedule.hour计划任务(小时)2(默认 0)
schedule.minute计划任务(分钟)30(默认 0)
sftp.enabledSFTP 功能开关false(默认关)
sftp.hostSFTP 功能开关233.233.233.233
sftp.portSFTP 功能开关22(默认 22)
sftp.usernameSFTP 功能开关your_username
sftp.private_keySFTP 功能开关./private_key(即根目录下的 private_key
sftp.remote_dirSFTP 功能开关/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 许可协议,允许您分享和改编,但仅限于非商业用途。转载时,请务必附上原文出处链接及上述许可声明。

...
© 2018-2026 Bhao.|萌ICP备202023323
Designed by Bhao|Made with love | Cuckoo Demo