【原创源码】【Python】利用Lcu Api制作的lol大乱斗Buff提示软件
本帖最后由 LEOVVVVVVV 于 2022-7-9 21:01 编辑了解吾爱很久了,从最最最开始的在论坛里找各位老哥做的工具,到现在自己也很感兴趣,亲自体验一下代码的魅力。作为一个外行人,虽然写的软件功能很简单,但是对我自己来说还是成就感满满的啦:lol学Python以来自己制作的第一个案例
感谢论坛老哥叫我ChEn1啦丶分享的Lcuapi的用法,经过自己摸索终于写出来了
效果图如下
https://tva2.sinaimg.cn/large/006zs6Lmly8h40z3fcygzj30cz0750tw.jpg
https://tva4.sinaimg.cn/large/006zs6Lmly8h40z2gncobj30cz075jru.jpg下面附上源码,由于是小白,很多地方可能写的不规范,希望各位大佬指点指点吧。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:LEOV
# 导入模块区
import ctypes
import json
import os
import re
import time
import webbrowser
import requests
import subprocess
import sys
import threading
import tkinter as tk
# 以下代码可避免requests模块运行时报错
requests.packages.urllib3.disable_warnings()
requests.DEFAULT_RETRIES = 1000
# 设置变量区
cmd01 = r'WMIC PROCESS WHERE name="LeagueClientUx.exe" GET commandline'# cmd运行的命令,此命令可获取指定程序的启动参数
cmd02 = 'wmic process where name="LeagueClientUx.exe" get processid,executablepath,name'# 检测lol客户端进程
# api查询地址 https://lcu.vivide.re/
api01 = "/lol-summoner/v1/current-summoner"# 获取用户信息
api02 = '/lol-gameflow/v1/session'# 获取对局信息-可在房间信息内找到英雄id
api03 = '/lol-champ-select-legacy/v1/session'# 获取当前选择英雄的ID-大乱斗用不了
api04 = '/lol-champ-select/v1/session'# 获取选择的英雄,可以通过召唤师ID确认,我的id是2973112230
heroID = None
# ---------------函数区--------------
# 获取管理员权限
def is_admin():
try:
return ctypes.windll.shell32.IsUserAnAdmin()# 此代码可获取管理员权限并重新执行本文件
except:
return True
# LcuApi相关函数
class Lcuapi():
def checklol(self):
'''
检测进程是否存在
:return:
'''
res = subprocess.Popen(cmd02,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
res.wait()# 等待子进程结束
# temp = res.returncode# 检查cmd是否成功
temp = res.communicate()# 获取cmd输出内容
temp = re.findall('LeagueClientUx.exe', str(temp))
time.sleep(1)# 设置延迟,1秒检测一次游戏进程
if temp:
print('检测到游戏进程')
return True
else:
print('游戏未开始')
return False
def runcmd(self):
'''
运行CMD命令获得程序启动参数
:return:程序启动项
'''
print('开始获取端口')
res = os.popen(cmd01)# 执行cmd命令,此处不能使用subprocess,因为获取端口需要管理员权限
temp = res.read()# 获得输出字符串
print('已获取到启动参数为:', temp)
return temp
def lol_PT(self):
'''
提取端口及秘钥
:return: lol_token,lol_port
'''
temp = self.runcmd()
getlol = re.findall(r'remoting-auth-token=\S{22}', temp)# 匹配密码字符
getlol += re.findall(r'--app-port=\d{5}', temp)# 匹配端口字符
print('已提取出关键信息:', getlol)
lol_token = str(getlol).replace('remoting-auth-token=', '')
print('获得密匙为:' + lol_token)
lol_port = str(getlol).replace('--app-port=', '')
print('获得端口号为:' + lol_port)
return lol_port, lol_token
def runapi(self, api, lol_PT):
"""
获取给予API返回的值
:return: getapi
"""
port = lol_PT
token = lol_PT
getapi = requests.get(
url="https://riot:" + token + '@127.0.0.1:' + port + api,
verify=False)
print('当前api地址为:'"https://riot:" + token + '@127.0.0.1:' + port + api)
print(getapi.json())
return getapi
def getheroID(self, js, puuid):
'''
从房间信息json中解析到当前选择的英雄ID
:param js:
:return: 前选择的英雄ID
'''
for temp in js.json()['myTeam']:
if temp['summonerId'] == puuid:
print('当前召唤师ID:', temp['summonerId'])
break
return temp['championId']
def getbuff():
'''
从网页或者文件中读取json
:return:
'''
a = True# 如果a = False从网页中读取buff信息
if a:
read = open('lol.json', mode='r', encoding="utf-8")
buff = json.load(read)
print('已从文件获取到buff数据')
else:
buff = requests.get(
url="https://leov.top/lol.json",
verify=False).json()
print('已从服务器获取到buff数据')
return buff
def color(a):
'''
输出,护盾,治疗buff颜色
:param a:
:return:
'''
a = int(a)
if a > 100:
return '#75ff72'
elif a < 100:
return '#790000'
else:
return '#ffffff'
def color02(a):
'''
承伤buff颜色
:param a:
:return:
'''
a = int(a)
if a < 100:
return '#75ff72'
elif a > 100:
return '#790000'
else:
return '#ffffff'
def xiangqing():
'''
前往英雄详情页
:return:
'''
try:
url = f'https://101.qq.com/#/hero-detail?heroid={heroID}&datatype=fight'
webbrowser.open(url, new=0, autoraise=True)
except:
return None
# tk面板搭建
def mianban():
# 主面板搭建
global root, l01, l02, l03, l04, l06, l07, l08, l09, b01
root = tk.Tk()# 设置主面板
root.title('乱斗小助手v1.01')# 设置窗口名称
root.geometry('465x230+1280+720')# 设置窗口大小
root.resizable(height=False, width=False)# 禁止调整窗口长宽
print('窗口搭建完成!')
# 第一个窗体
frame1 = tk.Frame(root, relief='raised', borderwidth=1)
frame1.pack(side='top', fill='both', ipadx=1, ipady=1, expand=0)
# 第二个窗体
frame2 = tk.Frame(root, relief='raised', borderwidth=1)
frame2.pack(side='top', fill='both', ipadx=1, ipady=1, expand=0)
# 第三个窗体
frame3 = tk.Frame(root, relief='raised', borderwidth=5)
frame3.pack(side='top', fill='both', ipadx=1, ipady=1, expand=0)
# 第四个窗体
frame4 = tk.Frame(root, relief='raised', borderwidth=1)
frame4.pack(side='top', fill='both', ipadx=1, ipady=1, expand=0)
# 定义一个lable,显示召唤师信息用的
l01 = tk.Label(
frame1,# 选择窗口
# 显示内容
text='',
bg='#e1f3ff',# 背景颜色
font=('Microsoft YaHei', 12),# 字体及文字大小
width=50,# 宽度
height=4,# 高度
justify='left'# 多行文本对齐方式
)
l01.pack(fill='both')# 固定到窗口
# 定义一个lable,显示当前游戏模式
l02 = tk.Label(
frame2,# 选择窗口
text='',# 显示内容
# bg='gray',# 背景颜色
font=('Microsoft YaHei', 13),# 字体及文字大小
width=18,# 宽度
height=2,# 高度
justify='left'
)
l02.pack(side='left', anchor='center', fill='both')# 固定到窗口
# 定义按钮,直达英雄详情页
b01 = tk.Button(
frame2,
text="前往英雄详情页",
bg='#e1f3ff',
command=xiangqing
)
b01.pack(side='left', anchor='center', fill='both')
# 定义一个lable,显示当前游戏模式
l03 = tk.Label(
frame2,# 选择窗口
text='',# 显示内容
# bg='gray',# 背景颜色
font=('Microsoft YaHei', 13),# 字体及文字大小
width=20,# 宽度
height=2,# 高度
justify='left'
)
l03.pack(side='right', anchor='center', fill='both')# 固定到窗口ipadx=10,ipady=10分别表示与其他容器的间距
# 定义一个lable,显示伤害buff
l06 = tk.Label(
frame3,# 选择窗口
text='',# 显示内容
bg='gray',# 背景颜色
font=('Microsoft YaHei', 12),# 字体及文字大小
width=10,# 宽度
height=2,# 高度
justify='left'
)
l06.pack(side='left', anchor='center', fill='both')# 固定到窗口ipadx=10,ipady=10分别表示与其他容器的间距
# 定义一个lable,做分割线
line02 = tk.Label(
frame3,# 选择窗口
# bg='blue',# 背景颜色
width=1,# 宽度
# height=2,# 高度
)
line02.pack(side='left', fill='both')
# 定义一个lable,显示承伤buff
l07 = tk.Label(
frame3,# 选择窗口
text='',# 显示内容
bg='gray',# 背景颜色
font=('Microsoft YaHei', 12),# 字体及文字大小
width=10,# 宽度
height=2,# 高度
justify='left'
)
l07.pack(side='left', anchor='center', fill='both')# 固定到窗口ipadx=10,ipady=10分别表示与其他容器的间距
# 定义一个lable,做分割线
line03 = tk.Label(
frame3,# 选择窗口
# bg='blue',# 背景颜色
width=1,# 宽度
# height=2,# 高度
)
line03.pack(side='left', fill='both')
# 定义一个lable,显示护盾buff
l08 = tk.Label(
frame3,# 选择窗口
text='',# 显示内容
bg='gray',# 背景颜色
font=('Microsoft YaHei', 12),# 字体及文字大小
width=10,# 宽度
height=2,# 高度
justify='left'
)
l08.pack(side='left', anchor='center', fill='both')# 固定到窗口ipadx=10,ipady=10分别表示与其他容器的间距
# 定义一个lable,做分割线
line04 = tk.Label(
frame3,# 选择窗口
# bg='blue',# 背景颜色
width=1,# 宽度
# height=2,# 高度
)
line04.pack(side='left', fill='both')
# 定义一个lable,显示治疗buff
l09 = tk.Label(
frame3,# 选择窗口
text='',# 显示内容
bg='gray',# 背景颜色
font=('Microsoft YaHei', 12),# 字体及文字大小
width=10,# 宽度
height=2,# 高度
justify='left'
)
l09.pack(side='left', anchor='center', fill='both')# 固定到窗口ipadx=10,ipady=10分别表示与其他容器的间距
# 定义一个lable,显示当前游戏进程
l04 = tk.Label(
frame4,# 选择窗口
text='',# 显示内容
# bg='gray',# 背景颜色
font=('Microsoft YaHei', 10),# 字体及文字大小
# width=21,# 宽度
height=1,# 高度
)
l04.pack(side='left', fill='both')# 固定到窗口
# 定义一个lable,显示作者信息
l05 = tk.Label(
frame4,# 选择窗口
text='by:LEOV',# 显示内容
# bg='gray',# 背景颜色
font=('Microsoft YaHei', 10),# 字体及文字大小
width=21,# 宽度
height=1,# 高度
)
l05.pack(side='right', fill='both')# 固定到窗口
def yunxing():
'''
1、使用runapi函数调用api
2、解析api返回值
3、循环调用并刷新界面数据
解析并设置
:return:
'''
# 声明变量
global r1, r2, r3, api01, api02, api03
# 运行函数调用api
if lcu.checklol():# 如果游戏执行成功
lol_PT = lcu.lol_PT()
r1 = lcu.runapi(api01, lol_PT)# 获取召唤师基本信息
r2 = lcu.runapi(api02, lol_PT)# 获取对局信息
r3 = lcu.runapi(api04, lol_PT)# 获取选择英雄
a4 = '游戏已运行'
# 解析召唤师信息
try:
a1 = (f"召唤师名称: {r1.json()['displayName']}\n" +
f"召唤师等级: {r1.json()['summonerLevel']}\n" +
f"当前PUUID: {r1.json()['puuid']}\n" +
f"当前AccountID: {r1.json()['accountId']}"
)
except:
a1 = '暂未开始游戏'
# 解析游戏模式
try:
a2 = (f'''
游戏地图:
{r2.json()["map"]["gameModeName"]}
''')
except:
a2 = ('暂未开始游戏')
print(a2)
# 解析当前选择英雄ID,并对照服务器json获得英雄名称
try:
temp = lcu.getheroID(r3,r1.json()['accountId'])
global heroID
heroID = temp
a3 = f'''当前选择的英雄:
{buff["name"]}'''
except:
a3 = ('暂未选择英雄')
print(a3)
else:
a1 = a2 = a3 = a4 = '未检测到游戏进程'
# 伤害buff
try:
a6 = ["out"]}''', buff["out"]]
except:
a6 =
try:
a7 = ["input"]}''', buff["input"]]
except:
a7 =
try:
a8 = ["shield"]}''', buff["shield"]]
except:
a8 =
try:
a9 = ["cure"]}''', buff["cure"]]
except:
a9 =
# 设置文本刷新
l04.config(text=a4)# 检测游戏进程
l01.configure(text=a1)# 用户信息
l02.configure(text=a2)# 游戏房间信息
l03.configure(text=a3)# 选择英雄信息
# 以下设置buff提示
l06.configure(text=a6, bg=color(a6))# 伤害buff
l07.configure(text=a7, bg=color02(a7))# 承伤buff
l08.configure(text=a8, bg=color(a8))# 护盾buff
l09.configure(text=a9, bg=color(a9))# 治疗buff
root.after(500, yunxing)# 进入循环,每0.5秒刷新一次
# 如果不是管理员,此代码将获取管理员权限并重新执行本文件
# 此段代码在IDE环境需开启管理员权限,否则无效,需打包exe后可自动获取管理员权限
if not is_admin():
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)# 获取管理员权限并重新执行本文件
else:# 下面放成为管理员后执行的代码
buff = getbuff()
mianban()
lcu = Lcuapi()# 实例化lcu函数
# 使用子线程获取api信息
t2 = threading.Thread(target=yunxing, args=())
# start 之后,子线程开始执行,主线程也会继续执行,不会等待
t2.start()
root.mainloop()# 设置窗口循环
Avenshy 发表于 2022-7-9 18:59
太强了,感谢分享,话说有使用的截图吗,想看一下效果
还有就是这个算外卦吗,有封号风险吗
不是外挂,调用lol官方API获取的信息,然后进行比对显示,不涉及游戏内存修改,符合官方绿色插件公约要求,截图的话这有旧版的,新版添加了个跳转到官方数据网页的按钮
http://tiebapic.baidu.com/forum/w%3D580/sign=0873173a9039b6004dce0fbfd9523526/d63fc7ef76094b36b1120f34e6cc7cd98f109dfd.jpg?tbpicau=2022-07-13-05_acb275a16c1e490051a88cf5b1a72731
http://tiebapic.baidu.com/forum/w%3D580/sign=b2af20007c01213fcf334ed464e536f8/737cfc1f3a292df5df41b8ccf9315c6036a873ff.jpg?tbpicau=2022-07-13-05_af35cd5c3651a3f83465e925a73daed6 运行需要的buff数据在这,使用脚本爬取lol官网获取英雄列表然后手动填的,其他方法不会,只会这个笨办法了{:1_908:}真正的人工智能
此处是填好的json数据{
"1":{
"name":"黑暗之女",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"2":{
"name":"狂战士",
"out":95,
"input":95,
"shield":100,
"cure":120
},
"3":{
"name":"正义巨像",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"4":{
"name":"卡牌大师",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"5":{
"name":"德邦总管",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"6":{
"name":"无畏战车",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"7":{
"name":"诡术妖姬",
"out":110,
"input":90,
"shield":100,
"cure":100
},
"8":{
"name":"猩红收割者",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"9":{
"name":"远古恐惧",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"10":{
"name":"正义天使",
"out":95,
"input":103,
"shield":100,
"cure":100
},
"11":{
"name":"无极剑圣",
"out":100,
"input":97,
"shield":100,
"cure":100
},
"12":{
"name":"牛头酋长",
"out":95,
"input":110,
"shield":100,
"cure":80
},
"13":{
"name":"符文法师",
"out":110,
"input":90,
"shield":100,
"cure":100
},
"14":{
"name":"亡灵战神",
"out":92,
"input":108,
"shield":80,
"cure":100
},
"15":{
"name":"战争女神",
"out":85,
"input":105,
"shield":100,
"cure":100
},
"16":{
"name":"众星之子",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"17":{
"name":"迅捷斥候",
"out":90,
"input":110,
"shield":100,
"cure":100
},
"18":{
"name":"麦林炮手",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"19":{
"name":"祖安怒兽",
"out":105,
"input":95,
"shield":100,
"cure":100
},
"20":{
"name":"雪原双子",
"out":108,
"input":92,
"shield":100,
"cure":100
},
"21":{
"name":"赏金猎人",
"out":90,
"input":110,
"shield":100,
"cure":100
},
"22":{
"name":"寒冰射手",
"out":85,
"input":110,
"shield":100,
"cure":100
},
"23":{
"name":"蛮族之王",
"out":110,
"input":85,
"shield":100,
"cure":120
},
"24":{
"name":"武器大师",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"25":{
"name":"堕落天使",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"26":{
"name":"时光守护者",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"27":{
"name":"炼金术士",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"28":{
"name":"痛苦之拥",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"29":{
"name":"瘟疫之源",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"30":{
"name":"死亡颂唱者",
"out":90,
"input":100,
"shield":100,
"cure":100
},
"31":{
"name":"虚空恐惧",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"32":{
"name":"殇之木乃伊",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"33":{
"name":"披甲龙龟",
"out":105,
"input":90,
"shield":100,
"cure":100
},
"34":{
"name":"冰晶凤凰",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"35":{
"name":"恶魔小丑",
"out":105,
"input":100,
"shield":100,
"cure":100
},
"36":{
"name":"祖安狂人",
"out":95,
"input":110,
"shield":100,
"cure":100
},
"37":{
"name":"琴瑟仙女",
"out":85,
"input":115,
"shield":60,
"cure":60
},
"38":{
"name":"虚空行者",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"39":{
"name":"刀锋舞者",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"40":{
"name":"风暴之怒",
"out":95,
"input":105,
"shield":90,
"cure":90
},
"41":{
"name":"海洋之灾",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"42":{
"name":"英勇投弹手",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"43":{
"name":"天启者",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"44":{
"name":"瓦洛兰之盾",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"45":{
"name":"邪恶小法师",
"out":95,
"input":105,
"shield":100,
"cure":100
},
"48":{
"name":"巨魔之王",
"out":100,
"input":105,
"shield":100,
"cure":95
},
"50":{
"name":"诺克萨斯统领",
"out":90,
"input":106,
"shield":100,
"cure":100
},
"51":{
"name":"皮城女警",
"out":100,
"input":95,
"shield":100,
"cure":100
},
"53":{
"name":"蒸汽机器人",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"54":{
"name":"熔岩巨兽",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"55":{
"name":"不祥之刃",
"out":110,
"input":90,
"shield":100,
"cure":100
},
"56":{
"name":"永恒梦魇",
"out":110,
"input":90,
"shield":100,
"cure":120
},
"57":{
"name":"扭曲树精",
"out":85,
"input":110,
"shield":100,
"cure":60
},
"58":{
"name":"荒漠屠夫",
"out":105,
"input":95,
"shield":100,
"cure":120
},
"59":{
"name":"德玛西亚皇子",
"out":105,
"input":95,
"shield":100,
"cure":100
},
"60":{
"name":"蜘蛛女皇",
"out":108,
"input":92,
"shield":100,
"cure":100
},
"61":{
"name":"发条魔灵",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"62":{
"name":"齐天大圣",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"63":{
"name":"复仇焰魂",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"64":{
"name":"盲僧",
"out":110,
"input":90,
"shield":120,
"cure":120
},
"67":{
"name":"暗夜猎手",
"out":100,
"input":93,
"shield":100,
"cure":100
},
"68":{
"name":"机械公敌",
"out":105,
"input":95,
"shield":100,
"cure":100
},
"69":{
"name":"魔蛇之拥",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"72":{
"name":"水晶先锋",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"74":{
"name":"大发明家",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"75":{
"name":"沙漠死神",
"out":100,
"input":105,
"shield":100,
"cure":100
},
"76":{
"name":"狂野女猎手",
"out":110,
"input":100,
"shield":100,
"cure":100
},
"77":{
"name":"兽灵行者",
"out":110,
"input":85,
"shield":110,
"cure":100
},
"78":{
"name":"圣锤之毅",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"79":{
"name":"酒桶",
"out":100,
"input":97,
"shield":100,
"cure":100
},
"80":{
"name":"不屈之枪",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"81":{
"name":"探险家",
"out":95,
"input":103,
"shield":100,
"cure":100
},
"82":{
"name":"铁铠冥魂",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"83":{
"name":"牧魂人",
"out":95,
"input":105,
"shield":100,
"cure":100
},
"84":{
"name":"离群之刺",
"out":110,
"input":90,
"shield":100,
"cure":100
},
"85":{
"name":"狂暴之心",
"out":100,
"input":95,
"shield":100,
"cure":100
},
"86":{
"name":"德玛西亚之力",
"out":100,
"input":95,
"shield":100,
"cure":100
},
"89":{
"name":"曙光女神",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"90":{
"name":"虚空先知",
"out":110,
"input":85,
"shield":100,
"cure":100
},
"91":{
"name":"刀锋之影",
"out":110,
"input":92,
"shield":100,
"cure":100
},
"92":{
"name":"放逐之刃",
"out":105,
"input":92,
"shield":120,
"cure":100
},
"96":{
"name":"深渊巨口",
"out":90,
"input":108,
"shield":100,
"cure":100
},
"98":{
"name":"暮光之眼",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"99":{
"name":"光辉女郎",
"out":85,
"input":110,
"shield":80,
"cure":100
},
"101":{
"name":"远古巫灵",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"102":{
"name":"龙血武姬",
"out":100,
"input":95,
"shield":100,
"cure":100
},
"103":{
"name":"九尾妖狐",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"104":{
"name":"法外狂徒",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"105":{
"name":"潮汐海灵",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"106":{
"name":"不灭狂雷",
"out":100,
"input":95,
"shield":100,
"cure":100
},
"107":{
"name":"傲之追猎者",
"out":108,
"input":92,
"shield":100,
"cure":120
},
"110":{
"name":"惩戒之箭",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"111":{
"name":"深海泰坦",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"112":{
"name":"机械先驱",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"113":{
"name":"北地之怒",
"out":105,
"input":92,
"shield":100,
"cure":100
},
"114":{
"name":"无双剑姬",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"115":{
"name":"爆破鬼才",
"out":80,
"input":105,
"shield":100,
"cure":100
},
"117":{
"name":"仙灵女巫",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"119":{
"name":"荣耀行刑官",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"120":{
"name":"战争之影",
"out":110,
"input":90,
"shield":100,
"cure":120
},
"121":{
"name":"虚空掠夺者",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"122":{
"name":"诺克萨斯之手",
"out":100,
"input":95,
"shield":100,
"cure":120
},
"126":{
"name":"未来守护者",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"127":{
"name":"冰霜女巫",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"131":{
"name":"皎月女神",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"133":{
"name":"德玛西亚之翼",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"134":{
"name":"暗黑元首",
"out":105,
"input":100,
"shield":100,
"cure":100
},
"136":{
"name":"铸星龙王",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"141":{
"name":"影流之镰",
"out":105,
"input":100,
"shield":100,
"cure":100
},
"142":{
"name":"暮光星灵",
"out":105,
"input":95,
"shield":100,
"cure":100
},
"143":{
"name":"荆棘之兴",
"out":90,
"input":105,
"shield":100,
"cure":100
},
"145":{
"name":"虚空之女",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"147":{
"name":"星籁歌姬",
"out":85,
"input":115,
"shield":60,
"cure":60
},
"150":{
"name":"迷失之牙",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"154":{
"name":"生化魔人",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"157":{
"name":"疾风剑豪",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"161":{
"name":"虚空之眼",
"out":95,
"input":105,
"shield":100,
"cure":100
},
"163":{
"name":"岩雀",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"164":{
"name":"青钢影",
"out":105,
"input":95,
"shield":120,
"cure":100
},
"166":{
"name":"影哨",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"200":{
"name":"虚空女皇",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"201":{
"name":"弗雷尔卓德之心",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"202":{
"name":"戏命师",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"203":{
"name":"永猎双子",
"out":110,
"input":90,
"shield":100,
"cure":100
},
"221":{
"name":"祖安花火",
"out":100,
"input":95,
"shield":100,
"cure":100
},
"222":{
"name":"暴走萝莉",
"out":90,
"input":105,
"shield":100,
"cure":100
},
"223":{
"name":"河流之王",
"out":105,
"input":115,
"shield":100,
"cure":100
},
"234":{
"name":"破败之王",
"out":105,
"input":95,
"shield":100,
"cure":100
},
"235":{
"name":"涤魂圣枪",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"236":{
"name":"圣枪游侠",
"out":103,
"input":100,
"shield":100,
"cure":100
},
"238":{
"name":"影流之主",
"out":105,
"input":92,
"shield":100,
"cure":100
},
"240":{
"name":"暴怒骑士",
"out":105,
"input":90,
"shield":100,
"cure":100
},
"245":{
"name":"时间刺客",
"out":105,
"input":95,
"shield":100,
"cure":100
},
"246":{
"name":"元素女皇",
"out":115,
"input":85,
"shield":100,
"cure":100
},
"254":{
"name":"皮城执法官",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"266":{
"name":"暗裔剑魔",
"out":105,
"input":90,
"shield":100,
"cure":100
},
"267":{
"name":"唤潮鲛姬",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"268":{
"name":"沙漠皇帝",
"out":110,
"input":95,
"shield":100,
"cure":100
},
"350":{
"name":"魔法猫咪",
"out":103,
"input":100,
"shield":100,
"cure":100
},
"360":{
"name":"沙漠玫瑰",
"out":100,
"input":95,
"shield":100,
"cure":100
},
"412":{
"name":"魂锁典狱长",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"420":{
"name":"海兽祭司",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"421":{
"name":"虚空遁地兽",
"out":120,
"input":85,
"shield":100,
"cure":120
},
"427":{
"name":"翠神",
"out":95,
"input":100,
"shield":100,
"cure":100
},
"429":{
"name":"复仇之矛",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"432":{
"name":"星界游神",
"out":115,
"input":80,
"shield":100,
"cure":20
},
"497":{
"name":"幻翎",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"498":{
"name":"逆羽",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"516":{
"name":"山隐之焰",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"517":{
"name":"解脱者",
"out":100,
"input":95,
"shield":100,
"cure":100
},
"518":{
"name":"万花通灵",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"523":{
"name":"残月之肃",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"526":{
"name":"镕铁少女",
"out":95,
"input":105,
"shield":90,
"cure":90
},
"555":{
"name":"血港鬼影",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"711":{
"name":"愁云使者",
"out":100,
"input":100,
"shield":100,
"cure":100
},
"777":{
"name":"封魔剑魂",
"out":103,
"input":97,
"shield":100,
"cure":100
},
"875":{
"name":"腕豪",
"out":95,
"input":105,
"shield":90,
"cure":90
},
"876":{
"name":"含羞蓓蕾",
"out":95,
"input":100,
"shield":100,
"cure":100
},
"887":{
"name":"灵罗娃娃",
"out":105,
"input":95,
"shield":100,
"cure":100
},
"888":{
"name":"炼金男爵",
"out":100,
"input":100,
"shield":100,
"cure":100
}
}
然后是爬取lol英雄ID的代码,拥有英雄名称跟英雄id后就可以根据lcuapi获取到的id匹配从而得到英雄名称了
"""
网址:https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js
目标:获取所有英雄的名称和英雄ID
数据结构:json
数据请求方式:ajax
"""
import requests
url= 'https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js'
temp = 0#设置计数变量
headers_ = {
'Referer': 'https://lol.qq.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36',
}
response = requests.get(url=url,headers=headers_).json()
# print(response)
json_data = response['hero']
note = open('lol.json', mode ='w',encoding='utf-8')
note.write('{')
for j in json_data:
heroId= j['heroId']
hero_name = j['name']
detail_url = f'https://game.gtimg.cn/images/lol/act/img/js/hero/{heroId}.js'
skill_response = requests.get(url=detail_url,headers=headers_).json()
skills_list = skill_response['spells']
ls_=[]
for skill in skills_list:
skills = skill['name']
ls_.append(skills)
#制作json
a = '{'
b = '}'
r =(f'''"{str(heroId)}":{a}"name":"{str(hero_name)}","out":100,"input":100,"shield":100,"cure":100{b}''')
print(r)
note.write(r)
temp += 1
if temp < len(json_data):
note.write(',')
note.write('}') 太强了,感谢分享,话说有使用的截图吗,想看一下效果
还有就是这个算外卦吗,有封号风险吗 buff提示干什么的,效果图看看 灵剑丹心 发表于 2022-7-9 19:04
buff提示干什么的,效果图看看
忘了上图了,更新了,等待审核 LEOVVVVVVV 发表于 2022-7-11 12:07
不是外挂,调用lol官方API获取的信息,然后进行比对显示,不涉及游戏内存修改,符合官方绿色插件公约要求 ...
哥哥太厉害了 不错,就是把队友英雄跟备选的英雄也显示就更好了,不过有源码,闲着的时候自己改一下也行
页:
[1]