哈撒给,英雄联盟全皮肤下载器来了

这是通过英雄联盟博主写的下载器下载的英雄皮肤,大家可以看看效果。每个英雄的皮肤会根据英雄的名字自动创建一个相应的文件夹来存储。

[En]

This is the hero skin downloaded through the League of Legends downloader written by the blogger, you can take a look at the effect. Each hero’s skin will automatically create a corresponding folder to store according to the hero’s name.

【阅读全文】

请阅读本文末尾的完整源代码。

[En]

Please read the complete source code at the end of the article.

哈撒给,英雄联盟全皮肤下载器来了

哈撒给,英雄联盟全皮肤下载器来了

哈撒给,英雄联盟全皮肤下载器来了

实现思路比较简单,同样是通过PyQt5来编写下载页面。最后通过request模块来进行皮肤的下载部分编写。演示一下操作过程是下面这样的,选择好皮肤的存储路径。然后直接点击开始下载就行了,并且可以在文本浏览器中查看下载进度信息。

哈撒给,英雄联盟全皮肤下载器来了

接下来,我将介绍代码块的主要实现部分。首先,让我们介绍一下在整个代码块中使用了哪些第三方模块。

[En]

Next, I will introduce the main implementation part of the code block. First of all, let’s introduce which third-party modules are used throughout the code block.

英雄联盟皮肤下载相关依赖模块<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>League of Legends skin downloads related dependency modules</font>*</details>

import requests  # 网络请求库
import re  # 正则表达式匹配库
import json  # JSON格式转换库
import os  # 应用操作库
import time  # 时间模块
from random import random  # 随机数模块
from fake_useragent import UserAgent  # user_agent 生成库
import logging  # 日志模块
import sys  # 系统操作

pyqt5的模块引用这里就不介绍了,最近一直在用。

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

UI界面的设计过程代码块以及信号与槽函数的应用过程。

def init_ui(self):
        self.setWindowTitle('英雄皮肤下载器  公众号:[Python 集中营]')
        self.setWindowIcon(QIcon('lol.ico'))
        self.resize(500,250)

        vbox = QVBoxLayout()

        self.save_dir = QLineEdit()
        self.save_dir.setReadOnly(True)

        self.save_btn = QPushButton()
        self.save_btn.setText('路径')
        self.save_btn.clicked.connect(self.save_btn_click)

        self.thread_ = DownLoadThread(self)
        self.thread_.trigger.connect(self.update_log)

        self.start_btn = QPushButton()
        self.start_btn.setText('开始下载')
        self.start_btn.clicked.connect(self.start_btn_click)

        grid = QGridLayout()
        grid.addWidget(self.save_dir, 0, 0, 1, 2)
        grid.addWidget(self.save_btn, 0, 2, 1, 1)
        grid.addWidget(self.start_btn, 0, 3, 1, 1)

        self.result_brower = QTextBrowser()
        self.result_brower.setFont(QFont('宋体', 8))
        self.result_brower.setReadOnly(True)
        self.result_brower.setPlaceholderText('英雄皮肤批量下载进度显示区域...')
        self.result_brower.ensureCursorVisible()

        vbox.addWidget(self.result_brower)
        vbox.addLayout(grid)

        self.setLayout(vbox)

    def start_btn_click(self):
        self.start_btn.setEnabled(False)
        self.thread_.start()

    def update_log(self, text):
        cursor = self.result_brower.textCursor()
        cursor.movePosition(QTextCursor.End)
        self.result_brower.append(text)
        self.result_brower.setTextCursor(cursor)
        self.result_brower.ensureCursorVisible()

    def save_btn_click(self):
        directory = QFileDialog.getExistingDirectory(self, "选取文件夹", self.cwd)
        self.save_dir.setText(directory)

UI界面的设计代码,遵循的是和其他PyQt5一样的设计范式。按照这样的范式写出来的UI代码块个人觉得看起来也比较美观。

为了防止下载过程比较慢的情况下会导致UI界面的主线程直接挂掉,所以在编写下载业务的逻辑时是需要单独使用QThread子线程的方式来编写的。这样可以使得业务逻辑和主页面逻辑分离,就不会产生挂掉的情况发生了。

