#------------------# import os,requests,json,time,sys,psutil,string,platform,glob,getpass,shutil,hashlib,random,subprocess,math,zipfile,threading #------------------# class MultiThreadDownload(threading.Thread): '''class for Multi-Thread Download''' def __init__(self,url,startpos,endpos,f): super(MultiThreadDownload,self).__init__() self.url = url self.startpos = startpos self.endpos = endpos self.fd = f def download(self): headers = {"Range":"bytes=%s-%s"%(self.startpos,self.endpos)} res = requests.get(self.url,headers=headers) self.fd.seek(self.startpos) self.fd.write(res.content) def run(self): self.download() class GMCLCore(object): '''The Main Class of the Launcher Core''' '''AuthWay="offline",Account="Steve",Password="",GamePath=".minecraft",Memory="1GB",Version="",Java=""''' ''' self.GetAuthWay(AuthWay) self.GetAccoutn(Account) self.__Password=Password self.__GamePath=GamePath self.GetMemory(Memory) self.__Version=Version self.__Java=Java ''' def __init__(self,LauncherName="GMCLCore",LauncherVersion="A0.2.0"): self.__LauncherName=LauncherName self.__LauncherVersion=LauncherVersion self.__UserAgent={'User-Agent':LauncherName+'/'+LauncherVersion+' ((GMCL Core Alpha 0.2.0;Alpha))'} def GetAuthWay(self,AuthWay): if(AuthWay=="offline"): self.__AuthWay="offline" elif(AuthWay=="online"): self.__AuthWay="online" else: return "Error:Wrong Auth Way." def GetMemory(self,Memory): if(Memory.count("B")>1 or Memory.count("b")>1): return "Error:Wrong Memory Unit" else: if(Memory.count("GB")==1): self.__Memory=Memory.replace("GB","") elif(Memory.count("MB")==1): self.__Memory=str(float(Memory.replace("MB",""))/1024) elif(Memory.count("Gb")==1): self.__Memory=str(float(Memory.replace("Gb",""))/8) elif(Memory.count("Mb")==1): self.__Memory=str(float(Memory.replace("Mb",""))/8/1024) else: return "Error:Wrong Memory Unit." def GetAccount(self,Account): if(self.__AuthWay=="online"): if(Account.count("@")==1): self.OnlineAuth(Account,self._Password) else: return "Error:Wrong Account." elif(self.__AuthWay=="offline"): if(Account.count("@")==1): return "Error:Wrong Account." else: self.OfflineAuth(Account) else: pass def GetUUID(self,Account): if(self.__AuthWay=="offline"): result="OfflinePlayer:"+Account md5=hashlib.md5() md5.update(result.encode(encoding='utf-8')) return md5.hexdigest() else: return "Error:Wrong Auth Way." def OnlineAuth(self,Account,Password): if(json.loads(requests.get("https://authserver.mojang.com/",headers=self.__UserAgent).text)['status']=="OK"): result=json.loads(requests.post("https://authserver.mojang.com/authenticate",'{"agent":{"name":"Minecraft","Version":1},"username":"'+Account+'","password":"'+Password+'"}',headers=self.__UserAgent).text) self.__Token=result['accessToken'] self.__UUID=result['selectedProfile']['id'] self.__ID=result['selectedProfile']['name'] else: return "Error:Fail to request Mojang\'s Auth Server." def OfflineAuth(self,Account): self.__ID=Account self.__UUID=self.GetUUID(Account) self.__Token="" def GetJavaPath(self): if(platform.system()=="Windows"): path="C:/" elif(platform.system()=="Linux"): path="/" else: path="/" i=0 for ipath in os.listdir(Path): FullDir=os.path.join(path,ipath) if(os.path.isfile(FullDir)): if("javaw.exe" in os.path.split(FullDir)[1]): return FullDir i+=1 if(i==1): break def SetJavaPath(self,path): if(path==None): return "Error:Wrong local address for java." else: self.__JAVA=path def Download(self,DownloadFrom,DownloadTo,ThreadNum=3): if(DownloadFrom=="" or DownloadTo==""): return "Error:Wrong online address or local address for download." else: url = DownloadFrom filename = DownloadTo filesize = int(requests.head(url).headers['Content-Length']) threadnum = ThreadNum threading.BoundedSemaphore(threadnum) step = filesize // threadnum mtd_list = [] start = 0 end = -1 tempf = open(filename,'w') tempf.close() with open(filename,'rb+') as f: fileno = f.fileno() while end < filesize -1: start = end +1 end = start + step -1 if end > filesize: end = filesize dup = os.dup(fileno) fd = os.fdopen(dup,'rb+',-1) t = MultiThreadDownload(url,start,end,fd) t.start() mtd_list.append(t) for i in mtd_list: i.join() launcher=GMCLCore("AAA","V250") launcher.Download("http://mirrors.163.com/centos/8.2.2004/isos/x86_64/CentOS-8.2.2004-x86_64-boot.iso","aa.iso")