grasscutter 使用指南——Android/Windows/IOS端均已支持

grasscutter 使用指南——Android/Windows/IOS端均已支持 前言

grasscutter是某二次元手遊的開源後端,目前功能並不完整,但正在contributers正在全速開發中,未來可期。可以部署在linux和windows下,通過代理與各種平臺的客戶端進行交互。本文提供grasscutter的linux端部署(windows端比較簡單)、windows/andriod/ios端的客戶端連接指導,其中安卓提供機器root和非root兩種情況下的解決方案。本文需要有一定的計算機基礎,不面向小白,盡量說的詳細,說明部分可能包含簡單的shell命令,自行執行,不提供一鍵安裝腳本,不提供已搭建完成的服務器,適合愛折騰的玩傢,不希望任何人以此盈利,歡迎進行技術交流,有問題可以問。

關鍵突破點為mitmproxy在安卓客戶端的ca證書安裝,安卓可以使用vmos獲得一個root過的虛擬機(vmos不要在應用商店下載,有關鍵功能閹割,去官網下載。root功能需要vip,有慈禧預付費版本,不想花錢的可以自己動手找一下)

更新

目前dev版本已更新秘境和深淵,大世界支持聯機。

關鍵詞

SSL、CA證書、grasscutter、某二次元遊戲、代理轉發、http註入、安卓、IOS、windows

環境準備

  1. java se 17
  2. mongodb 4.0+
  3. mitmproxy

環境準備請自行度娘解決

linux服務端搭建(centos7)

1.git拉取 或 直接下載源代碼,並上傳到服務器,tar -xzf解壓縮

git clone -b development https://github.com/Grasscutters/Grasscutter.git

註意下載的dev版本(如果編譯不通過,又不想調試,可以改下stable版本)

1.關閉防火墻或配置放行策略(註意除瞭常規端口外,要放行TCP和UDP的22102端口)

systemctl stop firewalld

我就比較直接,23333。如果是雲服務器,記得去控制臺配置一下安全組策略,服務端90%的問題來自這裡。

2. 啟動mongodb,自行百度linux下如何啟動mongodb,這個基本上沒啥問題,後續出現27017端口問題或mongodb類似的報錯,多半是mongo服務沒起或者掛瞭。

  • 這裡提供一個教程,執行到啟動mongodb服務並驗證即可。

3. 編譯,需要java17環境自帶gradle全自動編譯腳本,執行就完事瞭。

sh gradlew jar

執行時間視服務器配置而定,如有報錯,請檢查你的java環境和網絡環境,善用度娘

編譯成功後會在grasscutter的主目錄下 生成一個grasscutter開頭(加版本號)的jar文件,直接運行

java -jar grasscutter-1.1.0.jar #1.1.0是我下載的版本

會提示缺少資源文件,並給你創好瞭資源文件的目錄(resources,沒創的話自行創一下),裡面的內容需要你自己下載。

4. 下載資源文件

github地址

註:此倉庫被github停掉的概率較高,註意備份,原因不多說瞭,dddd。

git clone https://github.com/memetrollsXD/Grasscutter_Resources.git

將Resources下的文件全部復制到grasscutter根目錄下的resources文件夾中,包括BinOutput、ExcelBinOutput、Readable、Scripts、Subtitle、TextMap

5. 啟動服務器

修改配置文件config.json

