胖胖Ω 发表于 2024-1-8 15:53

关于Splatoon3战绩记录分析网站 stat.ink 及从ikawidget导入的尝试

本帖最后由 胖胖Ω 于 2024-4-29 21:35 编辑

2024-4-29 更新:
成功将ikawidget3和salmdroidNW的备份数据上传到stat.ink了!方法发在了9楼



2024-1-8 原贴:

楼主2023年五月时退坑的。刚好那时老任以“第三方APP可能会威胁个人信息安全”等理由,把ikawidget、salmdroid等都干了。近期准备回坑轻度玩玩,找能够备份战绩的替代品,于是找到了 stat.ink。

关于该网站的介绍已经有很多了:

stat.ink FAQ
记录分析《斯普拉遁3》个人数据的网站Stat.ink(含教程)
用splatnet2statink记录splatoon2的对战结果

(该网站几年前也看到过,当时ikawidget用得很顺手,也就没太在意其他功能类似的,结果如今再次遇到)

stat.ink只是个数据记录/分析的网站,本身与SplatNet并不相连,数据都是玩家上传的,所以老任也没理由干涉它。(连接SplatNet获取战绩并上传的是s3s、s3si.ts这些脚本,在本地计算机运行不经过第三方,也不属于老任要取缔的第三方APP)

按照教程很顺利地用脚本s3s上传了最近50场对战和打工记录到了stat.ink上。呜呼呼~这样子就可以安心回坑了~


然后想把以前在ikawidget3上保存的记录也上传到这个网站上,目前为止还没成功。

第一步ikawidget3上导出数据就不顺利,找半天找不到导出按钮在哪,设置里没有,Account界面只有一个导入数据,最后在Account界面点了自己的头像才终于看到导出数据按钮。点击导出,app直接卡死,尝试多次都是这样= =。最后一次点导出后手机扔那去睡午觉,睡醒一看让我选择保存路径了,看来是数据太多需要时间处理,没做进度条,所以跟卡死了一样。

脚本s3s有个“ -i ”指令,可以上传本地结果,又找到了Leanny的 ikawidget3tosplatnet 可以把ikawidget3的数据库转化为原始(raw)的SplatNet的输出。成功用ikawidget3tosplatnet把ikawidget3的数据转化为.json。(Leanny在README里写的命令“python cblite.exe .ikax3”没用起来,试了之后用“python convert.py cblite.exe .ikax3”成功了)(累积数千条记录的这个.json足有520MB,我用VSCode打开都报长度过长)
然而s3s的“ -i ”指令要有两个输入参数,似乎只能用于把从stat.ink里导出到本地的数据导入回去?不能直接把SplatNet的输出上传进去。目前也没找到其他的上传方法。

在NGA看到了国人开发的APP“法螺湾”​[有新玩意儿] 做了一个3代对战与鲑鱼跑记录app——法螺湾,支持导入ikawidget3、salmdroidNW等的数据,也支持导出成原始数据,但是问题跟刚才一样,导出之后不知道怎么传到stat.ink上。

如果哪位知道能够导入的方法或者工具,希望不吝赐教!


顺便想起2019年二代退坑时有从ikawidget2里备份数据,想把二代的数据也上传进去。

在github上找到了 ikaWidget2stat.ink,作者跟s3si.ts是同一位,似乎是国人开发者。
推特(X)上看到有人用这个成功上传了2代的数据:



把ikawidget2的备份数据.ikax改后缀名为.zip,解压得到stats.realm文件。安装node.js跑这个脚本,报错说少“realm”模块。用“npm install --dependencies”安装依赖,失败。
想着是不是node版本太高了?于是卸载,重装了winget里能搜到的版本最旧的Nodejs.LTS 10.23.2版本,再次运行npm install --dependencies,居然真的安装成功了!?再次用指令“node index.js ./stats.realm <stat.ink API key>”,成功运行!

12分钟后,2018年2月 至 2019年6月 用ikawidget2记录的3600+场对战记录全部上传。没想到当年退坑时保存的数据现在还能再次看到,略感动~

胖胖Ω 发表于 2024-4-29 21:36

本帖最后由 胖胖Ω 于 2024-4-29 21:49 编辑

感谢法螺湾作者@xzh1206 老师更新了把法螺湾的记录数据导出成s3s格式的脚本,可以通过这个来把备份数据上传到stat.ink。

[*]将IKAX3转换为法螺湾记录JSON:Import data from ikawidget3
[*]将法螺湾记录JSON转换为s3s导出文件:Export data to s3s and upload to stat.ink
[*]通过s3s上传到stat.ink

需要注意的是,ikawidget3对数据库中的玩家信息进行了加密,加密后超过了玩家名的字符数上限。如果直接用s3s上传会报错 "name: Name should contain at most 10 characters." 。可以用s3s的 --blackout 参数抹掉其他玩家名,但s3s不会抹掉玩家自己的名字,此时有两种方法:


