基于PyQT5制作英雄联盟全皮肤下载器
随着英雄联盟的不断发展壮大,越来越多的玩家开始对英雄的皮肤感兴趣,而皮肤的数量也越来越多。如果需要手动一个一个地下载皮肤,不仅费时间费力,而且容易出错。为了解决这个问题,我们可以基于PyQT5制作一个简单实用的英雄联盟全皮肤下载器。
1.需求分析
在制作下载器之前,需要先分析一下所需的功能和实现方式。主要包括以下几点:
1. 下载指定英雄的所有皮肤
2. 下载所有英雄的所有皮肤
3. 显示下载进度和下载状态
4. 显示下载完成后存储的路径
5. 显示程序运行的状态
2.技术实现
实现上述功能需要使用到PyQT5,requests,json等工具。
(1)PyQT5:可以快速构建用户界面。
(2)requests:用于HTTP请求,用来下载皮肤数据。
(3)json:用于解析英雄和皮肤数据。
具体的技术实现步骤如下:
1. 创建用户界面
使用PyQT5中的QWidget类来创建主窗体,使用QGridLayout来布局界面,QLabel和QProgressBar来显示下载进度和状态。此外,还需要使用QPushButton来响应用户的操作。
2. 获取英雄和皮肤数据
在英雄联盟的游戏客户端中,可以找到英雄和皮肤数据的json文件,通过requests模块进行获取。具体路径见代码部分。
3. 下载皮肤
通过requests模块下载英雄皮肤,设置超时时间和异常处理。
4. 显示下载状态
显示下载状态和进度条的变化,还需要将下载信息保存在日志文件中以便用户查看。
以上步骤实现完成后,就能够使用英雄联盟全皮肤下载器下载所有英雄的所有皮肤。
3.代码部分
(1)获取英雄和皮肤数据
import requests
import json
# 获取英雄数据并解析
def get_hero_data():
url = 'https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js'
res = requests.get(url)
hero_json_data = res.text[18:-1]
hero_data = json.loads(hero_json_data)['hero']
return hero_data
# 获取皮肤数据并解析
def get_skin_data(hero_id, hero_name):
url = f'https://game.gtimg.cn/images/lol/act/img/js/hero/{hero_id}.js'
res = requests.get(url)
skin_json_data = res.text[14:]
skin_data = json.loads(skin_json_data)[hero_name]['skin_name']
return skin_data
(2)下载皮肤
# 下载指定英雄的所有皮肤
def download(hero_id, hero_name, skin_data, path):
skin_count = len(skin_data)
i = 1
for skin_name in skin_data:
url = f'https://game.gtimg.cn/images/lol/act/img/skin/big{hero_id}{hero_name}_{skin_name}.jpg'
filename = f'{hero_name}_{skin_name}.jpg'
try:
res = requests.get(url, timeout=50)
if res.status_code == requests.codes.ok:
with open(f'{path}/{filename}', 'wb') as f:
f.write(res.content)
f.close()
print(f'{hero_name}皮肤{skin_name}下载成功')
with open('skin.log', 'a') as log:
log.write(f'{hero_name}皮肤{skin_name}下载成功
')
log.close()
except Exception as e:
print(f'{hero_name}皮肤{skin_name}下载失败', e)
with open('skin.log', 'a') as log:
log.write(f'{hero_name}皮肤{skin_name}下载失败
')
log.close()
value = i / skin_count * 100
# 更新进度条的值
pro_bar.setValue(value)
QApplication.processEvents()
i += 1
(3)完整代码
`
# 引入模块
import requests
import json
import os
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
# 获取英雄数据并解析
def get_hero_data():
url = 'https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js'
res = requests.get(url)
hero_json_data = res.text[18:-1]
hero_data = json.loads(hero_json_data)['hero']
return hero_data
# 获取皮肤数据并解析
def get_skin_data(hero_id, hero_name):
url = f'https://game.gtimg.cn/images/lol/act/img/js/hero/{hero_id}.js'
res = requests.get(url)
skin_json_data = res.text[14:]
skin_data = json.loads(skin_json_data)[hero_name]['skin_name']
return skin_data
# 下载指定英雄的所有皮肤
def download(hero_id, hero_name, skin_data, path):
skin_count = len(skin_data)
i = 1
for skin_name in skin_data:
url = f'https://game.gtimg.cn/images/lol/act/img/skin/big{hero_id}{hero_name}_{skin_name}.jpg'
filename = f'{hero_name}_{skin_name}.jpg'
try:
res = requests.get(url, timeout=50)
if res.status_code == requests.codes.ok:
with open(f'{path}/{filename}', 'wb') as f:
f.write(res.content)
f.close()
print(f'{hero_name}皮肤{skin_name}下载成功')
with open('skin.log', 'a') as log:
log.write(f'{hero_name}皮肤{skin_name}下载成功
')
log.close()
except Exception as e:
print(f'{hero_name}皮肤{skin_name}下载失败', e)
with open('skin.log', 'a') as log:
log.write(f'{hero_name}皮肤{skin_name}下载失败
')
log.close()
value = i / skin_count * 100
# 更新进度条的值
pro_bar.setValue(value)
QApplication.processEvents()
i += 1
# 获取默认路径
def get_download_path():
downloads_path = os.path.join(os.path.expanduser('~'), 'Downloads')
if os.path.exists(downloads_path):
return downloads_path
else:
return os.path.expanduser('~')
# UI界面
class SkinDownload(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 界面布局
grid = QGridLayout()
self.setLayout(grid)
self.resize(500, 200)
self.setWindowTitle('英雄联盟全皮肤下载器')
# 下载区域
self.label1 = QLabel('下载区域:')
grid.addWidget(self.label1, 0, 0)
self.select_hero_cb = QComboBox()
self.select_hero_cb.addItem('所有英雄')
hero_data = get_hero_data()
for hero in hero_data:
self.select_hero_cb.addItem(hero['name'])
grid.addWidget(self.select_hero_cb, 0, 1)
# 存储路径
self.label2 = QLabel('存储路径:')
grid.addWidget(self.label2, 1, 0)
self.path_edit = QLineEdit()
self.path_edit.setText(get_download_path())
grid.addWidget(self.path_edit, 1, 1)
self.select_path = QPushButton('选择路径')
self.select_path.clicked.connect(self.selectPath)
grid.addWidget(self.select_path, 1, 2)
# 下载按钮
self.download_btn = QPushButton('开始下载')
self.download_btn.clicked.connect(self.startDownload)
grid.addWidget(self.download_btn, 2, 0)
# 进度条
self.pro_label = QLabel('下载进度:')
grid.addWidget(self.pro_label, 3, 0)
self.pro_bar = QProgressBar()
self.pro_bar.setMinimum(0)
self.pro_bar.setMaximum(100)
grid.addWidget(self.pro_bar, 3, 1)
# 状态
