leqaq 发表于 2021-12-29 22:57

lol api 开发思路分享

# LOLHelper

开发思路分享:

感谢吾爱破解论坛上 **[叫我ChEn1啦丶](https://www.52pojie.cn/home.php?mod=space&uid=1006029)**提供的 lol api 有关的教程资料,用 c# 实现的 自动接受对局 和 快速锁定英雄。



- 选择框支持一定的模糊搜索
- 选定英雄之后,点击自动接受即可



!(https://gis-visualization.oss-cn-beijing.aliyuncs.com/typoraImg/lolhelper.png)



# 开发过程



1. 获取 lol 客户端暴露的 `端口` 和 `密码`,使用管理员身份运行 `cmd`,输入一下命令:

   

   ```bash
   WMIC PROCESS WHERE name=\"LeagueClientUx.exe\" GET commandline
   ```

   

   ---

   

   ```c#
   // 使用 c# 也是如此,模拟命令行,执行命令,获取输入结果,因此程序也需要以管理员的身份运行
   //获取cmd.exe程序
   var startInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe");
   //设置启动的一些参数
   startInfo.UseShellExecute = false;
   startInfo.RedirectStandardInput = true;
   startInfo.RedirectStandardOutput = true;
   startInfo.RedirectStandardError = true;
   startInfo.CreateNoWindow = true;
   //获取Process类的新实例
   var myProcess = new System.Diagnostics.Process();
   myProcess.StartInfo = startInfo;
   //启动 cmd.exe
   myProcess.Start();
   // 输入命令
   myProcess.StandardInput.WriteLine(command);
   
   // 此处很关键,需要输入 exit 表示命令结束,不然会一直阻塞,获取不到输出结果
   myProcess.StandardInput.WriteLine("exit");
   
   StreamReader reader = myProcess.StandardOutput;
   // 读取命令执行的结果
   string strOuput = reader.ReadToEnd();
   reader.Close();
   myProcess.WaitForExit();
   myProcess.Close();
   
   
   // 再使用正则表达式从读取结果中解析出 端口号 和 密码
   
   // 规则匹配
   Regex portRegex = new Regex("--app-port=(*)");
   Regex tokenRegex = new Regex("--remoting-auth-token=([\\w-]*)");
   port = portRegex.Match(strOuput).Value;
   token = tokenRegex.Match(strOuput).Value;
   ```

   

2. 构建 request 请求

   - ip 地址是本机

   - 端口是解析出来的 `port`

   - 请求头中需要条件 `Authorization`,用户名是 `riot`,密码是解析出来的 `password`

   ```c#
   // {用户名:密码} 的 base64 编码
   string authorize = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}"));
   
   request.Headers.Add("Authorization", "Basic " + authorize);
   ```

   

3. 接口说明

   简单介绍一下自己使用到的接口

   - 获取已拥有的英雄的信息(GET `/lol-champions/v1/owned-champions-minimal`),下面是返回结果(只选取了一个出来分析):

   ```json
   [
         {
             "active": true,
             "alias": "Annie",
             "banVoPath": "/lol-game-data/assets/v1/champion-ban-vo/1.ogg",
             "baseLoadScreenPath": "/lol-game-data/assets/ASSETS/Characters/Annie/Skins/Base/AnnieLoadScreen.jpg",
             "baseSplashPath": "/lol-game-data/assets/v1/champion-splashes/1/1000.jpg",
             "botEnabled": true,
             "chooseVoPath": "/lol-game-data/assets/v1/champion-choose-vo/1.ogg",
             "disabledQueues": [],
             "freeToPlay": false,
             "id": 1,
             "name": "黑暗之女",
             "ownership": {
               "freeToPlayReward": false,
               "owned": true,
               "rental": {
                     "endDate": 0,
                     "purchaseDate": 1526968649000,
                     "rented": false,
                     "winCountRemaining": 0
               }
             },
             "purchased": 1526968649000,
             "rankedPlayEnabled": true,
             "roles": [
               "mage"
             ],
             "squarePortraitPath": "/lol-game-data/assets/v1/champion-icons/1.png",
             "stingerSfxPath": "/lol-game-data/assets/v1/champion-sfx-audios/1.ogg",
             "title": "安妮"
         },
      ......
   ]
   ```

   其中 `squarePortraitPath `可以获取英雄头像,`stingerSfxPath `可以获取英雄的声音,`id` 很是自动锁定英雄的关键

   

   - 接受对局(GET `/lol-matchmaking/v1/ready-check/accept`)我是直接在定时器里轮询访问这个接口

   

   - 获取用户信息(GET `/lol-login/v1/session`),获取其中的 `summonerId`

   ```json
   {
         "accountId": 2964199082,
         "connected": true,
         "error": null,
         "gasToken": null,
   .......
         "isInLoginQueue": false,
         "isNewPlayer": false,
         "puuid": "81fc717d-67a8-513d-891e-d20fd3b47bf7",
         "state": "SUCCEEDED",
         "summonerId": 2964199082,
   ......
         "username": "2964199082"
   }
   ```

   

   

   - 锁定英雄

   - 首先要获取队伍信息(GET `/lol-champ-select/v1/session`),json 格式如下:

       ```json
       // 只保留了一部分关键的数据,关键的就是 actions 数组 和 myTeam 数组
       {
         "actions": [
               [
                   {
                     "actorCellId": 0,
                     "championId": 0,
                     "completed": false,
                     "id": 1,
                     "isAllyAction": true,
                     "isInProgress": true,
                     "pickTurn": 1,
                     "type": "pick"
                   }
               ]
         ],
               .......
         "myTeam": [
               {
                   "assignedPosition": "",
                   "cellId": 0, // 与 actions 中 actorCellId 一致
                   "championId": 0,
                   "championPickIntent": 0,
                   "entitledFeatureType": "",
                   "selectedSkinId": 0,
                   "spell1Id": 1,
                   "spell2Id": 3,
                   "summonerId": 2964199082,
                   "team": 1,
                   "wardSkinId": 91
               }
         ]
         ........
       }
       ```

      

   - 首先遍历 `myTeam` 数组,根据用户的 `summonerId` 获取 `myTeam `中自己的那项信息

   - 从该项中获取 `cellId `的值

   - 再遍历 `actions `数组,根据 `cellId `和 `actorCellId` 的关系,获取该项

   - 获取 `actions` 中的 `id`

   - 发送请求锁定英雄

       1. 请求的地址(PATCH `/lol-champ-select/v1/session/actions/{actions 中的 id}`)

       2. 构建发送请求的数据

          ```json
          // 只需要将 atcions 数组中获取的自己的那项中的 championId 换成 想要选择的英雄的 id 即可
          {
            "actorCellId": 0,
            "championId": {此处为上面获取已拥有的英雄信息中的英雄 id},
            "completed": false,
            "id": 1,
            "isAllyAction": true,
            "isInProgress": true,
            "pickTurn": 1,
            "type": "pick"
          }
          ```



# 总结

1. 总体来说功能还是很简单的,实现也不复杂
2. 锁定英雄这个功能搞了好久,之前在 `url `后面都没有加上 `id `的
3. 经历了技术选型,从 `c#` 到 `electron `再到 `java fx`,最后回归到 `c#`,想换的原因是主职是 `java`,`c#` 只是个一知半解的状态,而且好像轮子也不多,写起来很不顺手,最重要的原因是 `vs2019` 实在是太难用了,对于用惯了 `idea `的我来说,简直是灾难。换回来的原因是,`electron` 和` java fx` 都需要学习成本,然后我发现的 `jetbrains` 家的 `rider`,虽然有一点小 `bug`,还是网上关于它的使用资料也不多,但是不愧是 `jetbrains `家的产品,太香了,开发体验直线上升。

leqaq 发表于 2022-7-30 10:14

青墨 发表于 2022-7-26 19:20
看了你之前的那个任务栏隐藏的每次开机后得按快捷键以后任务栏才能隐藏可不可以改成开机自动隐藏

外链:https://hqzqaq.lanzouq.com/b011vfwpg 密码:4k6t

leqaq 发表于 2022-1-26 11:12

bushiri 发表于 2022-1-19 14:00
作者你好,最近游戏更新了, 接受对局这个接口用不到了,请问能更新一下吗? 我愿意购买这个接口

有其它工具可以用,LeagueTavern

缺心i 发表于 2022-1-2 01:44

脑:“会了”
手:“废了”

缺心i 发表于 2022-1-2 16:34

大师 我悟了

lishen0522 发表于 2022-1-13 21:11

可惜小白看不懂。。。想要成品-。-

leqaq 发表于 2022-1-14 09:10

lishen0522 发表于 2022-1-13 21:11
可惜小白看不懂。。。想要成品-。-

论坛不让发

lishen0522 发表于 2022-1-15 22:24

leqaq 发表于 2022-1-14 09:10
论坛不让发

大佬私发一个嘛。-。-哈哈哈哈哈哈12091135

lishen0522 发表于 2022-1-15 22:25

lishen0522 发表于 2022-1-15 22:24
大佬私发一个嘛。-。-哈哈哈哈哈哈12091135

不对。有人发给我这个了。WIN10可以用。WIN11会提示管理员。实际是用管理员运行的

bushiri 发表于 2022-1-19 14:00

作者你好,最近游戏更新了, 接受对局这个接口用不到了,请问能更新一下吗? 我愿意购买这个接口

是你吗 发表于 2022-1-21 18:30

老哥可以发个成品吗?论坛的都失效了~

havenshen 发表于 2022-1-25 05:59

接受对局,选择英雄的api失效了
页: [1] 2 3
查看完整版本: lol api 开发思路分享