[*]修改s3s.py的代码
搜索 if player["me"] == "no": ,0.6.4版本的s3s大概在第814(对战)和1143行(打工),在旁边加一个 =='yes' 的情况,if player["me"] == "yes": player["name"] = "自己的名字"
原本s3s.py的代码:(直接用下面的覆盖到同样的地方)(注意每行前的缩进动,要跟原本的一致。tab和空格也不建议混用)

                        if player["me"] == "no": # only black out others
                              player["name"] = None
                              player["number"] = None
                              player["splashtag_title"] = None

修改后:

                        if player["me"] == "no": # only black out others
                              player["name"] = None
                              player["number"] = None
                              player["splashtag_title"] = None
                        if player["me"] == "yes":
                              player["name"] = "你的名字"


[*]用编辑器批量修改自己的玩家名(推荐)

[*]比如VSCode,打开结果保存的文件夹,全局搜索 "player": {"name": ,如果能搜出来多个结果,后面的那串就是自己的玩家名加密后的文本。

[*]全局搜索那串文本,全部替换为自己的名字


一些其他的可能的问题:


[*]命令行运行脚本无反应
把命令行的“python3”换成“python”
[*]报错 UnicodeDecodeError: 'gbk' codec can't decode byte 0xab in position 13000: illegal multibyte sequence
可能是玩家名有些字符gbk编码里没有。可以修改一行s3s.py的代码,让其打开文件时用utf-8编码打开。搜索 with open(os.path.join(file_paths, json_file)),修改为 with open(os.path.join(file_paths, json_file), encoding='utf-8')
[*]报错 Could not upload. Please contact @frozenpandaman on GitHub for assistance.
s3s.py运行时会检查一遍自己的文件名,跟原文件名不一致会弹这个。故改代码时不要改文件名(或者把检查文件名的这行代码注释掉)

一切顺利的话应该就能上传旧数据了,像这样:



(称号部分是英文,介意这个又不嫌麻烦的话可以在上传前对文本全局搜索然后批量替换……)

建议不要一次上传全部,先放一小部分到results文件夹里试试,上传结果没问题再把剩下的传上去。

胖胖Ω 发表于 2024-4-29 21:45

关于salmdroidNW的数据上传stat.ink,salmdroidNW的数据没加密玩家名,不用ikawidget3的--blackout那步,但有其他的一些坑,要改不少代码:


[*]报错 (!) Proceeding without weapon names. See https://github.com/frozenpandaman/s3s/issues/95 to fix this.
salmdroid似乎是把武器名等数据保存为日文,但s3s要求英文,日文也能上传但武器名会为空。点进作者给出的这个issue,解决方法是使用Mysterium-Mystery的fork版本,该fork版本会查译名字典并将不同语言的翻译转换为英文。该fork是2022年12月版本的,后续版本的一些信息可能不支持(比如团队打工竞赛),所以最好从中抄代码到新版的s3s里。(几处“WLDFile”相关的代码)

[*]下载Mysterium-Mystery的fork版本,把Splat3_WPLangDict.json文件复制到新版的s3s.py的目录下
[*]补足一些这个译名字典里缺少的,在最下面的大括号之前添加这些:(逗号不能丢,加在原本的最后一条后面)
,
    "\u30af\u30de\u30b5\u30f3\u5370\u306e\u30d6\u30e9\u30b9\u30bf\u30fc": "Grizzco Blaster",
    "\u30af\u30de\u30b5\u30f3\u5370\u306e\u30c1\u30e3\u30fc\u30b8\u30e3\u30fc": "Grizzco Charger",
    "\u30af\u30de\u30b5\u30f3\u5370\u306e\u30b9\u30c8\u30ea\u30f3\u30ac\u30fc": "Grizzco Stringer",
    "\u30af\u30de\u30b5\u30f3\u5370\u306e\u30b7\u30a7\u30eb\u30bf\u30fc": "Grizzco Brella",
    "\u30af\u30de\u30b5\u30f3\u5370\u306e\u30ef\u30a4\u30d1\u30fc": "Grizzco Splatana",
    "\u30af\u30de\u30b5\u30f3\u5370\u306e\u30b9\u30ed\u30c3\u30b7\u30e3\u30fc": "Grizzco Slosher",
    "\u30e9\u30f3\u30c0\u30e0": "random"

[*]抄代码到新版s3s.py,第18行左右插入一行:

WLDFile = os.path.join(os.getcwd(), "Splat3_WPLangDict.json");

[*]继续抄代码到新版s3s.py:

原本s3s.py的代码:(直接用下面的覆盖到同样的地方)

                weapons = []
                gave_warning = False
                for weapon in player["weapons"]: # should always be returned in in english due to headbutt() using forcelang
                        wep_string = weapon["name"].lower().replace(" ", "_").replace("-", "_").replace(".", "").replace("'", "")


修改后:

                with open(WLDFile, encoding="utf-8") as File:
                        WLData = json.load(File);

                weapons = []
                gave_warning = False
                for weapon in player["weapons"]: # should always be returned in in english due to headbutt() using forcelang
                        EngWep = WLData.get(weapon["name"]);
                        #print(f"{weapon['name']} : {EngWep}");

                        if (EngWep == None):
                              print(f"Is {weapon['name']} a translation of ""random""? Input (y/n) for yes / no");
                              Inp = input().lower();

                              if (Inp == "y"):
                                        WLData.update({weapon["name"]:"random"});
                                        with open(WLDFile, "w" ,encoding="utf-8") as File:
                                                json.dump(WLData, File, indent=4);
                              elif (Inp == "n"):
                                        print(f"Input translation for {weapon['name']}:");
                                        WLData.update({weapon["name"]:input()});
                                        with open(WLDFile, "w" ,encoding="utf-8") as File:
                                                json.dump(WLData, File, indent=4);
                              else:
                                        print("Invalid Input... Continuing execution (This will most likely result in an error)");

                        wep_string = EngWep.lower().replace(" ", "_").replace("-", "_").replace(".", "").replace("'", "");



[*]报错 KeyError: 'weaponId'
游戏本体更新2.0版之后,打工记录做了一些改动。2022.11及之前的版本,打工大招的键名为“id”,数值为base64编码;2022.12及之后的版本,打工大招的键名为“weaponId”,数值为5位数字。而2022.12之后的版本,salmdroid中打工大招的键名仍为“id”,数值改为了5位数字。所以s3s按旧版的读取就会报错。需要修改s3s代码。

原本s3s.py的代码:(直接用下面的覆盖到同样的地方)

                        try:
                              special_id = player["specialWeapon"]["weaponId"] # post-v2.0.0 key
                        except KeyError:
                              special_id = utils.b64d(player["specialWeapon"]["id"])


修改后:

                        try:
                              special_id = player["specialWeapon"]["weaponId"] # post-v2.0.0 key
                        except KeyError:
                              if(len(player["specialWeapon"]["id"]) <= 5): # for salmdroid data
                                        special_id = int(player["specialWeapon"]["id"])
                              else:
                                        special_id = utils.b64d(player["specialWeapon"]["id"])




如果一切顺利的话,上传后像这样:


称号那栏左边(上一局结束后的分数)是问号,似乎是s3s上传时上一次称号是从overview.json文件里读的,我们用的overview是空文件,所以会这样。嘛,反正这个也没什么用,知道结果可以反推开始时的分数

hbxsdfx 发表于 2024-1-8 16:52

Nintendo switch online不能满足需求吗

胖胖Ω 发表于 2024-1-8 17:29

hbxsdfx 发表于 2024-1-8 16:52
Nintendo switch online不能满足需求吗

Nintendo Switch Online只能满足最近50场的需求

hbxsdfx 发表于 2024-1-8 17:44

胖胖Ω 发表于 2024-1-8 17:29
Nintendo Switch Online只能满足最近50场的需求

刚看了下,25胜25负...不知道是巧合还是算法的结果...

星野航 发表于 2024-1-8 23:04

hbxsdfx 发表于 2024-1-8 18:44
刚看了下,25胜25负...不知道是巧合还是算法的结果...

不算是巧合,局数一多,如果不是进入了一个水平跟自己差别较大的环境里,老任的匹配算法基本上可以保证胜率在五成上下浮动,基本不存在什么特殊情况

星野航 发表于 2024-1-8 23:13

不太行,貌似stat.ink本身也不支持原生数据导入,但是stat.ink开放了API,你可以自己做一个转置再导入
2代的话,可以参考https://qiita.com/hadacchi/items/79aedab7616b72b9f3ac
不过貌似楼主你已经导入成功了w
那就没什么意义了

胖胖Ω 发表于 2024-1-9 12:39

星野航 发表于 2024-1-8 23:13
不太行,貌似stat.ink本身也不支持原生数据导入,但是stat.ink开放了API,你可以自己做一个转置再导入
2代 ...

唔,看来短时间内是没办法了。但还是谢谢了

胖胖Ω 发表于 2024-1-9 12:40

昨晚回坑打了会儿,打工能保400分了好评!这个分段对现在的我来说压力挺大的,好在可以主动降段。

涂地……马上就连败→上头→继续连败,9战2胜7负耻辱关机。死去的记忆开始攻击我了,这样是没有快乐的!任天堂你就这么对待我一个退坑几季的老鱿,上来就给我6连负。

胖胖Ω 发表于 2024-4-29 21:56

至此,终于成功把所有自己的旧数据都上传到了stat.ink,可以统一查看管理新老数据了



上传速度很慢(可能是因为我跟stat.ink连接不畅)。打工数据大概一分钟10-11条,对战数据一分钟6-8条。总共上传了打工和对战数据各2000+条,总共耗时约6-8小时。
页: [1]
查看完整版本: 关于Splatoon3战绩记录分析网站 stat.ink 及从ikawidget导入的尝试