import re, os, time, json, requests
from urllib.parse import unquote
import concurrent.futures as cfclass WangzheDownloader(object):def __init__(self):self.root = './heros/'if not os.path.exists(self.root):os.mkdir(self.root)self.numberSize = 6self.url = 'https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page={}&iOrder=0&SearchKey=sProdName&iSortNumClose=1&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=1607443031450'res = requests.get(self.url.format(0)).json()self.totalPage = int(res.get('iTotalPages'))self.sum = int(res.get('iTotalLines'))self.count = 0self.startTime = time.time()def size(self):print('壁纸分辨率及序号如下: ')size_list = ['1 > 缩略图','2 > 1024x768','3 > 1280x720','4 > 1280x1024','5 > 1440x900','6 > 1920x1080 (推荐)','7 > 1920x1200','8 > 1920x1440']for size in size_list:print(size)numberSize = input('请选择分辨率 (默认是6): ')self.numberSize = numberSize if numberSize else 6def name(self):url = 'https://pvp.qq.com/web201605/js/herolist.json'res = requests.get(url).json()self.hero = [item['cname'] for item in res]def down(self, img_name, img_url):res = requests.get(img_url)with open(img_name, 'wb') as f:f.write(res.content)self.count += 1endTime = time.time()self.show(self.count, self.sum, endTime-self.startTime)def page(self, numberPage):res = requests.get(self.url.format(numberPage)).json()for item in res.get('List'):img_name = re.sub('[/\\:*?"<>|]', '', unquote(item['sProdName']))temp = re.split('[·-]', img_name)control = Truefor each in temp:if each in self.hero:control = Falseimg_dir = self.root+eachif not os.path.exists(img_dir):os.mkdir(img_dir)img_name = img_dir+'/'+img_name+'.jpg'breakif control:img_dir = self.root+'其它'if not os.path.exists(img_dir):os.mkdir(img_dir)img_name = img_dir+'/'+img_name+'.jpg'img_url = unquote(item[f'sProdImgNo_{self.numberSize}'])img_url = img_url.replace('/200', '/0') self.down(img_name, img_url)def show(self, num, _sum, runTime):barLen = 20 perFin = num/_sumnumFin = round(barLen*perFin)numNon = barLen-numFinleftTime = (1-perFin)*(runTime/perFin)print(f"{num:0>{len(str(_sum))}}/{_sum}",f"|{'█'*numFin}{' '*numNon}|",f"任务进度: {perFin*100:.0f}%",f"已用时间: {runTime:.0f}S",f"剩余时间: {leftTime:.0f}S",end='\r')if num == _sum:print()def main(self):self.size()self.name()with cf.ThreadPoolExecutor() as tp:for page in range(self.totalPage):tp.submit(self.page, page)if __name__ == "__main__":WangzheDownloader().main()