{  "DatabaseUrl": "mongodb://localhost:27017",  "DatabaseCollection": "grasscutter",  "RESOURCE_FOLDER": "./resources/",  "DATA_FOLDER": "./data/",  "PACKETS_FOLDER": "./packets/",  "DUMPS_FOLDER": "./dumps/",  "KEY_FOLDER": "./keys/",  "SCRIPTS_FOLDER": "./resources/Scripts/",  "PLUGINS_FOLDER": "./plugins/",  "DebugMode": "NONE",  "RunMode": "HYBRID",  "GameServer": {    "Name": "Test",    "Ip": "0.0.0.0",    "PublicIp": "your public ip",    "Port": 22102,    "PublicPort": 0,    "DispatchServerDatabaseUrl": "mongodb://localhost:27017",    "DispatchServerDatabaseCollection": "grasscutter",    "InventoryLimitWeapon": 2000,    "InventoryLimitRelic": 2000,    "InventoryLimitMaterial": 2000,    "InventoryLimitFurniture": 2000,    "InventoryLimitAll": 30000,    "MaxAvatarsInTeam": 4,    "MaxAvatarsInTeamMultiplayer": 4,    "MaxEntityLimit": 1000,    "WatchGacha": false,    "ServerNickname": "Server",    "ServerAvatarId": 10000007,    "ServerNameCardId": 210001,    "ServerLevel": 1,    "ServerWorldLevel": 1,    "ServerSignature": "Server Signature",    "WelcomeEmotes": [      2007,      1002,      4010    ],    "WelcomeMotd": "Welcome to Grasscutter emu",    "WelcomeMailTitle": "Welcome to Grasscutter!",    "WelcomeMailSender": "Lawnmower",    "WelcomeMailContent": "Hi there!\r\nFirst of all, welcome to Grasscutter. If you have any issues, please let us know so that Lawnmower can help you! \r\n\r\nCheck out our:\r\n\u003ctype\u003d\"browser\" text\u003d\"Discord\" href\u003d\"https://discord.gg/T5vZU6UyeG\"/\u003e",    "WelcomeMailItems": [      {        "itemId": 13509,        "itemCount": 1,        "itemLevel": 1      },      {        "itemId": 201,        "itemCount": 10000,        "itemLevel": 1      }    ],    "EnableOfficialShop": true,    "Game": {      "ADVENTURE_EXP_RATE": 1.0,      "MORA_RATE": 1.0,      "DOMAIN_DROP_RATE": 1.0    }  },  "DispatchServer": {    "Ip": "0.0.0.0",    "PublicIp": "your public ip",    "Port": 14514,    "PublicPort": 0,    "KeystorePath": "./keystore.p12",    "KeystorePassword": "123456",    "UseSSL": true,    "FrontHTTPS": true,    "CORS": false,    "CORSAllowedOrigins": [      "*"    ],    "AutomaticallyCreateAccounts": false,    "defaultPermissions": [      ""    ],    "GameServers": []  },  "LocaleLanguage": "en_US",  "DefaultLanguage": "en",  "OpenStamina": true}

其實隻需要修改兩處publicip為你的公網ip,以及如果你不想用443端口,修改一下DispatchServer.port即可,註意這裡修改的話,下面的mitmdump的配置也需要同步修改。其他的不涉及網絡的選項,你自己看著改。

(我開的端口有點臭,23333)

再執行一次啟動命令

java -jar grasscutter-1.1.0.jar

顯示遊戲服務器在22102端口運行,轉發服務器在14514端口運行,即為成功。

此時參照命令表,在該shell窗口輸入賬號創建命令

account create echidna 114514233

會提示賬號創建成功。

QA

  1. java編譯失敗

列出我遇到的幾種可能原因,

    1. java環境沒配好,這屬於最不太可能的錯誤,但還是檢測一下,輸入java –version,看是不是17點幾版本的,不是趕緊換。
    1. 網絡問題,編譯過程會給你安裝gradle和一系列jar依賴,看看卡在哪裡瞭自行下載後導入。
    1. 內存問題,編譯需要占用較多內存,實測內存512MB失敗,2G成功,運行時最低需要1G內存,(本來想用vps服務器的,但vps配置較差,沒編過去,哈哈哈)
    1. 程序問題,dev版本編譯建失敗實屬正常現象,要麼自己調一下,要麼換stable版本。
    1. 上述是我實際遇到過的問題,如依然不能解決,自行百度,本人C++工程師,java屬實有點專業盲區。
  1. 程序運行失敗
    1. 確認你的resources目錄正常存在於編譯生成的入口jar文件的同級目錄下,並內容齊全。
    1. 確認你config.json文件的json格式沒有被破壞,比如手滑多刪瞭個引號(還真有人這麼蠢,是誰呢,不會是我吧?)
    1. 確認你的mongodb的守護進程正常,ps -aux | grep mongod
    1. 確認沒有程序占用你的端口,netstat -tunlp | grep ,linux下的常見犯人叫ngnix,windows下的常見犯人叫vmware,重點檢查。
    1. 確認你的可用內存大於1G
    1. 提示密碼錯誤的,可以把config.json中的DispatchServer.KeystorePassword改為空(原本是空的改為123456,每個版本的key可能放的不一樣,反正兩個總有一個是對的)。

