NiceLeeのBlog 用爱发电 bilibili~

关于LOL 牛马上等马插件的开发

2022-07-26
nIceLee

阅读:


看直播的时候,发现进入英雄选择界面的时候,有时候会遇见憨批发言“我方上等马… 我方牛马…敌方…”。
当时好奇是怎么做到的,如果实现的助手插件是通过逆向解析,难道不会被封号吗?
直到我发现拳头公司本身有提供给开发者的api。。。
果然,信息开阔眼界,有些事情难度一下子下降N个量级。

简单介绍

内容参考:
通过拳头lucAPI来拉人进游戏
Java-S12138/frank

  • 通过lockfile文件读取配置【过时】
    英雄联盟\LeagueClient目录下会出现lockfile。该文件内容参考
    LeagueClient:13808:1667:p4Sw2_-_uUcKIeHhPmvoMQ:https
    
  • 通过任务管理器查看配置【过时?】
    查看LeagueClientUx.exe命令行这一列的信息,取出-app-port--remoting-auth-token

  • 通过cmd或者powershell实现【过时?】
    // https://github.com/Java-S12138/frank/blob/d7e20528e74511850a33d0f0a6117df06eea761e/src/utils/league-connect/authentication.js
    if (isWindows && (options === null || options === void 0 ? void 0 : options.useDeprecatedWmic) === true) {
      command = `wmic process where caption='${name}.exe' get commandline`;
    }
    else {
      command = `Get-CimInstance -Query "SELECT * from Win32_Process WHERE name LIKE '${name}.exe'" | Select-Object CommandLine | fl`;
    }
    
  • 通过log读取配置
    已经有较长的那么一段时间,riot并没有将配置写入上述的lockfile。但是log仍然是存在的。
    英雄联盟\LeagueClient目录下会出现log文件,比如:
    2022-07-26T14-15-28_8736_LeagueClientUx.log
    000000.000| ALWAYS| Logging started at 2022-07-26T14:15:28.264
    000000.000| ALWAYS| Application Version:12.13.453.3037 - CL:4533037 - Build Date: Jul 11 2022 - Build Time:18:39:22
    000000.000| ALWAYS| Log file 2022-07-26T14-15-28_8736_LeagueClientUx.log
    000000.000| ALWAYS| Running LeagueClientUx version 12.13.453.3037
    000000.000|   OKAY| Using initial working directory: "d:\program files\腾讯游戏\英雄联盟\LeagueClient"
    000000.000|   OKAY| Current process: "D:\Program Files\鑵捐娓告垙\鑻遍泟鑱旂洘\LeagueClient\LeagueClientUx.exe"
    000000.000|   OKAY| Command line arguments: 
          --riotclient-auth-token=j9J5mFu7rsICgZqcJRSo4A 
          --riotclient-app-port=63154 
          --riotclient-tencent --no-rads 
          --disable-self-update 
          --region=TENCENT 
          --locale=zh_CN 
          --t.lcdshost=hn1-sz-feapp.lol.qq.com 
          --t.chathost=hn1-sz-ejabberd.lol.qq.com 
          --t.lq=https://hn1-sz-login.lol.qq.com:8443 
          --t.storeurl=https://hn1-sr.lol.qq.com:8443 
          --t.rmsurl=wss://sz-rms-bcs.lol.qq.com:443 
          --rso-auth.url=https://prod-rso.lol.qq.com:3000 
          --rso_platform_id=HN1 
          --rso-auth.client=lol 
          --t.location=loltencent.sz.HN1 
          --tglog-endpoint=https://tglogsz.datamore.qq.com/lolcli/report/ 
          --t.league_edge_url=https://ledge-hn1.lol.qq.com:22019 
          --ccs=https://cc-hn1.lol.qq.com:8093 
          --dradis-endpoint=http://some.url 
          --remoting-auth-token=MmjujFMHhdwKWFhlK9aOsQ 
          --app-port=63190 
          --install-directory=d:\program files\閼垫崘顔嗗〒鍛婂灆\閼婚亶娉熼懕鏃傛礃\LeagueClient 
          --app-name=LeagueClient 
          --ux-name=LeagueClientUx 
          --ux-helper-name=LeagueClientUxHelper 
          --log-dir=LeagueClient Logs 
          --crash-reporting= 
          --crash-environment=HN1 
          --app-log-file-path=d:/program files/鑵捐娓告垙/鑻遍泟鑱旂洘/LeagueClient/../Game/Logs/LeagueClient Logs/2022-07-26T14-15-27_9788_LeagueClient.log 
          --app-pid=9788 --output-base-dir=d:/program files/閼垫崘顔嗗〒鍛婂灆/閼婚亶娉熼懕鏃傛礃/LeagueClient/../Game 
          --no-proxy-server
    

    可以从上面取出--app-port--remoting-auth-token,这里注意端口授权不要和--riotclient-app-port--riotclient-auth-token搞混了。

  • 通过http请求调用API
    参考apiSwagger文档获取想要的API。
    例如,获取好友信息或者查看符文页,大概一两个HTTP请求就能搞定。
    需要注意的是,协议请使用HTTP1.1,这导致浏览器使用HTTP2直接访问的话可能报错
    好友信息
    GET https://riot:{remoting-auth-token}@127.0.0.1:{app-port}/lol-chat/v1/friends
    符文页
    GET https://riot:{remoting-auth-token}@127.0.0.1:{app-port}/lol-perks/v1/pages
    

以下为python示例

import requests
import base64

if __name__ == "__main__":
    token = 'MmjujFMHhdwKWFhlK9aOsQ' 
    port =63190
    url_prefix = 'https://127.0.0.1:%d'%port
    
    token_encode = base64.b64encode(bytes('riot:' + token, 'utf-8'))
    basic_auth = 'Basic ' + str(token_encode, 'utf-8')
    url = url_prefix + "/lol-chat/v1/friends"
    #url = url_prefix + "/lol-perks/v1/pages"
    headers = {
        'Accept': 'application/json, text/plain, */*',
        'Authorization': basic_auth,
    }
    data = requests.get(url, headers=headers, verify=False)
    print(url)
    print(data.text)

内容
隐藏