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
環境準備
- java se 17
- mongodb 4.0+
- 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
- java編譯失敗
列出我遇到的幾種可能原因,
-
- java環境沒配好,這屬於最不太可能的錯誤,但還是檢測一下,輸入java –version,看是不是17點幾版本的,不是趕緊換。
-
- 網絡問題,編譯過程會給你安裝gradle和一系列jar依賴,看看卡在哪裡瞭自行下載後導入。
-
- 內存問題,編譯需要占用較多內存,實測內存512MB失敗,2G成功,運行時最低需要1G內存,(本來想用vps服務器的,但vps配置較差,沒編過去,哈哈哈)
-
- 程序問題,dev版本編譯建失敗實屬正常現象,要麼自己調一下,要麼換stable版本。
-
- 上述是我實際遇到過的問題,如依然不能解決,自行百度,本人C++工程師,java屬實有點專業盲區。
- 程序運行失敗
-
- 確認你的resources目錄正常存在於編譯生成的入口jar文件的同級目錄下,並內容齊全。
-
- 確認你config.json文件的json格式沒有被破壞,比如手滑多刪瞭個引號(還真有人這麼蠢,是誰呢,不會是我吧?)
-
- 確認你的mongodb的守護進程正常,ps -aux | grep mongod
-
- 確認沒有程序占用你的端口,netstat -tunlp | grep ,linux下的常見犯人叫ngnix,windows下的常見犯人叫vmware,重點檢查。
-
- 確認你的可用內存大於1G
-
- 提示密碼錯誤的,可以把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都解決瞭,讓大傢等等安卓端的解決方案,笑死)。
關於私服問題,我是持擺爛態度的,隻要不借此盈利即可,盈利那是純純的收割冤種。畢竟這是一個主打大世界探索的遊戲,私服缺少你的核心玩法,註定就該隻是自娛自樂。如果說隻有單純抽卡和副本的私服真的能把你幹爆瞭,你是不是該想想自己遊戲的問題呢(非指你遊)?顯然這種私服激不起什麼浪花。