看了網上很多自己開發的英雄聯盟的小助手工具,當時苦於沒有api,自己也想做一個。後來發現了其實拳頭本身就提供了LCU API在使用者端執行的時候會暴露出來。
現在我們就來了解下工具的實現。
查詢資料:http協定存取resuful介面,查詢一些靜態資料,如賬號資訊,排位資訊,戰績等。
websocket繫結介面,獲取伺服器端傳送過來的動態資訊,如遊戲程序,選英雄實時資料。
從上面我們得知,英雄聯盟使用者端在啟動的時候一定會起來一個web服務,並且會有一些resuful介面和websocket資訊的傳送。
那我們如何獲取到呢?只要我們開啟英雄聯盟使用者端並且用管理員啟動cmd,輸入:
wmic PROCESS WHERE name='LeagueClientUx.exe' GET commandline
就能看到一些英雄聯盟使用者端啟動的命令列資訊。主要是獲取其中的伺服器埠和token.
接下來我們只要解析其中的資訊。獲取字串中的埠,token,程序號等資訊。
using (Process p = new Process()) { p.StartInfo.FileName = _cmdPath; p.StartInfo.UseShellExecute = false; //是否使用作業系統shell啟動 p.StartInfo.RedirectStandardInput = true; //接受來自呼叫程式的輸入資訊 p.StartInfo.RedirectStandardOutput = true; //由呼叫程式獲取輸出資訊 p.StartInfo.RedirectStandardError = true; //重定向標準錯誤輸出 p.StartInfo.CreateNoWindow = true; //不顯示程式視窗 p.Start(); p.StandardInput.WriteLine(_excuteShell.TrimEnd('&') + "&exit"); p.StandardInput.AutoFlush = true; string authenticate = await p.StandardOutput.ReadToEndAsync(); p.WaitForExit(); p.Close(); var authenticate = await GetAuthenticate(); if (!string.IsNullOrEmpty(authenticate) && authenticate.Contains("--remoting-auth-token=")) { var tokenResults = authenticate.Split("--remoting-auth-token="); var portResults = authenticate.Split("--app-port="); var PidResults = authenticate.Split("--app-pid="); var installLocations = authenticate.Split("--install-directory="); Constant.Token = tokenResults[1].Substring(0, tokenResults[1].IndexOf("\"")); Constant.Port = int.TryParse(portResults[1].Substring(0, portResults[1].IndexOf("\"")), out var temp) ? temp : 0; Constant.Pid = int.TryParse(PidResults[1].Substring(0, PidResults[1].IndexOf("\"")), out var temp1) ? temp1 : 0; }
}
接下來我們需要啟動http服務和websocket監聽服務。
httpclient初始化:
public Task Initialize(int port, string token) { Port = port; Token = token; CreateHttpClient(); var authTokenBytes = Encoding.ASCII.GetBytes($"riot:{token}"); _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(authTokenBytes)); _httpClient.BaseAddress = new Uri($"https://127.0.0.1:{port}/"); return Task.CompletedTask; }
websocket初始化:
public Task Initialize(int port, string token) { _webSocket = new WebSocket($"wss://127.0.0.1:{port}/", "wamp"); _webSocket.SetCredentials("riot", token, true); _webSocket.SslConfiguration.EnabledSslProtocols = SslProtocols.Tls12; _webSocket.SslConfiguration.ServerCertificateValidationCallback = (response, cert, chain, errors) => true; _webSocket.OnMessage += WssOnOnMessage; return Task.CompletedTask; } private void WssOnOnMessage(object sender, MessageEventArgs e) { if (!e.IsText) return; var eventArray = JArray.Parse(e.Data); var eventNumber = eventArray[0].ToObject<int>(); if (eventNumber != ClientEventNumber) return; var leagueEvent = eventArray[ClientEventData].ToObject<EventArgument>(); if (string.IsNullOrWhiteSpace(leagueEvent?.Uri)) return; MessageReceived?.Invoke(this, leagueEvent); if (!_subscribers.TryGetValue(leagueEvent.Uri, out List<EventHandler<EventArgument>> eventHandlers)) { return; } eventHandlers.ForEach(eventHandler => eventHandler?.Invoke(this, leagueEvent)); }
接下來我們只要啟動這些服務,然後根據拳頭官方的LCU API就能夠存取到原生的一些資料了。LCU API : https://lcu.vivide.re/
我這邊用.net 6 +WPF+VS2022製作了一個LOL工具,大家可以作為參考,開源免費,如果覺得還可以打個星球球了。
github地址:BruceQiu1996/NPhoenix: 英雄聯盟外掛,支援修改段位,修改生涯背景,自動接受對局,設定符文,檢視隊友戰績,上等馬分析等等 (github.com)
工具支援: