<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          .NET 6 開發(fā)一個英雄聯(lián)盟游戲助手

          共 5903字,需瀏覽 12分鐘

           ·

          2022-08-08 19:32


          前言


          看了網(wǎng)上很多自己開發(fā)的英雄聯(lián)盟的小助手工具,當時苦于沒有API,自己也想做一個。

          后來發(fā)現(xiàn)了其實拳頭本身就提供了LCU API在客戶端運行的時候會暴露出來。

          現(xiàn)在我們就來了解下工具的實現(xiàn)。

          正文

          查詢數(shù)據(jù):http協(xié)議訪問resuful接口,查詢一些靜態(tài)數(shù)據(jù),如賬號信息,排位信息,戰(zhàn)績等。

          websocket綁定接口,獲取服務(wù)端發(fā)送過來的動態(tài)信息,如游戲進程,選英雄實時數(shù)據(jù)。

          從上面我們得知,英雄聯(lián)盟客戶端在啟動的時候一定會起來一個Web服務(wù),并且會有一些Resuful接口和Websocket信息的發(fā)送。

          那我們?nèi)绾潍@取到呢?只要我們打開英雄聯(lián)盟客戶端并且用管理員啟動cmd,輸入:

          wmic PROCESS WHERE name='LeagueClientUx.exe' GET commandline 

          就能看到一些英雄聯(lián)盟客戶端啟動的命令行信息。

          主要是獲取其中的服務(wù)端口和token.

          接下來我們只要解析其中的信息。獲取字符串中的端口,token,進程號等信息。

          using (Process p = new Process())
          {
              p.StartInfo.FileName = _cmdPath;
              p.StartInfo.UseShellExecute = false//是否使用操作系統(tǒng)shell啟動
              p.StartInfo.RedirectStandardInput = true//接受來自調(diào)用程序的輸入信息
              p.StartInfo.RedirectStandardOutput = true//由調(diào)用程序獲取輸出信息
              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服務(wù)和websocket監(jiān)聽服務(wù)。

          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));
          }

          接下來我們只要啟動這些服務(wù),然后根據(jù)拳頭官方的LCU API就能夠訪問到本地的一些數(shù)據(jù)了。

          LCU API : https://lcu.vivide.re/

          我這邊用.NET 6 +WPF+VS2022制作了一個LOL工具,大家可以作為參考,開源免費,如果覺得還可以打個星球球了。

          github地址:BruceQiu1996/NPhoenix: 英雄聯(lián)盟插件,支持修改段位,修改生涯背景,自動接受對局,設(shè)置符文,查看隊友戰(zhàn)績,上等馬分析等等 (https://github.com/BruceQiu1996/NPhoenix)

          工具支持:

          ?? | 秒選英雄| 自動接受對局| 國服數(shù)據(jù)排行榜

          ?? 查看英雄對位壓制| 查看英雄優(yōu)勢對線| 5v5符文配置| 修改段位| 修改生涯背景

          ?? 發(fā)送匹馬信息到聊天界面| 查看召喚師戰(zhàn)績| 查看召喚師絕活英雄| 查看召喚師戰(zhàn)績詳情

          ?? 大亂斗秒選自己喜歡的英雄| 大亂斗符文推薦

          下面是工具的一些截圖:

          轉(zhuǎn)自:.NET有點帥  

          鏈接:cnblogs.com/qwqwQAQ/p/16520511.html


          瀏覽 54
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲国产一级视频 | 久草视频在线播放 | 亚洲无码内射在线 | 国产精品无码素人福利 | 久久AV影院 |