diff --git a/README.md b/README.md index 7b4644f..b564df3 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,14 @@ LoveLive! 学园偶像祭 自用私服。 ## 文档列表 -详见 `doc` 目录。 +详见 [docs](./docs/README.md) 目录。 ## 视频教程 - [合集·SIF、AS 私服(本地服)搭建教程](https://space.bilibili.com/671443/lists/2148053) ## 特别感谢 - - 虹原翼 (yazawa@niconi.co.ni) @ [LLSIF 查卡器 -](https://card.niconi.co.ni/) 的技术支持。 + - 虹原翼 @ [LLSIF 查卡器 +](https://card.ganbaru.by/) 的技术支持。 - tungnotpunk @ LL Hax 在 iOS 客户端修改方面的支持。 - 其他可能一时没想起来的大佬们和项目。 diff --git a/doc/1.md b/doc/1.md deleted file mode 100644 index 897c5ec..0000000 --- a/doc/1.md +++ /dev/null @@ -1,27 +0,0 @@ -## 其一:文件准备 - -### 所需文件清单 - -1. 私服服务端 honoka-chan,也就是本项目以及运行所需的 Go 环境。 -2. 原始客户端,包含 Android 和 iOS 两个平台,根据自己需求决定。 -3. 原始全量数据包,同上。 -4. Git,用于同步程序更新。 -5. \[Android only] Java JRE (JDK) 提供 keytool,用于生成客户端签名所需要的 keystore 文件。 -6. \[Android only] Apktool,用于拆封安卓客户端。 -7. \[Android only] Android SDK 提供 apksigner,用于签名 apk 文件。 -8. \[iOS only] 爱思助手等提供 IPA 签名功能的工具以及自己的苹果账号。 -9. \[iOS only] HxD Hex Editor,用于修改 iOS 客户端。 -10. 一台电脑以及手机用来干上面的活。 - -### 下载地址 - -Linux 系统直接用包管理工具安装即可,以下为 Windows 用户需要的下载地址。 - - - Go: https://go.dev/dl/ - - Git for Windows: https://github.com/git-for-windows/git/releases - - JRE (JDK): https://www.java.com/download/ie_manual.jsp - - Apktool: https://ibotpeaches.github.io/Apktool/install/ - - Android SDK: 由于 Android SDK 官方未提供单独的下载地址,可以使用 Android Studio 下载或者第三方网站下载(安全未知),例如 https://androidsdkmanager.azurewebsites.net/Buildtools - - HxD Hex Editor: https://mh-nexus.de/en/downloads.php?product=HxD20 - - SIF 客户端: 链接: https://pan.baidu.com/s/1CRxw1JtEDRRzIxknXYMIaA?pwd=sif1 提取码: sif1 或 https://mercari-my.sharepoint.com/:f:/g/personal/sakana_mercari_onmicrosoft_com/IgBUbQY4zT3oTZHSkULr3z6pAcfgK-k9OdvXTa8ZkqpoObY 两个链接内容相同,任选其一下载即可。 - - SIF 全量数据: 同 SIF 客户端下载地址。数据包目录中的 list_CN_Android 和 list_CN_iOS。 diff --git a/doc/2.md b/doc/2.md deleted file mode 100644 index 3a92bcf..0000000 --- a/doc/2.md +++ /dev/null @@ -1,112 +0,0 @@ -## 其二:SIF 客户端修改 - -SIF 客户端修改分为 Android 和 iOS 两个平台。 - -### 生成 RSA 密钥对 - -本程序已提供了一对 RSA 密钥,如果有需要自己生成的话,可以直接调用程序中的 `encrypt/rsa.go` 中的 `RSA_Gen` 函数生成,注意长度要用 1024。官方用的是 1024,太长的话 iOS 客户端进行 Hex 替换的时候会被截断。 - -### 生成 apk 签名用的 keystore - -使用命令 `keytool -genkeypair -v -keystore sifkey.keystore -alias sifkey -keyalg RSA -keysize 2048 -validity 36500` 生成 keystore,密码自己设置,其他信息可以都默认回车即可。 - -生成的 `sifkey.keystore` 就是我们需要的。 - -### SIF 客户端修改(Android) - -因为盛趣在原有日服客户端基础上,外面又套了一层自家的账号验证接口(手机号登录之类的)。所以客户端修改分为三个部分: -1. 盛趣相关接口地址的替换 -2. 客户端公钥的替换 -3. 客户端请求接口的替换 - -#### 盛趣相关接口地址的替换 - -使用 Apktool 反编译 apk 后,在 smali 代码里搜索 `sdo.com` 关键字,将地址替换成服务器的 IP 地址或者域名。 - -参考修改:https://github.com/YumeMichi/llsif-cn-client/commit/c8dba0c2ad5d274f5d0d8e346808a1b006d137ba - -注意:使用 sed 替换可能会导致重新打包后的 apk 文件无法使用,暂时不知道是什么原因,可能需要手动改过去。 - -#### 客户端公钥的替换 - -原本这步是应该替换 so 库里的公钥的,但是因为 SIF 有好几个不同架构的库你可能都要改一遍,所以还是直接在 Java 代码里写死吧嗯~ o(* ̄▽ ̄*)o - -参考修改:https://github.com/YumeMichi/llsif-cn-client/commit/4b36dd48b26467b4dd1e1f479540645788c58f9a - -#### 客户端请求接口的替换 - -SIF 的接口地址是写在数据包里,数据包又是经过加密。 - -1. 在 Apktool 解包目录下找到 `assets/AppAssets.zip`,解压到临时目录中 -2. 使用 [honky-py](https://github.com/DarkEnergyProcessor/honky-py) 将解压出来的 `config/server_info.json` 解密出来 -3. 修改解密后的 `server_info.json`,将其中的 `prod.game1.ll.sdo.com` 替换成服务器 IP 或者域名 -4. 使用 [honky-py](https://github.com/DarkEnergyProcessor/honky-py) 将修改后的 `server_info.json` 重新加密 -5. 将解压后的文件重新打包为 `assets/AppAssets.zip` -6. 更新 `assets/version` 文件中的 MD5 值 - -修改完最后通过 Apktool 重新打包成 apk 文件,然后使用 `apksigner sign --ks sifkey.keystore --ks-key-alias sifkey --out signed.apk unsigned.apk` 签名,使用前面生成的 keystore。 - -### SIF 客户端修改(iOS) - -iOS 客户端需要替换的东西跟 Android 客户端差不多,只不过位置不一样以及修改方式不一样。包含以下几个部分: -1. 盛趣相关接口地址的替换 -2. 客户端公钥和证书的替换 -3. 客户端请求接口的替换 - -#### 盛趣相关接口地址的替换 - -先将 ipa 文件作为 zip 解压,进入 `Payload\Love Live!.app` 目录,找到 `Frameworks\ghome_sdk.framework\ghome_sdk` 文件,拖入 HxD Hex Editor。 - -搜索 `mgame.sdo.com`,替换成服务器 IP 或者域名。***这里有个坑,替换的 IP 或者域名长度必须和原来的一致,短了填 0 直接炸。不知道什么原因~*** - -#### 客户端公钥和证书的替换 - -在 Android 客户端中,盛趣接口通信所使用的 RSA 公钥是通过 `/basic/publickey` 接口获取的,在 iOS 客户端中则是写死的,这也是为什么前文生成 RSA 密钥对的时候要使用 1024 长度的原因。 - -由于 iOS 客户端使用的都是 RSA 公钥证书,不是 Android 客户端中使用的 RSA 普通公钥,所以需要使用 RSA 私钥生成一个 RSA 公钥证书文件和相应的 base64。 - -使用的命令如下: -```bash -openssl req -new -x509 -key privatekey.pem -sha1 -out ca.crt -days 36500 # 信息可以填一下或者全部回车 -openssl req -new -key privatekey.pem -sha1 -out server.csr # 同上 -openssl x509 -req -days 36500 -in server.csr -CA ca.crt -CAkey privatekey.pem -CAcreateserial -sha1 -out server.crt -``` - -其中 `server.crt` 就是需要的文件。打开可以发现里面也是一串 bas64。删掉头尾的 `-----BEGIN CERTIFICATE-----` 和 `-----END CERTIFICATE-----` 仅保留中间的 base64 部分,将回车符号去掉后备用。 - -回来继续修改上文中的 `ghome_sdk` 文件,就在上文搜索的 `handshake` 接口下面就是写死的盛趣接口通信用的公钥证书的 base64,长度有十六进制 384(也就是十进制 900)。使用 `A` 填充生成的 server.crt 到 900 长度,例如 `...OSn+C3wAAAAAAAA...AAAAAAAA==`,然后替换掉原先的 base64。 - -接下来还需要替换游戏通信接口所使用的公钥,也就是 Android 客户端那节中的公钥,只不过 iOS 上换成了公钥证书(不是 base64)。 - -生成公钥证书只需要将上面的 base64 decode 出来即可。因为 decode 出来不是可读文本,所以还是用程序处理吧。示例代码: -```golang - b, err := base64.StdEncoding.DecodeString(utils.ReadAllText("server.crt")) - if err != nil { - panic(err) - } - utils.WriteAllText("certificate.crt", string(b)) -``` - -生成的 `certificate.crt` 就是需要的公钥证书,将该文件拖入 HxD Hex Editor。 - -接下来进入 `Payload\Love Live!.app` 目录,找到 `Love Live!` 文件,拖入 HxD Hex Editor。 - -搜索关键字 `Shanghai`,很容易定位到证书位置。选中证书范围,长度十六进制 33A(也就是十进制 826),不放心可以保存选区为 `crt` 文件,然后在 Windows 上可以直接双击打开,没问题的话会显示证书信息。 - -确认我们生成的证书 `certificate.crt` 长度没有超过 33A(肯定不会超过),将 `certificate.crt` 内容全选后覆盖 `Love Live!` 中相应长度的数据,不足 33A 的部分选择后填充 0 即可。 - -![原始证书](images/20230624174049.jpg) - -![自签证书](images/20230624181952.jpg) - -![不足的部分补零](images/20230624182015.jpg) - -#### 客户端请求接口的替换 - -iOS 客户端也是修改 `server_info.json`,进入 `Payload\Love Live!.app\ProjectResources\config`,将其中的 `server_info.json` 解密后替换 `prod.game1.ll.sdo.com` 为你的服务器 IP 或者域名,再加密后替换掉该文件即可。 - -最后将修改完的整个 `Payload` 目录打包成 zip 文件,然后扩展名改成 ipa。打开爱思助手,在工具箱里找到 `IPA 签名`,添加 IPA 文件,选择 `使用 Apple ID 签名`,登录自己的苹果账号,开始签名。 - -最后打开存储目录,将生成的 ipa 文件拖入爱思助手安装到手机(平板上)。 - -安装后的应用无法直接打开,需要到 `系统设置 - 通用 - VPN 与设备管理`,在 `开发者 APP` 下将账号设置信任后才可以运行。另外,个人苹果账号签名有效期只有 7 天,所以 7 天后需要再重新签名安装。 diff --git a/doc/3.md b/doc/3.md deleted file mode 100644 index cd4e122..0000000 --- a/doc/3.md +++ /dev/null @@ -1,45 +0,0 @@ -## 其三:服务端部署 - -### 主程序部署 - -首先确认已经安装了 Go 环境以及 Git 工具,然后 `git clone https://github.com/YumeMichi/honoka-chan` 到你需要托管的服务器或者本地。 - -进入 `honoka-chan` 文件夹,执行 `go build` 编译,会自动下载依赖。 - -编译完成运行 `honoka-chan.exe` 即可,Linux 上可执行文件为 `honoka-chan`。 - -如果你在 Linux 上希望常驻运行并方便管理进程,可以直接使用项目根目录下的 `run.sh`: - -```bash -./run.sh start -./run.sh stop -./run.sh restart -./run.sh status -./run.sh logs -``` - -说明: - -- `start` 会以 `nohup` 后台运行 `honoka-chan`,如果可执行文件不存在则自动执行 `go build -o honoka-chan main.go`。 -- PID 文件:`temp/run/honoka-chan.pid` -- 日志文件:`temp/run/honoka-chan.log` - -### 下载服务部署 - -#### SIF 数据下载服务 - -下载 [一:文件准备](./1.md) 篇中的 SIF 全量数据,解压出 `list_CN_iOS` 和 `list_CN_Android` 两个文件夹。 - -在本程序目录下的 `static` 目录下新建 `Android` 和 `iOS` 两个文件夹,然后将上面解压的两个文件夹按照对应系统移动到新建的这两个文件夹里,并将 `list_CN_iOS` 和 `list_CN_Android` 都改名为 `archives`。最后目录结构为 `static\iOS\archives` 和 `static\Android\archives`。 - -如果只需要其中一个系统的数据包比如你不用苹果设备,可以删掉不用的。 - -由于数据包中也包含了盛趣服务器地址,所以为了不再次修改游戏配置文件,可以通过添加一个数据包,其中包含了修改过的服务器地址,并使其最后一个下载,这样会覆盖盛趣的服务器地址。 - -这里以 iOS 为例,进入 `static\iOS\archives`,可以发现 `99` 的数据包最后一个为 `99_0_114.zip`。复制 `99_0_113.zip` 为 `99_0_115.zip`,打开压缩包,删除没用 `client_info.json`,然后将 `server_info.json` 解压出来。 - -按照 [二:客户端修改](./2.md) 中同样的方法解密文件、修改地址、重新加密后替换压缩包内的文件即可。 - -Android 也是同样的操作。 - -如果要将数据下载服务托管到云服务器,将 `static\Android` 和 `static\iOS` 这两个目录都上传到云服务器,然后自行建个 http 服务器即可,这里就不赘述了。 diff --git a/doc/4.md b/doc/4.md deleted file mode 100644 index fdd9127..0000000 --- a/doc/4.md +++ /dev/null @@ -1,19 +0,0 @@ -## 其四:运行测试 - -如果前面的操作都没问题的话,服务端已经可以使用。 - -启动游戏,查看 `honoka-chan` 窗口输出,第一次运行会生成配置文件 `config.json`。打开该文件,设置好 `sif_cdn_server`,如果你是按前面的操作,数据都放在本程序的 `static` 目录下的话,那就改成你的服务器地址+`static` 就行,类似默认生成的 `http://192.168.1.123/static`。如果你有自己的服务器存放更新数据,设置成相应地址即可。 - -如果 `cdn_server/{系统}/archives/99_0_115.zip` 存在,服务端会自动把它追加到更新下载列表中;如果该文件不存在,则会直接跳过。 - -登录方式为 `手机号密码登录`,都可以随便输。第一次使用的手机号会自动生成账号并记住登录的密码,以及后续的游戏内设置都会保存。 - -### SIF 测试 - -按照提示下载数据,确认下载正常。 - -下载完毕可以进入游戏。 - -### 补充 - -SIF 的全量数据下载实际上并不是全量,部分剧情还是需要调用 `/download/getUrl` 接口下载指定的文件。所以还需要维护一份 zip 全部解压后的数据,这部分内容后面再补充吧~ diff --git a/doc/README.md b/doc/README.md deleted file mode 100644 index 65d4805..0000000 --- a/doc/README.md +++ /dev/null @@ -1,6 +0,0 @@ -## 文档列表(更新中) - - - [一:文件准备](1.md) - - [二:SIF 客户端修改](2.md) - - [三:服务端部署](3.md) - - [四:运行测试](4.md) diff --git a/docs/01-prerequisites.md b/docs/01-prerequisites.md new file mode 100644 index 0000000..e006e93 --- /dev/null +++ b/docs/01-prerequisites.md @@ -0,0 +1,35 @@ +# 文件准备 + +## 需要准备的内容 + +1. `honoka-chan` 服务端源码,以及运行所需的 Go 环境。 +2. 原始 SIF 客户端,按需准备 Android 和 iOS 版本。 +3. 原始 SIF 全量数据包。 +4. Git,用于同步项目更新。 +5. Android 平台额外需要: + - Java JRE 或 JDK,提供 `keytool` + - Apktool,用于拆包和回编译 + - Android SDK,提供 `apksigner` +6. iOS 平台额外需要: + - 爱思助手或其他支持 IPA 签名的工具 + - 自己的 Apple ID + - HxD Hex Editor +7. 一台用于处理文件的电脑,以及至少一台测试设备。 + +## 下载地址 + +Linux 用户一般可以直接通过包管理器安装相关工具。下面列出常用的 Windows 下载地址: + +- Go: https://go.dev/dl/ +- Git for Windows: https://github.com/git-for-windows/git/releases +- Java JRE / JDK: https://www.java.com/download/ie_manual.jsp +- Apktool: https://ibotpeaches.github.io/Apktool/install/ +- Android SDK: 官方没有单独维护统一下载页,可以通过 Android Studio 安装,或者从直链下载,例如: + https://dl.google.com/android/repository/build-tools_r37_windows.zip +- HxD Hex Editor: https://mh-nexus.de/en/downloads.php?product=HxD20 +- SIF 客户端与全量数据: + - 百度网盘: https://pan.baidu.com/s/1CRxw1JtEDRRzIxknXYMIaA?pwd=sif1 + 提取码: `sif1` + - SharePoint: https://mercari-my.sharepoint.com/:f:/g/personal/sakana_mercari_onmicrosoft_com/IgBUbQY4zT3oTZHSkULr3z6pAcfgK-k9OdvXTa8ZkqpoObY + - 两个链接内容相同,任选其一即可 +- SIF 全量数据包使用其中的 `list_CN_Android` 和 `list_CN_iOS` diff --git a/docs/02-client-modification.md b/docs/02-client-modification.md new file mode 100644 index 0000000..83b74d6 --- /dev/null +++ b/docs/02-client-modification.md @@ -0,0 +1,153 @@ +# 客户端修改 + +SIF 客户端修改分为 Android 和 iOS 两个平台。两边的目标基本一致: + +1. 替换盛趣相关接口地址 +2. 替换客户端公钥或证书 +3. 替换客户端内置的游戏接口地址 + +## 生成 RSA 密钥对 + +项目里已经提供了一对 RSA 密钥。如果需要自行生成,可以调用 `encrypt/rsa.go` 中的 `RSA_Gen` 函数,长度必须使用 `1024`。 + +原因: + +- 官方使用的就是 `1024` +- iOS 客户端里有一部分证书内容是直接做 Hex 替换,长度过长会被截断 + +## 生成 Android 签名所需的 keystore + +执行下面的命令生成 keystore: + +```bash +keytool -genkeypair -v -keystore sifkey.keystore -alias sifkey -keyalg RSA -keysize 2048 -validity 36500 +``` + +密码自行设置,其他信息可以直接回车。生成后的 `sifkey.keystore` 会在 Android 重新签名时使用。 + +## Android 客户端修改 + +### 1. 替换盛趣相关接口地址 + +使用 Apktool 反编译 APK 后,在 smali 代码里搜索 `sdo.com`,将地址替换成你的服务器 IP 或域名。 + +参考修改: +https://github.com/YumeMichi/llsif-cn-client/commit/c8dba0c2ad5d274f5d0d8e346808a1b006d137ba + +注意: + +- 使用 `sed` 批量替换有概率导致重新打包后的 APK 无法使用 +- 如果出现问题,建议手动修改 + +### 2. 替换客户端公钥 + +理论上也可以直接替换 so 库里的公钥,但 SIF 有多套不同架构的 so,逐个修改比较麻烦,所以更简单的做法是直接在 Java 代码里写死。 + +参考修改: +https://github.com/YumeMichi/llsif-cn-client/commit/4b36dd48b26467b4dd1e1f479540645788c58f9a + +- [llsif-cn-client](https://github.com/YumeMichi/llsif-cn-client) 的文档中也有 so 库的 patch 方法供参考。 + +### 3. 替换客户端请求接口 + +SIF 的游戏接口地址写在数据包里,而数据包本身又经过加密。 + +处理步骤: + +1. 在 Apktool 解包目录下找到 `assets/AppAssets.zip`,先解压到临时目录 +2. 使用 [libhonoka](https://github.com/DarkEnergyProcessor/libhonoka) 解密其中的 `config/server_info.json` +3. 修改解密后的 `server_info.json`,把 `prod.game1.ll.sdo.com` 替换成你的服务器 IP 或域名 +4. 使用 [libhonoka](https://github.com/DarkEnergyProcessor/libhonoka) 重新加密修改后的 `server_info.json` +5. 重新打包 `assets/AppAssets.zip` +6. 更新 `assets/version` 文件里的 MD5 值 + +修改完成后重新用 Apktool 打包 APK,然后执行签名: + +```bash +apksigner sign --ks sifkey.keystore --ks-key-alias sifkey --out signed.apk unsigned.apk +``` + +## iOS 客户端修改 + +iOS 客户端需要做的事情和 Android 大体相同,只是位置和修改方式不一样。 + +### 1. 替换盛趣相关接口地址 + +先把 IPA 当作 ZIP 解压,进入 `Payload\Love Live!.app`,找到 `Frameworks\ghome_sdk.framework\ghome_sdk`,用 HxD 打开。 + +搜索 `mgame.sdo.com`,替换成你的服务器 IP 或域名。 + +注意: + +- 替换后的字符串长度必须和原始字符串一致 +- 长度不够时需要补 `0` +- 这里长度不一致通常会直接导致客户端崩溃 + +### 2. 替换客户端公钥和证书 + +Android 客户端使用的是通过 `/basic/publickey` 获取的 RSA 公钥;iOS 客户端把通信证书写死在二进制里,所以除了私钥,还需要生成证书。 + +执行: + +```bash +openssl req -new -x509 -key privatekey.pem -sha1 -out ca.crt -days 36500 +openssl req -new -key privatekey.pem -sha1 -out server.csr +openssl x509 -req -days 36500 -in server.csr -CA ca.crt -CAkey privatekey.pem -CAcreateserial -sha1 -out server.crt +``` + +其中 `server.crt` 就是后面要用到的证书文件。打开后可以看到是一段 base64 文本,去掉: + +- `-----BEGIN CERTIFICATE-----` +- `-----END CERTIFICATE-----` + +只保留中间内容,并去掉换行符备用。 + +接着继续修改 `ghome_sdk` 文件。搜索 `handshake` 附近,可以找到盛趣接口通信使用的证书 base64。该区域长度为十六进制 `384`,也就是十进制 `900`。 + +处理方式: + +1. 将新生成的 `server.crt` 内容补足到 `900` 长度 +2. 不足部分用 `A` 填充 +3. 替换原始 base64 + +接下来还需要替换游戏通信使用的证书。iOS 这部分不是 base64,而是证书二进制内容。 + +可以先把上面的 base64 解码成证书文件,例如: + +```go +b, err := base64.StdEncoding.DecodeString(utils.ReadAllText("server.crt")) +if err != nil { + panic(err) +} +utils.WriteAllText("certificate.crt", string(b)) +``` + +生成的 `certificate.crt` 就是目标证书。把它拖进 HxD,然后进入 `Payload\Love Live!.app`,打开 `Love Live!` 主程序文件。 + +搜索关键字 `Shanghai`,通常可以很快定位到证书位置。选中证书区域,长度为十六进制 `33A`,也就是十进制 `826`。如果不放心,可以先把选区保存成单独文件,双击确认它确实是一份证书。 + +替换时注意: + +- `certificate.crt` 的长度不能超过 `33A` +- 用新证书内容覆盖原区域 +- 不足部分补 `0` + +示意图: + +![原始证书](images/20230624174049.jpg) +![自签证书](images/20230624181952.jpg) +![不足的部分补零](images/20230624182015.jpg) + +### 3. 替换客户端请求接口 + +iOS 端同样需要修改 `server_info.json`。进入 `Payload\Love Live!.app\ProjectResources\config`,解密 `server_info.json`,把 `prod.game1.ll.sdo.com` 替换成你的服务器 IP 或域名,然后重新加密并替换原文件。 + +处理完后把整个 `Payload` 目录重新打包成 zip,再把扩展名改回 `.ipa`。然后用爱思助手里的 `IPA 签名` 功能,选择 `使用 Apple ID 签名`,登录自己的账号后开始签名。 + +最后把签名后的 IPA 安装到设备。 + +安装后的应用默认无法直接打开,需要到: + +`系统设置 -> 通用 -> VPN 与设备管理` + +在 `开发者 App` 下信任对应账号后才能运行。个人 Apple ID 签名的有效期通常只有 7 天,到期后需要重新签名安装。 diff --git a/docs/03-server-deployment.md b/docs/03-server-deployment.md new file mode 100644 index 0000000..5270881 --- /dev/null +++ b/docs/03-server-deployment.md @@ -0,0 +1,83 @@ +# 服务端部署 + +## 主程序部署 + +先确认已经安装 Go 和 Git,然后拉取项目: + +```bash +git clone https://github.com/YumeMichi/honoka-chan +cd honoka-chan +``` + +编译: + +```bash +go build +``` + +编译完成后,Windows 直接运行 `honoka-chan.exe`,Linux 运行 `./honoka-chan`。 + +## 使用 `run.sh` 管理进程 + +Linux 下如果希望常驻运行并方便管理,可以直接使用项目根目录的 `run.sh`: + +```bash +./run.sh start +./run.sh stop +./run.sh restart +./run.sh status +./run.sh logs +``` + +当前行为: + +- `start` 会以 `nohup` 后台运行 `honoka-chan` +- 如果可执行文件不存在,会自动执行 `go build -o honoka-chan main.go` +- PID 文件路径:`temp/run/honoka-chan.pid` +- 日志文件路径:`temp/run/honoka-chan.log` +- 每次启动都会覆盖旧日志 + +## 下载服务部署 + +### SIF 数据下载服务 + +先准备 [文件准备](./01-prerequisites.md) 里提到的 SIF 全量数据,并解压出: + +- `list_CN_Android` +- `list_CN_iOS` + +然后在项目根目录下创建: + +- `static/Android` +- `static/iOS` + +把两个目录分别移动进去,并统一改名为 `archives`。最终目录结构应为: + +- `static/Android/archives` +- `static/iOS/archives` + +如果只打算支持一个平台,可以删除另一个平台的数据。 + +### 准备 `99_0_115.zip` + +由于数据包中本身也包含盛趣服务器地址,所以为了不反复修改游戏配置文件,可以额外准备一个 `99_0_115.zip`,让它在更新时最后下载,从而覆盖原始地址。 + +以 iOS 为例: + +1. 进入 `static/iOS/archives` +2. 确认当前最后一个 `99` 包是 `99_0_114.zip` +3. 复制 `99_0_113.zip` 为 `99_0_115.zip` +4. 打开压缩包,删除没用的 `client_info.json` +5. 解压出 `server_info.json` +6. 按照 [客户端修改](./02-client-modification.md) 中相同的方法解密、修改、重新加密并放回压缩包 + +Android 同理。 + +### 托管方式 + +如果要把下载服务放到云服务器,只需要把: + +- `static/Android` +- `static/iOS` + +上传到你的 HTTP 服务目录即可。具体 HTTP 服务搭建方式不在本文档展开。 diff --git a/docs/04-testing.md b/docs/04-testing.md new file mode 100644 index 0000000..bcf56a5 --- /dev/null +++ b/docs/04-testing.md @@ -0,0 +1,33 @@ +# 运行测试 + +前面的步骤完成后,就可以开始联调。 + +## 配置文件检查 + +第一次启动 `honoka-chan` 后会生成 `config.json`。需要确认: + +- `settings.cdn_server` 指向你的数据下载地址 +- 如果数据直接放在本项目的 `static` 目录下,通常可以配置成类似 `http://192.168.1.123/static` + +如果 `cdn_server/{系统}/archives/99_0_115.zip` 存在,服务端会自动把它追加到更新下载列表;如果不存在,则会直接跳过。 + +## 登录与下载测试 + +客户端登录方式为 `手机号密码登录`。这里的手机号和密码都可以随便填写: + +- 第一次使用的手机号会自动创建账号 +- 之后再次使用同一个手机号时,会沿用之前保存的密码和游戏内设置 + +进入游戏后,按提示下载数据,确认下载过程正常完成。 + +下载完成后即可进入游戏。 + +## 补充说明 + +SIF 的“全量数据下载”实际上并不是真正的全量。部分剧情资源仍然需要通过 `/download/getUrl` 接口按路径拉取。 + +所以除了 `archives` 目录里的压缩包,还需要另外维护一份: + +- zip 全部解压后的资源目录 + +这部分内容后面再补充。 diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..96d4f82 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,8 @@ +# 文档目录 + +建议按下面顺序阅读: + +1. [文件准备](01-prerequisites.md) +2. [客户端修改](02-client-modification.md) +3. [服务端部署](03-server-deployment.md) +4. [运行测试](04-testing.md) diff --git a/doc/images/20230624174049.jpg b/docs/images/20230624174049.jpg similarity index 100% rename from doc/images/20230624174049.jpg rename to docs/images/20230624174049.jpg diff --git a/doc/images/20230624181952.jpg b/docs/images/20230624181952.jpg similarity index 100% rename from doc/images/20230624181952.jpg rename to docs/images/20230624181952.jpg diff --git a/doc/images/20230624182015.jpg b/docs/images/20230624182015.jpg similarity index 100% rename from doc/images/20230624182015.jpg rename to docs/images/20230624182015.jpg diff --git a/doc/images/20230624200603.jpg b/docs/images/20230624200603.jpg similarity index 100% rename from doc/images/20230624200603.jpg rename to docs/images/20230624200603.jpg diff --git a/doc/images/20230624201042.jpg b/docs/images/20230624201042.jpg similarity index 100% rename from doc/images/20230624201042.jpg rename to docs/images/20230624201042.jpg diff --git a/doc/images/20230624202154.jpg b/docs/images/20230624202154.jpg similarity index 100% rename from doc/images/20230624202154.jpg rename to docs/images/20230624202154.jpg