class DownLoadThread(QThread):

    trigger = pyqtSignal(str)

    def __init__(self, parent=None):
        super(DownLoadThread, self).__init__(parent)
        # 初始化日志对象
        self.logger = logging.getLogger('英雄联盟皮肤')
        logging.basicConfig()
        self.logger.setLevel(logging.DEBUG)
        self.parent = parent
        self.working = True

    def __del__(self):
        self.working = False
        self.wait()

    def run(self):

        '''
        英雄联盟皮肤下载函数
        :return:
        '''
        while self.working == True:
            # 构造useragent身份设备信息
            headers = {
                "User-Agent": str(UserAgent().random),
            }

            self.logger.info('生成身份设备信息完成')
            self.trigger.emit('生成身份设备信息完成!')

            # 在LOL的官网经过分析champion.js中包含了我们要用到的英雄ID编号,因此,将这个JS文件下载下来
            champion_js_url = "https://lol.qq.com/biz/hero/champion.js"

            # 发送http请求、请求地址为这个JS文件的地址。就会将其下载下来了。
            response = requests.get(url=champion_js_url, headers=headers)

            self.logger.info('champion.js 文件下载完成')
            self.trigger.emit('champion.js 文件下载完成!')

            # 获取下载的文本信息
            text = response.text
            self.logger.info('champion.js 文本信息:' + text)

            # 匹配champion对象对应的JSON数据,该JSON数据的第0个位置是包含英雄ID编号的JSON数据
            hero_json = re.findall(r'champion=(.*?);', text, re.S)[0]

            # 将JSON数据转换为dict字典
            hero_dict = json.loads(hero_json)
            self.logger.info('英雄ID字典信息:' + str(hero_dict))

            # 逐个英雄信息遍历
            for hero_data in hero_dict["data"].items():

                # 获取英雄详细信息的JS文件
                hero_js_url = "http://lol.qq.com/biz/hero/{}.js"

                # 发送请求下载该JS文件、hero_data[0]取第0位就是英雄ID
                response = requests.get(url=hero_js_url.format(hero_data[0]), headers=headers)

                # 获取下载文本
                text = response.text
                self.logger.info(hero_data[0] + '.js 文本信息:' + text)
                self.trigger.emit(hero_data[0] + '.js 文件下载完成!')

                skins_dict = json.loads(re.findall("{}=(.*?);".format(hero_data[0]), text, re.S)[0])
                self.logger.info('当前英雄皮肤字典:' + str(skins_dict))

                # 从字典 skins_dict 获取皮肤列表
                skins_list = skins_dict["data"]["skins"]

                # 获取英雄名称
                hero_name = hero_data[1]["name"]

                # 在当前目录下面创建images文件夹、以英雄名称作为文件夹名称
                os.makedirs(r"./images/{}".format(hero_name), exist_ok=True)

                for skin_info in skins_list:

                    # 初始化皮肤图片地址
                    skin_pic_url = "https://ossweb-img.qq.com/images/lol/web201310/skin/big{}.jpg"

                    # 发送下载请求
                    reponse = requests.get(url=skin_pic_url.format(skin_info["id"]), headers=headers)

                    try:
                        self.logger.info('保存路径' + self.parent.save_dir.text().strip())

                        # 保存皮肤
                        with open(r"" + self.parent.save_dir.text().strip() + "/{}/{}.jpg".format(hero_name,
                                                                                                 skin_info["name"]),
                                  "wb") as f:
                            f.write(reponse.content)

                        self.logger.info("{} 下载完成!".format(skin_info["name"]))
                        self.trigger.emit("{} 下载完成!".format(skin_info["name"]))

                    except:
                        self.logger.error(skin_info["name"] + ',下载出现异常.跳过执行下一个!')
                        self.trigger.emit(skin_info["name"] + ',下载出现异常.跳过执行下一个!')

            self.sleep(round(random(), 5))

由于有很多商家下载这篇文章,方便大家查看。基本上,我已经在主要代码块上写下了注释,需要的合作伙伴可以根据自己的需求进行修改。

[En]

As there are many businesses to download this piece, it is convenient for everyone to check it out. Basically, I have written comments on the main code blocks, and the needed partners can modify them according to their own needs.

公众号内回复”英雄联盟皮肤下载器”获取完整源代码…

哈撒给,英雄联盟全皮肤下载器来了

我是 [Python 集中营]、很高兴您看到了最后, 我是一个专注于 Python 知识分享的公众号,希望可以得到您的关注~

【往期精彩】

PyQt5的敏感词检测工具制作,运营者的福音…

手绘图片生成器:以雪蓉为例,一键生成。

[En]

Hand-painted picture generator: take Xue Rong Rong as an example, one-click generation.

最新发布的冬奥会吉祥物:冰墩,附源代码。

[En]

