前言
如果你看这篇文章的目的包含:获取未实装的游戏内容、破解游戏数据等,则这篇文章可能不是你想要的。 此服务器内有大量杂乱的内容(如往期活动传送点、废案、测试物品等),未上线角色也仅限于查看名称,其它信息无法访问。
撰写本文章的目的仅限于个人记录以及学习交流用途,如有需要,请联系我删除此文。另外,本文假设你已经一定程度上掌握了运用搜索引擎(如 Google、百度、Bing),尝试自行解决问题的能力。
本文基于 Grasscutter 旧版本(1.0 之前的版本)。此项目迭代速度较快,教程中用到的可执行文件建议前往 GitHub 获取,本文的部分步骤可作为参考。如果个别步骤无法复现,欢迎评论告知,或前往官方 Wiki 或 Discord 等平台寻求解决方案。
起因
今天水群的时候偶然发现了一个叫做 Grasscutter 的项目(个人暂且译为 ”锄草机“,挺符合长草玩家的),翻了下发现是热心玩家对某游戏服务端的 reimplementation,用的 Java + Gradle 。对其很感兴趣,遂按照文档 把坑踩了一遍 安装了一遍,折腾了大半个下午。
安装过程
PS:我暂时把我用到的文件放在了👉我的网盘里👈,有需要可以下载使用。 请将下载的文件放置在一个空文件夹内,以下将称其为根目录 /
。
感谢 Pagermaid 开发者 MXtao 提供的 RAR 懒人包 ~
配置 MongoDB
- 去 MongoDB 官网下载便携版压缩包文件(不必选安装版),解压至
/mongodb/
。目录/mongodo/bin
中应该包含mongod.exe
文件。 - 在
mongodb
下新建一个文件夹db
,用于存放数据。如:/mongodb/db
; - 进入
/mongodb/bin
文件夹,启动命令提示符,执行mongod --dbpath "../db"
,如果有输出且程序不退出,则配置完成。
配置 JDK 和 Gradle
JDK 即 Java Development Kit,此处要求的版本为 8u202
,是一个有点古老的版本。如果不想登录 Oracle 账号的话,可以使用华为云镜像。
配置好环境变量(这里假设你已经掌握 / 搜索过相关知识)后,cmd 运行 java -version
,看到以下输出代表安装成功:
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)
Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的项目自动化建构工具。如果你要自行构建 jar 包,才需要配置 Gradle,不需要请跳过此步。
下载项目
项目分为 stable 和 development 两个版本,在 GitHub 对应不同分支。你可以在上文的云盘链接中下载构建好的 Jar 文件。(因为这个项目迭代有点快,版本可能会落后,有条件的建议自行构建,过程参考 Wiki)
下载好 Jar 后,按照以下步骤准备必要文件:
- 下载网盘内的懒人包
Grasscutter.rar
,解压到根目录(需预留大约 2.62 GB)。
你也可以使用 Git 将下列仓库 clone 下来:
- 运行一次
java -jar grasscutter.jar
(网盘里的 dev 版本是grasscutter_dev.jar
),会在目录下生成一些文件夹;- 主仓库,放至根目录;
- GenshinData,放至
/resources
;- gi-bin-output,挑选对应版本下载,放至
/resources/BinOutput
;- Protobuf Files,挑选对应版本下载,放至
/resources/proto
;- Keys,放至
/resources/Keys
;- 游戏数据文件,放至
/resources/data
;- Keystore 文件,放至
/resources/keystore.p12
。
-
下载网盘中的
GM_Handbook.txt
,你可能需要经常用它来查物品 ID。 -
运行
java -jar grasscutter.jar -handbook
(可选) -
运行
java -jar grasscutter.jar
,如果无问题,即可将其保持在后台,然后进入下一步。
启动服务端时可能会遇到报错
java.net.BindException: Address already in use: bind
,解决办法是 kill 掉占用端口的进程。建议检查8888
,443
,80
和22102
端口。以 Windows 为例,使用netstat -aon | findstr 8888
,记下对应程序 PID(每行的末尾),然后使用taskkill /f /pid [PID]
来强制杀死。
-
给自己创建一个游戏账号,命令格式为
account create [name] [uid(可选)]
,举例:account create test 114514
-
给自己添加特殊权限,命令格式为
permission add [name] [permission]
。以添加全部权限为例:permission add test *
我尝试的时候发现 stable 版本无法添加权限,提示
[ERROR] Command error: No value present
,换到 dev 版本暂时解决了,stable 分支后续应该会修复。
准备连接客户端
主要思路:将客户端发送给官方服务端的请求重定向到本地的服务端。此处有三个建议的选择:Fiddler、mitmdump 和修改 Host,三者任选其一
Fiddler
- 下载 Fiddler Classic,运行。
- 点击 FiddlerScript 选项卡,粘贴如下代码:
点击展开
/* Original script by NicknameGG, modified for Grasscutter by contributors. */
import System;
import System.Windows.Forms;
import Fiddler;
import System.Text.RegularExpressions;
var list = [
"https://api-os-takumi.mihoyo.com/",
"https://hk4e-api-os-static.mihoyo.com/",
"https://hk4e-sdk-os.mihoyo.com/",
"https://dispatchosglobal.yuanshen.com/",
"https://osusadispatch.yuanshen.com/",
"https://account.mihoyo.com/",
"https://log-upload-os.mihoyo.com/",
"https://dispatchcntest.yuanshen.com/",
"https://devlog-upload.mihoyo.com/",
"https://webstatic.mihoyo.com/",
"https://log-upload.mihoyo.com/",
"https://hk4e-sdk.mihoyo.com/",
"https://api-beta-sdk.mihoyo.com/",
"https://api-beta-sdk-os.mihoyo.com/",
"https://cnbeta01dispatch.yuanshen.com/",
"https://dispatchcnglobal.yuanshen.com/",
"https://cnbeta02dispatch.yuanshen.com/",
"https://sdk-os-static.mihoyo.com/",
"https://webstatic-sea.mihoyo.com/",
"https://webstatic-sea.hoyoverse.com/",
"https://hk4e-sdk-os-static.hoyoverse.com/",
"https://sdk-os-static.hoyoverse.com/",
"https://api-account-os.hoyoverse.com/",
"https://hk4e-sdk-os.hoyoverse.com/", // Line 24
"https://abtest-api-data-sg.hoyoverse.com/",
"http://log-upload-os.hoyoverse.com/crash/dataUpload",
"https://abtest-api-data-sg.hoyoverse.com/data_abtest_api/config/experiment/list"
];
class Handlers
{
static function OnBeforeRequest(oS: Session) {
var active = true;
if(active) {
if(oS.uriContains("http://overseauspider.yuanshen.com:8888/log")){
oS.oRequest.FailSession(404, "Blocked", "yourmom");
}
for(var i = 0; i < 30 ;i++) {
if(oS.uriContains(list[i])) {
oS.host = "127.0.0.1"; // This can also be replaced with another IP address.
break;
}
}
}
}
};
示意图:
- 进入 Tools - Options,选择 HTTPS 选项卡,勾选
Capture HTTPS CONNECTs
、Decrypt HTTPS traffic
和Ignore server certificate errors (unsafe)
选项,应该会引导你安装根证书以解密 HTTPS 流量。
Fiddler 修改端口(可选步骤,因为如果服务端已在运行,Fiddler 会自动提示换端口):选择 Connections 选项卡,找到
Fiddler Classic listens on port
设置项,修改端口。不要用 8888,随便设一个其它的,否则会与服务端冲突!
mitmdump
- 去官网下载 mitmdump(网盘里也有),将
mitmdump.exe
放至一个空文件夹 - 复制以下代码,保存为
proxy.py
(网盘里也有)
点击展开
##
#
# Copyright (C) 2002-2022 MlgmXyysd All Rights Reserved.
#
##
##
#
# Genshin Impact script for mitmproxy
#
# https://github.com/MlgmXyysd/
#
# *Original fiddler script from https://github.lunatic.moe/fiddlerscript
#
# Environment requirement:
# - mitmdump from mitmproxy
#
# @author MlgmXyysd
# @version 1.0
#
##
import string
from mitmproxy import ctx
from mitmproxy import http
class MlgmXyysd_Genshin_Impact_Proxy:
def load(self, loader):
loader.add_option(
name = "ip",
typespec = str,
default = "localhost",
help = "IP address to replace",
)
def request(self, flow: http.HTTPFlow) -> None:
# This can also be replaced with another IP address.
REMOTE_HOST = ctx.options.ip
LIST_DOMAINS = [
"api-os-takumi.mihoyo.com",
"hk4e-api-os-static.mihoyo.com",
"hk4e-sdk-os.mihoyo.com",
"dispatchosglobal.yuanshen.com",
"osusadispatch.yuanshen.com",
"account.mihoyo.com",
"log-upload-os.mihoyo.com",
"dispatchcntest.yuanshen.com",
"devlog-upload.mihoyo.com",
"webstatic.mihoyo.com",
"log-upload.mihoyo.com",
"hk4e-sdk.mihoyo.com",
"api-beta-sdk.mihoyo.com",
"api-beta-sdk-os.mihoyo.com",
"cnbeta01dispatch.yuanshen.com",
"dispatchcnglobal.yuanshen.com",
"cnbeta02dispatch.yuanshen.com",
"sdk-os-static.mihoyo.com",
"webstatic-sea.mihoyo.com",
"webstatic-sea.hoyoverse.com",
"hk4e-sdk-os-static.hoyoverse.com",
"sdk-os-static.hoyoverse.com",
"api-account-os.hoyoverse.com",
"hk4e-sdk-os.hoyoverse.com",
"overseauspider.yuanshen.com"
]
if flow.request.host in LIST_DOMAINS:
flow.request.host = "127.0.0.1"
addons = [
MlgmXyysd_Genshin_Impact_Proxy()
]
- 在文件夹内启动 cmd,运行
mitmdump -s proxy.py --ssl-insecure
修改 Host
此方法未经本人测试。国服请求的地址可能会有细微的不同,建议用 Fiddler 等工具抓包测试后补充 Host 文件,也欢迎在评论区分享。
- 在系统 Host 文件中添加以下字段:
点击展开
127.0.0.1 api-os-takumi.mihoyo.com
127.0.0.1 hk4e-api-os-static.mihoyo.com
127.0.0.1 hk4e-sdk-os.mihoyo.com
127.0.0.1 dispatchosglobal.yuanshen.com
127.0.0.1 osusadispatch.yuanshen.com
127.0.0.1 account.mihoyo.com
127.0.0.1 log-upload-os.mihoyo.com
127.0.0.1 dispatchcntest.yuanshen.com
127.0.0.1 devlog-upload.mihoyo.com
127.0.0.1 webstatic.mihoyo.com
127.0.0.1 log-upload.mihoyo.com
127.0.0.1 hk4e-sdk.mihoyo.com
127.0.0.1 api-beta-sdk.mihoyo.com
127.0.0.1 api-beta-sdk-os.mihoyo.com
127.0.0.1 cnbeta01dispatch.yuanshen.com
127.0.0.1 dispatchcnglobal.yuanshen.com
127.0.0.1 cnbeta02dispatch.yuanshen.com
127.0.0.1 sdk-os-static.mihoyo.com
127.0.0.1 webstatic-sea.mihoyo.com
127.0.0.1 hk4e-sdk-os-static.hoyoverse.com
127.0.0.1 webstatic-sea.hoyoverse.com
127.0.0.1 sdk-os-static.hoyoverse.com
127.0.0.1 api-account-os.hoyoverse.com
127.0.0.1 hk4e-sdk-os.hoyoverse.com
127.0.0.1 uspider.yuanshen.com
127.0.0.1 overseauspider.yuanshen.com
127.0.0.1 abtest-api-data-sg.hoyoverse.com
127.0.0.1 log-upload-os.hoyoverse.com
- 刷新系统 DNS 缓存。以 Windows 为例,按
Win
+R
打开 “运行” 对话框,输入ipconfig /flushdns
。
启动游戏
-
个人不推荐直接通过官方启动器启动,可以进入
安装目录/Genshin Impact Game
找到主程序YuanShen.exe
,直接启动。 -
会提示登录账号,用户名选你创建的那个,密码随意。
-
Enjoy!
在游戏内可以添加 Server 对话,然后发送 !help
查看命令列表。物品 ID 可以对照之前下载的 handbook TXT 文件。
体验后的碎碎念
目前这个项目很显然处于开发阶段(repo 主页也称 WIP, work-in-progess),有不少问题(但是迭代修复也很快)。我刚开始搭建的时候,stable 版本 permission 一直加不上。dev 版本倒是正常,但是游戏内传送锚点不可用。最近刚发布了 1.0 版本,这些问题都解决了。
一点矛盾的想法,希望这个项目能多存活一小会,又不希望被太多人知道,毕竟这种项目会损害官方的目的。这次主要目的也是冒着风险尝下鲜,然后体验一下 Java 项目的踩坑
其它有趣的工具
Snap Genshin
在寻找教程的过程中,发现了另一个工具 Snap Genshin,是个很强大的第三方启动器,整合活动信息、账号信息、签到、祈愿记录等功能,并且支持插件。
其中有一个插件 Genshin.Launcher.Plus.SE.Plugin 挺有意思的,可以一键切换客户端区域(官服 / B 服 / 国际服),只需要下载一些数据(不到 400 MB),可以在资源中心找到。