xmdhs's blog

弄一个显示 arcaea ptt 的签名档

xmdhs

说的就是这个

之前弄的一个虽然没啥用,但是能方便我看成绩评价的东西。

如何实现的呢?说起来也是很简单的。

抓包

首先得先找到 arcaea 的 api,获取数据才能生成图片嘛。网上并没有找到什么有用的文档,所以就只能自己抓包了。

用来抓包的软件是 httpcanary。因为安卓的某些安全机制,导致无法直接抓包。

软件上的建议是用“平行空间”安装软件,然后进行抓包。但是因为 arcaea 的某些机制还是什么,导致“平行空间”克隆后软件无法使用。

所以我就试着把游戏安装到 virtualxposed,然后尝试抓包 virtualxposed。结果当然是成功了。不过如果有 root 权限或者用 ios 设备,就不用这么麻烦了。

GET /11/compose/aggregate?calls=%5B%7B%20%22endpoint%22%3A%20%22%2Fuser%2Fme%22%2C%20%22id%22%3A%200%20%7D%5D HTTP/1.1
Accept-Encoding: identity
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Authorization: Bearer LgSB/********
Platform: android
AppVersion: 2.6.1c
i: 2550615
User-Agent: Dalvik/2.1.0 (Linux; U; Android 10; GM1900 Build/QKQ1.190716.003)
Host: arcapi.lowiro.com
Connection: Keep-Alive

具体的发送请求抓包下来的数据就是类似这样,不过 api 也是会发生改变的,所以还是得自己去抓包。

这个请求是获取好友列表的数据的。关键的在 Authorization,这个应该是账号相关。

响应的数据是 json,具体示例太长,就放在这个链接里。https://paste.ubuntu.com/p/5y5NZTJ8JV/

大概其中的字段,猜也能猜出是什么含义吧。对于我要做签名档,有用的部分就是

           "friends": [
                {
                    "is_mutual": false,
                    "is_char_uncapped_override": false,
                    "is_char_uncapped": true,
                    "is_skill_sealed": false,
                    "rating": 961,
                    "join_date": 1572538347498,
                    "character": 2,
                    "recent_score": [
                        {
                            "rating": 0,
                            "modifier": 2,
                            "time_played": 1587250285320,
                            "health": -1,
                            "best_clear_type": 0,
                            "clear_type": 0,
                            "miss_count": 476,
                            "near_count": 0,
                            "perfect_count": 0,
                            "shiny_perfect_count": 0,
                            "score": 0,
                            "difficulty": 0,
                            "song_id": "pragmatism"
                        }
                    ],
                    "name": "xmdhs",
                    "user_id": 2476615
                }
            ],

其中就是好友的一些基本信息,和最后一次打的歌了,具体的数值的对应关系,可以看我下面放出的签名档的源码。

所以要获取信息,还得创建一个小号,然后添加你的大号为好友。

然后要做的就很简单了,随便用个语言,画图,填字,生成图片然后弄个 http 的服务器就行了。

开源

一共用了两种语言去写过,Java 的懒得维护而且占内存太大,没用框架估计性能不如 Go,就没去管了。Go 写的是可以用的。

不过 java 的其中的一些注释还是有用的,比如

            public String name;//名字
            public String rating;//ptt
            public List<Recent> recent_score;
            public static class Recent{
                public String clear_type; //通过类型? 0 大概是没通过, 1 是普通,5 是困难 ,3 是 p ,简单是 4,full recall 是 2.
                public String miss_count; //lost
                public String near_count; //far
                public String perfect_count; //pure
                public String shiny_perfect_count; //大 p
                public String score; //分数
                public String rating; //评价
                public String difficulty; //难度,0 为过去,1为现在,2 为未来。
                public String song_id; //曲目
                public Long time_played; //上次游玩时间,为 unix 时间戳。(毫秒
            }

不过嘛,这些已经是旧的了,新的可以看 go 版本的源码。比如 https://github.com/xmdhs/arcimg/blob/master/arcimg/json.go

xmdhs