6. 配置抓包以及http註入

  • 這裡我們用到mitmproxy,我看到不少人使用fiddler,但fiddler是基於.net開發的程序,移植到linux並不方便。

  • 可以直接使用pip3安裝,沒裝python3的yum裝一下。

pip3 install mitmproxy
  • 會給你安裝mitmproxy及其命令行版本,即mitmdump,還有其多版本的ca證書

  • 也可以去官網下載二進制版本,但不帶ca證書,需要你自行部署完成後開啟代理並訪問mitm.it下載,但國內的雲服務器不允許域名轉發到未備案域名,所以會比較麻煩。

  • 安裝完成後,我們回到grasscutter的主目錄

      vim proxy_config.py

    修改配置文件,如下:

      import os  # This can also be replaced with another IP address.  USE_SSL = True  REMOTE_HOST = "your public ip"  REMOTE_PORT = 14514  if os.getenv('MITM_REMOTE_HOST') != None:      REMOTE_HOST = os.getenv('MITM_REMOTE_HOST')  if os.getenv('MITM_REMOTE_PORT') != None:      REMOTE_PORT = int(os.getenv('MITM_REMOTE_PORT'))  if os.getenv('MITM_USE_SSL') != None:      USE_SSL = bool(os.getenv('MITM_USE_SSL'))  print('MITM Remote Host: ' + REMOTE_HOST)  print('MITM Remote Port: ' + str(REMOTE_PORT))  print('MITM Use SSL ' + str(USE_SSL))

    註意此處的REMOTE_PORT要與上面你修改的dispatchsever的port一致。

    • 配置ca證書
    cp ~/.mitmproxy/mitmproxy-ca-cert.crt /etc/ssl/certs # 這句是安裝為根證書,未必需要cp ~/.mitmproxy/mitmproxy-ca-cert.pem /etc/pki/ca-trust/source/anchorsupdate-ca-trust extract
    • 執行轉發。重點來瞭,mitmproxy的安卓代理存在諸多問題,需要添加一系列參數進行規避,而這部分,大部分教程並未提及

      mitmdump -s proxy.py --ssl-insecure --set block_global=false --no-http2

      允許不安全的ssl連接,禁用http2連接,以及禁用internet對mitmproxy的直接訪問,。

此時,代理服務器會在默認的8080端口啟動,同樣請確保端口不會沖突。

windows端登陸

  • 配置ca證書

    將服務器端~/.mitmproxy文件夾下的mitmproxy-ca-cert.p12文件拿到windows機器上,直接雙擊,選擇給本地計算機安裝,要密碼直接空過,自動選擇目錄即可,重啟機器。

  • windows端支持國服和國際服客戶端登錄,方法非常簡單,打開網絡和Internet設置,選擇代理,打開手動設置代理選項,填寫地址和端口,即為你上面設置的publicip和mitmdump的端口(默認8080那個)。

  • 打開客戶端,直接用你創建的賬號密碼登錄即可。

