吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7602|回复: 22
收起左侧

[C&C++ 转载] lol api 开发思路分享

  [复制链接]
leqaq 发表于 2021-12-29 22:57

LOLHelper

开发思路分享:

感谢吾爱破解论坛上 叫我ChEn1啦丶  提供的 lol api 有关的教程资料,用 c# 实现的 自动接受对局 和 快速锁定英雄。

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

lolhelper

开发过程

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

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

    // 使用 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=([0-9]*)");
    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

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

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

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

      [
       {
           "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

      {
       "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 格式如下:
      // 只保留了一部分关键的数据,关键的就是 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数组,根据 cellIdactorCellId 的关系,获取该项

      • 获取 actions 中的 id

      • 发送请求锁定英雄

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

      2. 构建发送请求的数据

        // 只需要将 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#,想换的原因是主职是 javac# 只是个一知半解的状态,而且好像轮子也不多,写起来很不顺手,最重要的原因是 vs2019 实在是太难用了,对于用惯了 idea的我来说,简直是灾难。换回来的原因是,electronjava fx 都需要学习成本,然后我发现的 jetbrains 家的 rider,虽然有一点小 bug,还是网上关于它的使用资料也不多,但是不愧是 jetbrains家的产品,太香了,开发体验直线上升。

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
RemMai + 1 + 1 内容不错,vs可是天下第一IDE。开发微软全家桶的东西可是第一哟。
缺心i + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 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

大佬私发一个嘛。-。-哈哈哈哈哈哈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失效了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-8 02:47

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表