《原神》服务端 Grasscutter 安装踩坑记录

《原神》服务端 Grasscutter 安装踩坑记录

Anotia 841 2022-04-21

前言

如果你看这篇文章的目的包含:获取未实装的游戏内容、破解游戏数据等,则这篇文章可能不是你想要的。 此服务器内有大量杂乱的内容(如往期活动传送点、废案、测试物品等),未上线角色也仅限于查看名称,其它信息无法访问。

撰写本文章的目的仅限于个人记录以及学习交流用途,如有需要,请联系我删除此文。另外,本文假设你已经一定程度上掌握了运用搜索引擎(如 Google、百度、Bing),尝试自行解决问题的能力。

Grasscutter 的迭代速度较快,未来可能导致本教程个别步骤无法复现,如有问题请评论告知,或前往官方 Wiki 或 Discord 等平台寻求方案。

起因

今天水群的时候偶然发现了一个叫做 Grasscutter 的项目(个人暂且译为 ”锄草机“,挺符合长草玩家的),翻了下发现是热心玩家对某游戏服务端的 reimplementation,用的 Java + Gradle 。对其很感兴趣,遂按照文档 把坑踩了一遍 安装了一遍,折腾了大半个下午。

安装过程

PS:我暂时把我用到的文件放在了👉我的网盘里👈,有需要可以下载使用。 请将下载的文件放置在一个空文件夹内,以下将称其为根目录 /

感谢 Pagermaid 开发者 MXtao 提供的 RAR 懒人包 ~

配置 MongoDB

  1. 去 MongoDB 官网下载便携版压缩包文件(不必选安装版),解压至 /mongodb/。目录 /mongodo/bin 中应该包含 mongod.exe 文件。
  2. mongodb 下新建一个文件夹 db,用于存放数据。如:/mongodb/db
  3. 进入 /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,不需要请跳过此步。

下载项目

项目分为 stabledevelopment 两个版本,在 GitHub 对应不同分支。你可以在上文的云盘链接中下载构建好的 Jar 文件。(因为这个项目迭代有点快,版本可能会落后,有条件的建议自行构建,过程参考 Wiki

下载好 Jar 后,按照以下步骤准备必要文件:

  1. 下载网盘内的懒人包 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
  1. 下载网盘中的 GM_Handbook.txt,你可能需要经常用它来查物品 ID。

  2. 运行 java -jar grasscutter.jar -handbook(可选)

  3. 运行 java -jar grasscutter.jar,如果无问题,即可将其保持在后台,然后进入下一步。

启动服务端时可能会遇到报错 java.net.BindException: Address already in use: bind,解决办法是 kill 掉占用端口的进程。建议检查 88884438022102 端口。以 Windows 为例,使用 netstat -aon | findstr 8888,记下对应程序 PID(每行的末尾),然后使用 taskkill /f /pid [PID] 来强制杀死。

  1. 给自己创建一个游戏账号,命令格式为 account create [name] [uid(可选)],举例:account create test 114514

  2. 给自己添加特殊权限,命令格式为 permission add [name] [permission]。以添加全部权限为例:permission add test *

我尝试的时候发现 stable 版本无法添加权限,提示 [ERROR] Command error: No value present,换到 dev 版本暂时解决了,stable 分支后续应该会修复。

准备连接客户端

主要思路:将客户端发送给官方服务端的请求重定向到本地的服务端。此处有三个建议的选择:Fiddler、mitmdump 和修改 Host,三者任选其一

Fiddler

  1. 下载 Fiddler Classic,运行。
  2. 点击 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;
              }
          }
      }
  }
};

示意图:
image

  1. 进入 Tools - Options,选择 HTTPS 选项卡,勾选 Capture HTTPS CONNECTsDecrypt HTTPS trafficIgnore server certificate errors (unsafe) 选项,应该会引导你安装根证书以解密 HTTPS 流量。

image

Fiddler 修改端口(可选步骤,因为如果服务端已在运行,Fiddler 会自动提示换端口):选择 Connections 选项卡,找到 Fiddler Classic listens on port 设置项,修改端口。不要用 8888,随便设一个其它的,否则会与服务端冲突!

mitmdump

  1. 去官网下载 mitmdump(网盘里也有),将 mitmdump.exe 放至一个空文件夹
  2. 复制以下代码,保存为 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()
]
  1. 在文件夹内启动 cmd,运行 mitmdump -s proxy.py --ssl-insecure

修改 Host

此方法未经本人测试。国服请求的地址可能会有细微的不同,建议用 Fiddler 等工具抓包测试后补充 Host 文件,也欢迎在评论区分享。

  1. 在系统 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
  1. 刷新系统 DNS 缓存。以 Windows 为例,按 Win + R 打开 “运行” 对话框,输入 ipconfig /flushdns

启动游戏

  1. 个人不推荐直接通过官方启动器启动,可以进入安装目录/Genshin Impact Game 找到主程序 YuanShen.exe,直接启动。

  2. 会提示登录账号,用户名选你创建的那个,密码随意。

  3. Enjoy!

在游戏内可以添加 Server 对话,然后发送 !help 查看命令列表。物品 ID 可以对照之前下载的 handbook TXT 文件。

48bcd240ecfdc606d3d1ae981fd28b5

体验后的碎碎念

目前这个项目很显然处于开发阶段(repo 主页也称 WIP, work-in-progess),有不少问题(但是迭代修复也很快)。我刚开始搭建的时候,stable 版本 permission 一直加不上。dev 版本倒是正常,但是游戏内传送锚点不可用。最近刚发布了 1.0 版本,这些问题都解决了。

一点矛盾的想法,希望这个项目能多存活一小会,又不希望被太多人知道,毕竟这种项目会损害官方的目的。这次主要目的也是冒着风险尝下鲜,然后体验一下 Java 项目的踩坑

其它有趣的工具

Snap Genshin

在寻找教程的过程中,发现了另一个工具 Snap Genshin,是个很强大的第三方启动器,整合活动信息、账号信息、签到、祈愿记录等功能,并且支持插件。

其中有一个插件 Genshin.Launcher.Plus.SE.Plugin 挺有意思的,可以一键切换客户端区域(官服 / B 服 / 国际服),只需要下载一些数据(不到 400 MB),可以在资源中心找到。

image

image


# 原神