QA

  • 為啥我客戶端提示網絡異常?

    代理端口不對,建議檢查你的mitmproxy是否活著,端口號是否正確。

  • 為啥4206瞭?

    大抵是證書裝的有問題罷,要麼你沒有全局安裝,要麼可以把上面那個mitmproxy目錄下的另外一個p12文件也拉出裝一下,目前未驗證grasscutter下的證書是否需要安裝,可以嘗試一下安裝那個grasscutter下的keystore.p12文件。

  • 連上去後網絡非常不穩定

    你服務器帶寬問題。

  • 登錄進去顯示12-4301

    建議切換美服通道登錄

  • 為啥我發現我nohup後臺運行程序的服務器炸瞭?

    硬盤炸瞭,ssh連不上的話,先去控制臺重啟一下。首先,必須重定向nohup到dev/null,而且目前grasscutter有bug,會往主目錄的log文件夾裡瘋狂寫入latest.log,目前config.json中未發現相關選擇,本人是懶得去代碼裡找,直接選擇刪除latest.log。

  • 其他問題

    檢查你的有沒有科學上網啥的,關瞭。

IOS端登錄

  • 自行搜索ios如何安裝ca證書,我們要安裝的ca證書是~/.mitmproxy目錄下的mitmproxy-ca-cert.pem,註意下載完成後要去找到這個文件,點一下,然後再執行證書安裝的兩個步驟(先安裝再信任)。
  • 不要使用小火箭,會有bug,原因很簡單,小火箭不會轉發udp報文,但我們的grasscuter是依賴於kcp這種udp協議的。
  • IOS端一把成功,沒遇到啥問題,有問題應該和上述windows端差不多的解決方法。

Android端登錄

比上面的都要復雜,問題主要出在,Android7.0往後,應用可以選擇不信任用戶證書,而很遺憾該手遊app就是設置為不信任的那種,基於此,我想出3條解決方案。

  • magisk,就是俗稱的面具root,不過沒有備用機,不打算刷掉我的正常使用的手機,並不考慮。
  • 改包,設置為接受用戶證書,然後重新打包,值得一試。
  • 使用虛擬機,也就是安卓模擬器。

乍一看,第三點是一個非常抽象的想法,這意味著要在安卓機上裝安卓模擬器,這不搞笑嗎。但找瞭一下,真的有這種東西,vmos pro。

至於這玩意咋整,應該沒啥技術難度,註意我之前說的關於vmos pro的註意事項即可,剩下的百度解決。

當我們有瞭一個root過的虛擬機的時候,我需要將ca證書安裝到系統目錄下,為此需要openssl進行安卓系統ca證書的制作。

yum install opensslopenssl x509 -inform PEM -subject_hash_old -in mitmproxy-ca-cert.pem -nooutcp mitmproxy-ca-cert.pem c8750f0d.0 # 這邊的c8750f0d是上一條命令的輸出。

將這個文件放入/system/etc/security/cacerts/下,並修改權限為644

設置中長按你所連接的wifi,選擇修改網絡,設置代理,和上面的其他客戶端一樣的要求。

連接即可,註意需要國際服客戶端。

結語

本人網絡方向C++工程師,本來以為可以一晚上解決的,但其實還是研究瞭不少時間的,畢竟要跑dev版本的java的代碼(我跑的那個版本編譯都有問題2333),以及一堆ca證書問題,終於全客戶端搞定瞭這玩意,搭建瞭一個服務器和朋友一起玩玩。為防止一切侵權隱患,以及屏蔽正義遊俠,文章概不放圖,但該講到的節點都講到瞭,有需要技術支持的請評論區留言,技術支持不收費,三言兩語能解決的我都會回答(隻要你不是小白,大部分問題屬於這種),想以此盈利的請勿打擾(之前看到一個群友截圖,大致說是有個賣傢某寶98出售私服,結果買傢進群,賣傢說windows和ios都解決瞭,讓大傢等等安卓端的解決方案,笑死)。

關於私服問題,我是持擺爛態度的,隻要不借此盈利即可,盈利那是純純的收割冤種。畢竟這是一個主打大世界探索的遊戲,私服缺少你的核心玩法,註定就該隻是自娛自樂。如果說隻有單純抽卡和副本的私服真的能把你幹爆瞭,你是不是該想想自己遊戲的問題呢(非指你遊)?顯然這種私服激不起什麼浪花。

本文來自網絡,不代表程式碼花園立場,如有侵權,請聯系管理員。https://www.codegarden.cn/article/31354/
返回顶部