The newly released mascot of the Winter Olympic Games: ice pier, with source code.

最优美的表格查看插件:tabulate

抖音同款课堂点名系统,PyQt5写起来很简单…

Original: https://www.cnblogs.com/lwsbc/p/15902332.html
Author: Python集中营
Title: 哈撒给,英雄联盟全皮肤下载器来了

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/510012/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【AI实战】超赞的几个OCR开源项目

    OCR OCR(optical character recognition)文字识别是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,然后用字符识别方法将形状翻译成计算机文字…

    Python 2023年10月26日
    055
  • 太酷了,手把手教你用 Python 绘制桑基图

    Original: https://www.cnblogs.com/123456feng/p/16210997.htmlAuthor: 蚂蚁ailingTitle: 太酷了,手把手…

    Python 2023年5月24日
    072
  • Scrapy抓取滚动加载的页面

    在之前的文章中我们讲了如何安装scrapy,以及使用一个简单的示例程序抓取的腾讯视频的一些数据。链接https://blog.csdn.net/guo_zhen_qian/arti…

    Python 2023年10月1日
    056
  • 如何为 Django 服务配置负载均衡

    现在的 Web 服务有一个很重要的性能指标叫 QPS,QPS 的全称是 Queries Per Second 意思是”每秒查询率”,是一台服务器每秒能够相应…

    Python 2023年8月5日
    043
  • Flask 简单GET/POST请求处理

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年8月11日
    062
  • This Python interpreter is in a conda environment, but the environment hasnot been activated. 如何解决?

    1.问题简介 一个感觉啥也不会的python小白,一两个月前,朋友帮我装好了我自己电脑环境下的spyder,以及之后会用到的各种库。今天用cmd查看到库全装上了,但是代码运行仍然报…

    Python 2023年8月1日
    058
  • wifi热点setting

    一、wifi原生setting的入口在WifiTetherSettings.java 二、改热点Setting的时候可以直接只编译Settings.apk,并且替换, 三、wifi…

    Python 2023年9月28日
    063
  • 三分钟读懂新一代人工智能——ChatGPT

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年11月4日
    043
  • 微信小程序|基于小程序+C#制作一个聊天系统

    此文主要基于小程序+C#使用WebSocket制作一个聊天系统,基本实现小程序与服务端的聊天功能。用小程序自带的客服功能只能绑定微信且一对一沟通,接入市面上成熟的即时通讯预算又略显…

    Python 2023年9月16日
    047
  • 轻轻学爬虫—scrapy框架巧用2

    轻轻学爬虫—scrapy框架巧用2 上一节课相信大家都对scrapy有了一些了解,scrapy的安装应该也是熟练掌握了。本节给大家继续带来scrapy的学习。 进入终端 创建一个s…

    Python 2023年10月7日
    038
  • 【Pandas学习】行列切片、索引、添加、交换和删除操作

    一、行操作 选择某一行 选择多行 增加行 交换行 删除行 二、列操作 更改列名 选择某一列 选择多列 增加列,如果对已有的列,则是赋值 交换两列的值 删除列 建立测试数据集: im…

    Python 2023年8月17日
    063
  • Python常用库及使用介绍

    python 库是参考其它编程语言的说法,就是指 python 中的完成一定功能的代码集合,供用户使用的代码组合。在 python 中是包和模块的形式。 一般按照 API 的惯例来…

    Python 2023年8月9日
    040
  • 【Vue】webpack的基本使用

    ✍️ 作者简介: 前端新手学习中。 💂 作者主页: 作者主页查看更多前端教学 🎓 专栏分享:css重难点教学 Node.js教学 从头开始学习 ajax学习 文章目录 webpac…

    Python 2023年9月25日
    063
  • 字符串格式化

    在编写程序中经常需要动态输出字符串。例如,我们通过程序计算计算机的内存利用率,然后输出 10:15 计算机的内存利用率为30% 其中下划线部分的内容会动态调整,需要根据执行结果进行…

    Python 2023年11月1日
    050
  • centos安装django mysql

    1.安装Python 3我们将从软件集合(SCL)信息库中安装Python 3.6。 CentOS 7随附Python 2.7.5,这是CentOS基本系统的关键部分。 SCL允许…

    Python 2023年8月4日
    042
  • drf — 版本管理类

    为了方便版本管理,drf为我们提供了5个版本管理类 QueryParameterVersioning (将版本信息以URL参数的形式传递) URLPathVersioning (将…

    Python 2023年6月10日
    070
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球