欢迎访问宙启技术站
智能推送

基于PyQT5制作英雄联盟全皮肤下载器

发布时间:2023-05-14 13:38:28

随着英雄联盟的不断发展壮大,越来越多的玩家开始对英雄的皮肤感兴趣,而皮肤的数量也越来越多。如果需要手动一个一个地下载皮肤,不仅费时间费力,而且容易出错。为了解决这个问题,我们可以基于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)

# 状态