AnyPS5:用Tauri和SQLite打造本地优先的PS5玩家数据管理工具

发布时间:2026/10/9 17:40:02
AnyPS5:用Tauri和SQLite打造本地优先的PS5玩家数据管理工具
PS5玩到现在我发现自己囤了一堆看着有用、真找起来又费劲的东西奖杯列表散落在主机和App里游戏时长藏在统计页截图躺在U盘里越积越多商店里的愿望单更是早就忘了当初为啥加进去。身边不少朋友都有同款症状——游戏玩得挺多但真要回答“我今年在PS5上到底花了多少小时、白了几个杯”谁都说不清。这就是我折腾AnyPS5的起点。简单说AnyPS5就是我自己做的一个本地优先的玩家数据小工具把PSN账号公开信息、奖杯进度、游戏时长、截图素材和商店愿望单统一收进一个入口随时查、随时导、随时备份。它能解决的就是一个“散”字——数据散、素材散、记录散。适合想认真盘点自己游戏生活的人也适合玩了很多年、想把游戏足迹整理成册的玩家。如果你也是那种不满足于官方App只给一丢丢数据、喜欢自己捏工具的人这篇应该对胃口。1. 为什么做AnyPS5PS5玩家数据管理的几个老大难1.1 核心场景拆解奖杯、时长、截图、比价、备份先说最让我难受的场景。周末打完了某个游戏的剧情想发条朋友圈纪念一下结果发现要么打开手机一张张翻截图要么得先把PS5开机、进媒体库、再琢磨怎么导到手机。这个流程我试过很多次每次都劝退——尤其积攒了几个月之后几千张截图躺在那边根本不想动。再看奖杯。PS App能看列表但只看得到“最近获得”和“总奖杯数”想知道自己每个游戏的白金率、稀有度、最近一次游玩时间基本无能为力。而PSN Profile这类第三方公开页面虽然有完整数据可它们要么加载慢、要么偶尔要人机验证用起来总有那么点不爽。游戏时长更麻烦PS5 系统本身能看到部分数据但颗粒度不够想对比“我到底更爱A游戏还是B游戏”翻了半天也没个清爽的结论。商店愿望单就更别提了。PS Store 的愿望单没有降价提醒很多游戏我加进去之后就再也没想起来等真正想买的时候折扣早就过了。比价站倒是有不少但每次都要手动去搜而且它们更关注“全平台最低”我的需求只是“我关注的这几款降没降”。最后一个痛点存档备份。PS5 有云存档和USB备份但并没有一个“上次备份是哪天、备份了什么内容”的清晰记录。我承认这是自己懒但工具的存在就是为了治懒的。当我把这五件事摆在一起看突然意识到它们其实都有一个共同点——数据都已经存在某个地方只是没有一个属于我自己的统一入口去管理它们。AnyPS5 的雏形就是从这五个场景里长出来的。1.2 项目定位为什么不做成网页服务而是本地小工具立项前我认真对比过几种形态做成网页服务像PSN Profile那样、做成手机App、还是做成桌面端本地工具。我把它们拉了一张表逐个过了一遍方案优势硬伤网页服务手机随时看分享方便要维护服务器账号数据长期存放在我这边有隐私顾虑PSN接口波动会导致站点频繁失效手机App通知及时、体验原生开发成本高上架审核对游戏数据类应用不友好而且我做的是个人工具不需要那么大动静桌面本地工具数据完全可控、没有服务器成本、可自动化只能在电脑上用但对我这种每天必开电脑的人来说完全不是问题最后选了本地工具路线而且把形态定为“轻量桌面端 本地数据库 可选网页预览”。你看这个思路其实就是把“自己的数据”还给“自己的设备”。所有从PSN公开接口拿到的信息、所有本地截图整理的结果、所有快速笔记全部落在自己电脑的SQLite文件里。不依赖任何第三方在线服务活哪怕以后PSN那边接口改版导致抓取挂了历史数据依然稳当地躺在本地不丢。这个定位还有一个额外好处——安全边界清楚。AnyPS5 从一开始就不做越狱、不碰系统权限、不改存档、不绕过任何官方限制只读取玩家自己账号的公开信息和本地素材。站在玩家角度这只不过是一个“更负责任的数据整理工具”跟破解、盗版没有半点关系这也让项目可以长期安安心心维护下去。1.3 功能边界与合规底线做这个项目之前我在社区里看到过不少PS5相关的“灰产工具”有的号称能备份授权、有的搞自制系统。我的态度很明确这些统统不做也不建议任何人碰。AnyPS5 的边界就三句话第一数据来源要么是玩家自己授权能看的公开页面要么是官方App本来就显示但不够直观的数据要么是本地可以合法导出的截图和记录。第二不做任何绕过验证、修改系统、破解游戏相关操作。第三项目里所有存储都留在本地用户完全掌控。这个边界不是妥协反而是整个项目最踏实的部分。因为只有把合规当成前提工具才能稳定迭代分享给朋友时才不用藏着掖着。我见过太多好点子因为碰了不该碰的东西项目最后只能悄悄烂尾太可惜。2. 核心模块拆解AnyPS5到底做了哪些事2.1 奖杯与游戏时长模块公开数据的本地化归档第一个做的是奖杯模块。很多人以为要有PlayStation官方API才能拉奖杯数据其实PSN有几个面向网页端、玩家公开页的数据源自己的账号如果设置为公开网页上就能看到完整的游戏列表、每个游戏下的奖杯完成度、稀有度还有最后更新时间。AnyPS5 本地的核心逻辑是定期把当前账号的公开数据抓下来解析后存进SQLite形成属于自己的一份“奖杯快照”。具体抓什么每个游戏一条记录游戏名、平台PS4还是PS5、奖杯总数、已获得数量、完成度百分比、白金状态、上次开始游玩时间每个奖杯一条记录奖杯名、描述、类型白金/金/银/铜、稀有度百分比、获取时间。其中“获取时间”这个字段特别重要有了它之后你可以轻松算出来“我上个月拿了多少个杯”“哪个季度最肝”这些是官方App完全给不了的视角。游戏时长这块PSN公开数据里没有特别精确的分钟级数据只能拿到相对模糊的游玩时长信息。AnyPS5 的处理方式是取一个稳步增长的快照值每次抓取时记录当前值比较差值就知道最近在哪个游戏上花得最多。严格说它不是系统级的精确秒表但对于“我最近是不是太沉迷了”这种灵魂拷问给出的答案已经足够扎心。2.2 截图与素材管理模块把U盘变成了分类图库PS5 导截图这件事至今还是老办法为主在主机上选中图片复制到U盘。这个操作一次两次还行积攒了大半年之后U盘里躺着的就是几千张PNG、一堆片段文件名全是乱码类似“ce-100000-1”这种根本认不出是哪个游戏。AnyPS5 的截图模块做的事情就是把“一堆乱码”变成“一个井井有条的游戏图库”。方案是分三步走。第一步插上U盘或直接连接主机存储把截图和视频拷贝到指定目录第二步用脚本读取文件名信息并做OCR识别游戏内文字来辅助确认游戏第三步按游戏名自动改建分类目录统一转成WebP缩略图并提供原始文件路径。首屏展示全部按时间轴倒序浏览体验比主机上快得多。这里有个技术上的选择值得一说截图能直接从MP4/PNG变成轻量的WebP靠的是Tauri项目内置的图片处理能力。为什么转WebP因为一张4K截图作为PNG可能有十几MB但转成WebP缩略图之后通常只有几百KB本地图库滚动起来完全不卡。原图完整保留只生成一份低清副本用于预览既不影响放大看细节又保证了浏览速度。我试过直接缩略原图效果也没差的离谱但在千张级别同时滚动的时候差距就完全体感出来了。2.3 商店比价模块愿望单自动降价提醒商店比价这个需求追问起来其实就是“我关注的游戏什么时候打折”。PS Store 的愿望单只帮你收藏列表不主动通知降价。AnyPS5 的比价模块做得很轻量用户在工具里维护一份自己的愿望单游戏名 目标价格脚本定期抓取PS Store 对应区服页面的公开价格一旦发现当前价格低于自己设定的心理价位就弹一个桌面通知。有人会问直接去比价网站查不就好了当然可以但比价网站的“历史最低”参考意义有限它统计的口径是全渠道全平台而我关心的是“我自己区服、我自己账号能买的那个数字”。自己去抓还有个额外好处——可以把折扣幅度和“本月疫苗”某港服会员月免这里只是用词习惯不是真实内容这些信息汇总到一处做一张专属于自己账号的消费日历心里有数。技术上抓取商店页面比想象中的简单。PS Store 公开页面里通常能直接读到价格字段关键是要处理好不同区服的页面结构差异以及避免频繁请求导致IP被短暂限制。我的做法是每天固定时间抓一次最多抓三次不搞实时监听反正打折不是秒杀一天一次的频率足够。2.4 本地存档备份提醒模块给云存档上道双保险关于PS5存档备份官方说法是会员可以自动云同步本地U盘备份也支持。但很多玩家误以为开了云同步就万事大吉。我查过不少案例云存档本身挺稳可万一某天会员到期没续费、云端空间版本变化或者需要从旧主机迁移数据留一份本地备份永远是好习惯。AnyPS5 做的是“备份计划管理”不碰存档文件本身只负责帮你记什么时间、哪个游戏、备份到哪块盘并在连续N天没有新备份的时候提醒你。这里的核心不是技术是习惯养成。程序很轻就是读一下系统里的备份目录时间戳和数据库里上次记录的备份时间做对比。但正是这种“记录 提醒”的小功能帮我在过去半年里稳妥地留下了三份完整的游戏存档快照。哪天主机出了问题我拿U盘照样能继续不会哭天抢地。对喜欢线下玩、不怎么联网的玩家来说这个模块可能比奖杯统计更重要。3. 实操从零搭出自己的AnyPS53.1 技术选型为什么是Tauri、SQLite和轻量Python脚本技术选型是项目起步最重要的节点这里分享一下我最终确定的组合Tauri桌面壳、SQLite数据存储、Python抓取与解析。选Tauri而不选Electron核心就一个字轻。Electron做出来的桌面工具随便几十上百MB起步跑起来内存动不动几百MB而Tauri基于系统WebView打包体积和内存占用都小得多。AnyPS5 是一个需要长期开着常驻的本地工具体积小、安静、不讨厌比炫技重要多了。选SQLite的原因更直接数据量级就是几千行几十万行级别搞MySQL都大题小做。SQLite单文件存储备份就是复制一个文件跑起来没任何额外服务完美契合“本地优先”的定位。实际操作时我会定期把SQLite文件复制到网盘和移动硬盘这就是全量备份。Python在这套组合里的角色是“数据水管工”。奖杯解析、商店页面抓取、截图分类这些任务用Python写起来最快而且遇到网页结构调整时改起来方便。Tauri和Python之间通过本地命令行接口交互前端负责展示后端Python负责抓取和处理中间用一个简单的格式约定比如json文件或标准输出。整体架构图很简单层负责什么具体技术数据源PSN公开页面、商店页面、本地U盘/主机素材无处理端抓取、解析、分类、去重Python 3.10 常用库存储端归置所有结构化数据与路径索引SQLite 3表现端看板、筛选、搜索、导出Tauri Vue3 Vite这套组合的维护成本很低。我不需要时刻盯着一个后端服务也不担心Node_modules体积失控本地工具的体验反而一直很顺滑。3.2 关键步骤奖杯数据抓取、解析与展示的完整过程拿奖杯模块来说一个最小的闭环可以拆成四步请求玩家公开页面、解析HTML结构、清洗数据、写入SQLite并在前端展示。下面是我早期用的一个简化版Python实现帮你理解核心思路import requests from bs4 import BeautifulSoup import sqlite3 import json import time # 1. 请求公开页面 # 注意这里仅请求常规网页不做任何绕过验证的操作 profile_url https://psnprofiles.com/{your_psn_id} headers { User-Agent: AnyPS5 Local Tool/1.0, Accept-Language: zh-CN,zh;q0.9,en;q0.8, } res requests.get(profile_url, headersheaders, timeout20) res.raise_for_status() # 2. 用BeautifulSoup解析页面中的游戏卡片 soup BeautifulSoup(res.text, html.parser) game_cards soup.select(.game-card) # 页面不同时期结构会有变化需适配 parsed_games [] for card in game_cards: title card.select_one(.title).get_text(stripTrue) trophies card.select_one(.trophies).get_text(stripTrue) progress card.select_one(.progress).get_text(stripTrue) parsed_games.append({ title: title, trophies: trophies, progress: progress, updated_at: time.strftime(%Y-%m-%d %H:%M:%S), }) # 3. 清洗去除多余空白、统一字段格式 cleaned_games [] for item in parsed_games: cleaned_games.append({ title: item[title].replace(\\n, ).strip(), trophies: item[trophies], progress: item[progress].replace(%, ).strip(), updated_at: item[updated_at], }) # 4. 写入SQLite conn sqlite3.connect(anyps5.db) cursor conn.cursor() cursor.execute( CREATE TABLE IF NOT EXISTS game_progress ( title TEXT PRIMARY KEY, trophies TEXT, progress INTEGER, updated_at TEXT ) ) for g in cleaned_games: cursor.execute( INSERT OR REPLACE INTO game_progress (title, trophies, progress, updated_at) VALUES (?, ?, ?, ?), (g[title], g[trophies], g[progress], g[updated_at]), ) conn.commit() conn.close() # 输出标准JSON供前端读取 print(json.dumps(cleaned_games, ensure_asciiFalse, indent2))这段代码的核心点在于“INSERT OR REPLACE”——同一个游戏如果之前收录过第二次跑就会直接更新进度而不是产生重复记录。这个增量更新逻辑保证了数据库始终处于最新状态。前端展示我用Vue3写了一个很简单的卡片页面读本地生成的json文件再配合SQLite查询做排序和统计。Tauri里读取本地SQLite很简单用sqlite3连接后执行查询就行。举个例子展示“白金游戏数量”// Tauri前端侧通过invoke调用本地的SQLite查询能力 const { invoke } window.__TAURI__.core; async function loadPlatinumCount() { const count await invoke(query_platinum_count); document.querySelector(#platinum-count).innerText count 座白金; } loadPlatinumCount();至于Tauri后端Rust侧怎么注册这个query_platinum_count命令对流调参大家各显神通官方文档里也有现成例子这里就不展开堆代码了。重点是整条链路打通之后奖杯页的更新只需要一键本地看板立刻就能反映最新进度。我平时最常用的场景每周一早上跑一次脚本然后翻一眼本周新增奖杯顺便统计下上周的游戏时间分布成为周报一样的东西。3.3 细节打磨时区差、外服账号与缩略图生成的几个坑实际操作里最坑的往往不是架构而是小细节。第一个是时区问题。PSN公开页面显示的时间基本是UTC直接入库就会出现“我今天上午看到的奖杯时间戳却写着昨天”。解决方法是统一在入库前转成本地时区并且以后所有展示都基于本地时间避免同一条记录在不同设备上看起来时间不一致。第二个是账号设置的差异。如果PSN隐私设置里没有勾选“公开游戏进度”第三方页面就拉不到数据。这个不是程序能绕过的需要用户自己在主机的账号设置里改。我写进使用说明的第一条就是“先检查账号公开度”。见过好几个朋友说“工具不好使”我远程一看全是这里没开。第三个是缩略图生成的取舍。刚开始我把所有原图全量转WebP结果第一次跑上万张图片时CPU直接满了好几分钟。后来改成只在首次导入时生成缩略图后面每新增一批才处理新文件并且加了个并发数限制避免把整台电脑卡死。永远不要在用户正在打游戏的时候后台跑全量转码这是被骂过才记住的教训。4. 实际使用流与常见问题排查4.1 我自己的每周使用流工具做完到现在稳定用了大半年说说日常是怎么跑的。每周一早上我双击一下AnyPS5的“刷新数据”按钮它会做三件事拉一次最新奖杯数据、抓一次愿望单价格、扫描一遍本地截图目录看有没有新增。全流程大概一分钟然后我花五分钟看一遍看板“新拿了几个杯”“上周哪个游戏时长第一”“愿望单里有没有降到心理价位的”。这个动作已经变成习惯跟每周看一次游戏新闻一样自然。月底的时候用途更明确把SQLite文件备份到移动硬盘顺便把本月的截图精选一批导出来按游戏归档。朋友们问我“你上个月玩了多少小时”我现在可以直接报数字这就是工具给我带来的底气。最大感受不是效率提升了多少而是游戏生活从“玩完就忘”变成了“玩完有痕迹”。4.2 常见问题速查表问题原因处理方式拉不到奖杯数据 / 提示账号不存在PSN隐私设置未公开游戏进度到主机设置里把“游戏进度”公开保存后再重试抓取频率过高导致页面短暂限制短时间内频繁请求公开页面限制为每天一次单次延迟至少5秒如果遇到限制等24小时再试截图导入时CPU占用过高一次性全量转缩略图改成按批次处理最多同时转4张新增文件优先处理数据库文件损坏 / 打开报错SQLite突然中断写入定期用官方sqlite3工具执行PRAGMA integrity_check日常先备份再更新游戏时长数据精度不足公开页面只有粗粒度时长按快照差值估算不追求分钟级精度想精确就配合主机系统统计前端页面白屏无反应Tauri本地WebView缓存问题清除应用缓存目录重新加载页面大部分情况能解决这里有一条经验值得单独说任何本地工具都要把“数据备份”放在功能之前。SQLite单文件备份太方便了但正因为方便反而容易忘记。我现在给AnyPS5加了一个启动检查如果发现数据库文件的修改时间超过7天就会在页面右上角弹一个小提醒“该备份了”。这功能写起来很简单但价值极高它帮我把自己的项目也纳入到了“存档备份”的习惯里。4.3 下一步还能加什么目前AnyPS5对我来说已经够用但心里也列了后续可扩展的清单。一是多账号汇总身边有人会和朋友共用一个账号打杯如果能把两个账号数据合到一张综合页里看板会更有趣。二是移动端适配目前电脑上看很舒服但有时用手机想看一眼奖杯进度还得开电脑未来可以做一个只读访问的本地网络页面同一局域网内手机直接打开不搞远程服务器那套复杂的东西。三是再往前一步的统计维度比如按月生成“游戏时间日历热力图”把每天玩了多少小时铺成色块视觉效果会很直观。这些想法都还在备选池里暂时不着急先把当前版本用到足够顺手再说。最后分享一点个人体会。做AnyPS5最大的收获其实不是工具本身而是重新整理了一遍自己与游戏数据的关系。以前总觉得官方App给什么就看什么习惯了被产品定义“你能看到什么”真正自己动手之后才发现很多数据一直都在那里只是等你去取。很多人说玩PS5就是图个放松折腾工具不算放松但对我来说看着自己游戏生涯的零碎记录聚合成一张张清晰的看板那种满足感不亚于白金跳杯的瞬间。如果你手里正攒着一堆截图也想把游戏档案整理清楚不妨从这五个模块里挑一个最让你头疼的先动手做做看。踩过坑、解决掉麻烦之后你会觉得主机游戏的数据世界其实比想象中更开阔。