diff --git a/GhostTR.py b/GhostTR.py index ccc1455..d1bf3b9 100644 --- a/GhostTR.py +++ b/GhostTR.py @@ -1,315 +1,333 @@ -#!/usr/bin/python -# << CODE BY HUNX04 -# << MAU RECODE ??? IZIN DULU LAH, MINIMAL TAG AKUN GITHUB MIMIN YANG MENGARAH KE AKUN INI, LEBIH GAMPANG SI PAKE FORK -# << KALAU DI ATAS TIDAK DI IKUTI MAKA AKAN MENDAPATKAN DOSA KARENA MIMIN GAK IKHLAS -# “Wahai orang-orang yang beriman! Janganlah kamu saling memakan harta sesamamu dengan jalan yang batil,” (QS. An Nisaa': 29). Rasulullah SAW juga melarang umatnya untuk mengambil hak orang lain tanpa izin. - -# IMPORT MODULE - -import json -import requests -import time -import os -import phonenumbers -from phonenumbers import carrier, geocoder, timezone -from sys import stderr - -Bl = '\033[30m' # VARIABLE BUAT WARNA CUYY -Re = '\033[1;31m' -Gr = '\033[1;32m' -Ye = '\033[1;33m' -Blu = '\033[1;34m' -Mage = '\033[1;35m' -Cy = '\033[1;36m' -Wh = '\033[1;37m' - - -# utilities - -# decorator for attaching run_banner to a function -def is_option(func): - def wrapper(*args, **kwargs): - run_banner() - func(*args, **kwargs) - - - return wrapper - - -# FUNCTIONS FOR MENU -@is_option -def IP_Track(): - ip = input(f"{Wh}\n Enter IP target : {Gr}") # INPUT IP ADDRESS - print() - print(f' {Wh}============= {Gr}SHOW INFORMATION IP ADDRESS {Wh}=============') - req_api = requests.get(f"http://ipwho.is/{ip}") # API IPWHOIS.IS - ip_data = json.loads(req_api.text) - time.sleep(2) - print(f"{Wh}\n IP target :{Gr}", ip) - print(f"{Wh} Type IP :{Gr}", ip_data["type"]) - print(f"{Wh} Country :{Gr}", ip_data["country"]) - print(f"{Wh} Country Code :{Gr}", ip_data["country_code"]) - print(f"{Wh} City :{Gr}", ip_data["city"]) - print(f"{Wh} Continent :{Gr}", ip_data["continent"]) - print(f"{Wh} Continent Code :{Gr}", ip_data["continent_code"]) - print(f"{Wh} Region :{Gr}", ip_data["region"]) - print(f"{Wh} Region Code :{Gr}", ip_data["region_code"]) - print(f"{Wh} Latitude :{Gr}", ip_data["latitude"]) - print(f"{Wh} Longitude :{Gr}", ip_data["longitude"]) - lat = int(ip_data['latitude']) - lon = int(ip_data['longitude']) - print(f"{Wh} Maps :{Gr}", f"https://www.google.com/maps/@{lat},{lon},8z") - print(f"{Wh} EU :{Gr}", ip_data["is_eu"]) - print(f"{Wh} Postal :{Gr}", ip_data["postal"]) - print(f"{Wh} Calling Code :{Gr}", ip_data["calling_code"]) - print(f"{Wh} Capital :{Gr}", ip_data["capital"]) - print(f"{Wh} Borders :{Gr}", ip_data["borders"]) - print(f"{Wh} Country Flag :{Gr}", ip_data["flag"]["emoji"]) - print(f"{Wh} ASN :{Gr}", ip_data["connection"]["asn"]) - print(f"{Wh} ORG :{Gr}", ip_data["connection"]["org"]) - print(f"{Wh} ISP :{Gr}", ip_data["connection"]["isp"]) - print(f"{Wh} Domain :{Gr}", ip_data["connection"]["domain"]) - print(f"{Wh} ID :{Gr}", ip_data["timezone"]["id"]) - print(f"{Wh} ABBR :{Gr}", ip_data["timezone"]["abbr"]) - print(f"{Wh} DST :{Gr}", ip_data["timezone"]["is_dst"]) - print(f"{Wh} Offset :{Gr}", ip_data["timezone"]["offset"]) - print(f"{Wh} UTC :{Gr}", ip_data["timezone"]["utc"]) - print(f"{Wh} Current Time :{Gr}", ip_data["timezone"]["current_time"]) - - -@is_option -def phoneGW(): - User_phone = input( - f"\n {Wh}Enter phone number target {Gr}Ex [+6281xxxxxxxxx] {Wh}: {Gr}") # INPUT NUMBER PHONE - default_region = "ID" # DEFAULT NEGARA INDONESIA - - parsed_number = phonenumbers.parse(User_phone, default_region) # VARIABLE PHONENUMBERS - region_code = phonenumbers.region_code_for_number(parsed_number) - jenis_provider = carrier.name_for_number(parsed_number, "en") - location = geocoder.description_for_number(parsed_number, "id") - is_valid_number = phonenumbers.is_valid_number(parsed_number) - is_possible_number = phonenumbers.is_possible_number(parsed_number) - formatted_number = phonenumbers.format_number(parsed_number, phonenumbers.PhoneNumberFormat.INTERNATIONAL) - formatted_number_for_mobile = phonenumbers.format_number_for_mobile_dialing(parsed_number, default_region, - with_formatting=True) - number_type = phonenumbers.number_type(parsed_number) - timezone1 = timezone.time_zones_for_number(parsed_number) - timezoneF = ', '.join(timezone1) - - print(f"\n {Wh}========== {Gr}SHOW INFORMATION PHONE NUMBERS {Wh}==========") - print(f"\n {Wh}Location :{Gr} {location}") - print(f" {Wh}Region Code :{Gr} {region_code}") - print(f" {Wh}Timezone :{Gr} {timezoneF}") - print(f" {Wh}Operator :{Gr} {jenis_provider}") - print(f" {Wh}Valid number :{Gr} {is_valid_number}") - print(f" {Wh}Possible number :{Gr} {is_possible_number}") - print(f" {Wh}International format :{Gr} {formatted_number}") - print(f" {Wh}Mobile format :{Gr} {formatted_number_for_mobile}") - print(f" {Wh}Original number :{Gr} {parsed_number.national_number}") - print( - f" {Wh}E.164 format :{Gr} {phonenumbers.format_number(parsed_number, phonenumbers.PhoneNumberFormat.E164)}") - print(f" {Wh}Country code :{Gr} {parsed_number.country_code}") - print(f" {Wh}Local number :{Gr} {parsed_number.national_number}") - if number_type == phonenumbers.PhoneNumberType.MOBILE: - print(f" {Wh}Type :{Gr} This is a mobile number") - elif number_type == phonenumbers.PhoneNumberType.FIXED_LINE: - print(f" {Wh}Type :{Gr} This is a fixed-line number") - else: - print(f" {Wh}Type :{Gr} This is another type of number") - - -@is_option -def TrackLu(): - try: - username = input(f"\n {Wh}Enter Username : {Gr}") - results = {} - social_media = [ - {"url": "https://www.facebook.com/{}", "name": "Facebook"}, - {"url": "https://www.twitter.com/{}", "name": "Twitter"}, - {"url": "https://www.instagram.com/{}", "name": "Instagram"}, - {"url": "https://www.linkedin.com/in/{}", "name": "LinkedIn"}, - {"url": "https://www.github.com/{}", "name": "GitHub"}, - {"url": "https://www.pinterest.com/{}", "name": "Pinterest"}, - {"url": "https://www.tumblr.com/{}", "name": "Tumblr"}, - {"url": "https://www.youtube.com/{}", "name": "Youtube"}, - {"url": "https://soundcloud.com/{}", "name": "SoundCloud"}, - {"url": "https://www.snapchat.com/add/{}", "name": "Snapchat"}, - {"url": "https://www.tiktok.com/@{}", "name": "TikTok"}, - {"url": "https://www.behance.net/{}", "name": "Behance"}, - {"url": "https://www.medium.com/@{}", "name": "Medium"}, - {"url": "https://www.quora.com/profile/{}", "name": "Quora"}, - {"url": "https://www.flickr.com/people/{}", "name": "Flickr"}, - {"url": "https://www.periscope.tv/{}", "name": "Periscope"}, - {"url": "https://www.twitch.tv/{}", "name": "Twitch"}, - {"url": "https://www.dribbble.com/{}", "name": "Dribbble"}, - {"url": "https://www.stumbleupon.com/stumbler/{}", "name": "StumbleUpon"}, - {"url": "https://www.ello.co/{}", "name": "Ello"}, - {"url": "https://www.producthunt.com/@{}", "name": "Product Hunt"}, - {"url": "https://www.snapchat.com/add/{}", "name": "Snapchat"}, - {"url": "https://www.telegram.me/{}", "name": "Telegram"}, - {"url": "https://www.weheartit.com/{}", "name": "We Heart It"} - ] - for site in social_media: - url = site['url'].format(username) - response = requests.get(url) - if response.status_code == 200: - results[site['name']] = url - else: - results[site['name']] = (f"{Ye}Username not found {Ye}!") - except Exception as e: - print(f"{Re}Error : {e}") - return - - print(f"\n {Wh}========== {Gr}SHOW INFORMATION USERNAME {Wh}==========") - print() - for site, url in results.items(): - print(f" {Wh}[ {Gr}+ {Wh}] {site} : {Gr}{url}") - - -@is_option -def showIP(): - respone = requests.get('https://api.ipify.org/') - Show_IP = respone.text - - print(f"\n {Wh}========== {Gr}SHOW INFORMATION YOUR IP {Wh}==========") - print(f"\n {Wh}[{Gr} + {Wh}] Your IP Adrress : {Gr}{Show_IP}") - print(f"\n {Wh}==============================================") - - -# OPTIONS -options = [ - { - 'num': 1, - 'text': 'IP Tracker', - 'func': IP_Track - }, - { - 'num': 2, - 'text': 'Show Your IP', - 'func': showIP - - }, - { - 'num': 3, - 'text': 'Phone Number Tracker', - 'func': phoneGW - }, - { - 'num': 4, - 'text': 'Username Tracker', - 'func': TrackLu - }, - { - 'num': 0, - 'text': 'Exit', - 'func': exit - } -] - - -def clear(): - # for windows - if os.name == 'nt': - _ = os.system('cls') - # for mac and linux - else: - _ = os.system('clear') - - -def call_option(opt): - if not is_in_options(opt): - raise ValueError('Option not found') - for option in options: - if option['num'] == opt: - if 'func' in option: - option['func']() - else: - print('No function detected') - - -def execute_option(opt): - try: - call_option(opt) - input(f'\n{Wh}[ {Gr}+ {Wh}] {Gr}Press enter to continue') - main() - except ValueError as e: - print(e) - time.sleep(2) - execute_option(opt) - except KeyboardInterrupt: - print(f'\n{Wh}[ {Re}! {Wh}] {Re}Exit') - time.sleep(2) - exit() - - -def option_text(): - text = '' - for opt in options: - text += f'{Wh}[ {opt["num"]} ] {Gr}{opt["text"]}\n' - return text - - -def is_in_options(num): - for opt in options: - if opt['num'] == num: - return True - return False - - -def option(): - # BANNER TOOLS - clear() - stderr.writelines(f""" - ________ __ ______ __ - / ____/ /_ ____ _____/ /_ /_ __/________ ______/ /__ - / / __/ __ \/ __ \/ ___/ __/_____/ / / ___/ __ `/ ___/ //_/ - / /_/ / / / / /_/ (__ ) /_/_____/ / / / / /_/ / /__/ ,< - \____/_/ /_/\____/____/\__/ /_/ /_/ \__,_/\___/_/|_| - - {Wh}[ + ] C O D E B Y H U N X [ + ] - """) - - stderr.writelines(f"\n\n\n{option_text()}") - - -def run_banner(): - clear() - time.sleep(1) - stderr.writelines(f"""{Wh} - .-. - .' `. {Wh}-------------------------------- - :g g : {Wh}| {Gr}GHOST - TRACKER - IP ADDRESS {Wh}| - : o `. {Wh}| {Gr}@CODE BY HUNXBYTS {Wh}| - : ``. {Wh}-------------------------------- - : `. - : : . `. - : : ` . `. - `.. : `. ``; - `:; `:' - : `. - `. `. . - `'`'`'`---..,___`;.-' - """) - time.sleep(0.5) - - -def main(): - clear() - option() - time.sleep(1) - try: - opt = int(input(f"{Wh}\n [ + ] {Gr}Select Option : {Wh}")) - execute_option(opt) - except ValueError: - print(f'\n{Wh}[ {Re}! {Wh}] {Re}Please input number') - time.sleep(2) - main() - - -if __name__ == '__main__': - try: - main() - except KeyboardInterrupt: - print(f'\n{Wh}[ {Re}! {Wh}] {Re}Exit') - time.sleep(2) - exit() +#!/usr/bin/python +# << CODE BY HUNX04 +# << MAU RECODE ??? IZIN DULU LAH, MINIMAL TAG AKUN GITHUB MIMIN YANG MENGARAH KE AKUN INI, LEBIH GAMPANG SI PAKE FORK +# << KALAU DI ATAS TIDAK DI IKUTI MAKA AKAN MENDAPATKAN DOSA KARENA MIMIN GAK IKHLAS +# “Wahai orang-orang yang beriman! Janganlah kamu saling memakan harta sesamamu dengan jalan yang batil,” (QS. An Nisaa': 29). Rasulullah SAW juga melarang umatnya untuk mengambil hak orang lain tanpa izin. + +# Translated to English +# << WANT TO RECODE??? PERMISSION FIRST, AT LEAST THE GITHUB MIMIN ACCOUNT TAG THAT LEADS TO THIS ACCOUNT, IS EASIER TO USE FORK +# << IF YOU DON'T FOLLOW THE ABOVE, YOU WILL SIN BECAUSE YOU ARE NOT SINCERE +# “O you who believe! Do not consume each other's wealth in a false way,” (QS. An Nisaa': 29). Rasulullah SAW also prohibited his people from taking other people's rights without permission. + +# IMPORT MODULE +import json +import requests +import time +import os +import phonenumbers +from phonenumbers import carrier, geocoder, timezone +from sys import stderr + +Bl = '\033[30m' # VARIABLE BUAT WARNA CUYY +Re = '\033[1;31m' +Gr = '\033[1;32m' +Ye = '\033[1;33m' +Blu = '\033[1;34m' +Mage = '\033[1;35m' +Cy = '\033[1;36m' +Wh = '\033[1;37m' + + +# utilities + +# decorator for attaching run_banner to a function +def is_option(func): + def wrapper(*args, **kwargs): + run_banner() + func(*args, **kwargs) + return wrapper + + +# FUNCTIONS FOR MENU +@is_option +def IP_Track(): + ip = input(f"{Wh}\n Enter IP target : {Gr}") # INPUT IP ADDRESS + print() + print(f' {Wh}============= {Gr}SHOW INFORMATION IP ADDRESS {Wh}=============') + req_api = requests.get(f"http://ipwho.is/{ip}") # API IPWHOIS.IS + ip_data = json.loads(req_api.text) + time.sleep(2) + print(f"{Wh}\n IP target :{Gr}", ip) + print(f"{Wh} Type IP :{Gr}", ip_data["type"]) + print(f"{Wh} Country :{Gr}", ip_data["country"]) + print(f"{Wh} Country Code :{Gr}", ip_data["country_code"]) + print(f"{Wh} City :{Gr}", ip_data["city"]) + print(f"{Wh} Continent :{Gr}", ip_data["continent"]) + print(f"{Wh} Continent Code :{Gr}", ip_data["continent_code"]) + print(f"{Wh} Region :{Gr}", ip_data["region"]) + print(f"{Wh} Region Code :{Gr}", ip_data["region_code"]) + print(f"{Wh} Latitude :{Gr}", ip_data["latitude"]) + print(f"{Wh} Longitude :{Gr}", ip_data["longitude"]) + lat = int(ip_data['latitude']) + lon = int(ip_data['longitude']) + print(f"{Wh} Maps :{Gr}", f"https://www.google.com/maps/@{lat},{lon},8z") + print(f"{Wh} EU :{Gr}", ip_data["is_eu"]) + print(f"{Wh} Postal :{Gr}", ip_data["postal"]) + print(f"{Wh} Calling Code :{Gr}", ip_data["calling_code"]) + print(f"{Wh} Capital :{Gr}", ip_data["capital"]) + print(f"{Wh} Borders :{Gr}", ip_data["borders"]) + print(f"{Wh} Country Flag :{Gr}", ip_data["flag"]["emoji"]) + print(f"{Wh} ASN :{Gr}", ip_data["connection"]["asn"]) + print(f"{Wh} ORG :{Gr}", ip_data["connection"]["org"]) + print(f"{Wh} ISP :{Gr}", ip_data["connection"]["isp"]) + print(f"{Wh} Domain :{Gr}", ip_data["connection"]["domain"]) + print(f"{Wh} ID :{Gr}", ip_data["timezone"]["id"]) + print(f"{Wh} ABBR :{Gr}", ip_data["timezone"]["abbr"]) + print(f"{Wh} DST :{Gr}", ip_data["timezone"]["is_dst"]) + print(f"{Wh} Offset :{Gr}", ip_data["timezone"]["offset"]) + print(f"{Wh} UTC :{Gr}", ip_data["timezone"]["utc"]) + print(f"{Wh} Current Time :{Gr}", ip_data["timezone"].get("current_time", "N/A")) + + +@is_option +def phoneGW(): + User_phone = input( + f"\n {Wh}Enter phone number target {Gr}Ex [+6281xxxxxxxxx] {Wh}: {Gr}") # INPUT NUMBER PHONE + default_region = "ID" # DEFAULT NEGARA INDONESIA + + parsed_number = phonenumbers.parse(User_phone, default_region) # VARIABLE PHONENUMBERS + region_code = phonenumbers.region_code_for_number(parsed_number) + jenis_provider = carrier.name_for_number(parsed_number, "en") + location = geocoder.description_for_number(parsed_number, "id") + is_valid_number = phonenumbers.is_valid_number(parsed_number) + is_possible_number = phonenumbers.is_possible_number(parsed_number) + formatted_number = phonenumbers.format_number(parsed_number, phonenumbers.PhoneNumberFormat.INTERNATIONAL) + formatted_number_for_mobile = phonenumbers.format_number_for_mobile_dialing(parsed_number, default_region, + with_formatting=True) + number_type = phonenumbers.number_type(parsed_number) + timezone1 = timezone.time_zones_for_number(parsed_number) + timezoneF = ', '.join(timezone1) + + print(f"\n {Wh}========== {Gr}SHOW INFORMATION PHONE NUMBERS {Wh}==========") + print(f"\n {Wh}Location :{Gr} {location}") + print(f" {Wh}Region Code :{Gr} {region_code}") + print(f" {Wh}Timezone :{Gr} {timezoneF}") + print(f" {Wh}Operator :{Gr} {jenis_provider}") + print(f" {Wh}Valid number :{Gr} {is_valid_number}") + print(f" {Wh}Possible number :{Gr} {is_possible_number}") + print(f" {Wh}International format :{Gr} {formatted_number}") + print(f" {Wh}Mobile format :{Gr} {formatted_number_for_mobile}") + print(f" {Wh}Original number :{Gr} {parsed_number.national_number}") + print( + f" {Wh}E.164 format :{Gr} {phonenumbers.format_number(parsed_number, phonenumbers.PhoneNumberFormat.E164)}") + print(f" {Wh}Country code :{Gr} {parsed_number.country_code}") + print(f" {Wh}Local number :{Gr} {parsed_number.national_number}") + if number_type == phonenumbers.PhoneNumberType.MOBILE: + print(f" {Wh}Type :{Gr} This is a mobile number") + elif number_type == phonenumbers.PhoneNumberType.FIXED_LINE: + print(f" {Wh}Type :{Gr} This is a fixed-line number") + else: + print(f" {Wh}Type :{Gr} This is another type of number") + + +@is_option +def TrackLu(): + try: + username = input(f"\n {Wh}Enter Username : {Gr}") + results = {} + social_media = [ + {"url": "https://www.facebook.com/{}", "name": "Facebook"}, + {"url": "https://www.twitter.com/{}", "name": "Twitter"}, + {"url": "https://www.instagram.com/{}", "name": "Instagram"}, + {"url": "https://www.linkedin.com/in/{}", "name": "LinkedIn"}, + {"url": "https://www.github.com/{}", "name": "GitHub"}, + {"url": "https://www.pinterest.com/{}", "name": "Pinterest"}, + {"url": "https://www.tumblr.com/{}", "name": "Tumblr"}, + {"url": "https://www.youtube.com/{}", "name": "Youtube"}, + {"url": "https://soundcloud.com/{}", "name": "SoundCloud"}, + {"url": "https://www.snapchat.com/add/{}", "name": "Snapchat"}, + {"url": "https://www.tiktok.com/@{}", "name": "TikTok"}, + {"url": "https://www.behance.net/{}", "name": "Behance"}, + {"url": "https://www.medium.com/@{}", "name": "Medium"}, + {"url": "https://www.quora.com/profile/{}", "name": "Quora"}, + {"url": "https://www.flickr.com/people/{}", "name": "Flickr"}, + {"url": "https://www.periscope.tv/{}", "name": "Periscope"}, + {"url": "https://www.twitch.tv/{}", "name": "Twitch"}, + {"url": "https://www.dribbble.com/{}", "name": "Dribbble"}, + {"url": "https://www.stumbleupon.com/stumbler/{}", "name": "StumbleUpon"}, + {"url": "https://www.ello.co/{}", "name": "Ello"}, + {"url": "https://www.producthunt.com/@{}", "name": "Product Hunt"}, + {"url": "https://www.snapchat.com/add/{}", "name": "Snapchat"}, + {"url": "https://www.telegram.me/{}", "name": "Telegram"}, + {"url": "https://www.weheartit.com/{}", "name": "We Heart It"} + ] + + + 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", + "Accept-Language": "en-US,en;q=0.9", + } + + for site in social_media: + url = site['url'].format(username) + try: + response = requests.get(url, headers=headers, timeout=5) + if response.status_code == 200: + results[site['name']] = url + else: + results[site['name']] = (f"{Ye}Username not found {Ye}!") + except requests.exceptions.SSLError: + results[site['name']] = (f"{Re}SSL Error (Security Blocked){Wh}") + except requests.exceptions.RequestException: + results[site['name']] = (f"{Re}Connection Failed{Wh}") + except Exception as e: + results[site['name']] = (f"{Re}Error: {str(e)[:20]}...{Wh}") + except Exception as e: + print(f"{Re}Error : {e}") + return + + + print(f"\n {Wh}========== {Gr}SHOW INFORMATION USERNAME {Wh}==========") + print() + for site, url in results.items(): + print(f" {Wh}[ {Gr}+ {Wh}] {site} : {Gr}{url}") + + +@is_option +def showIP(): + respone = requests.get('https://api.ipify.org/') + Show_IP = respone.text + + print(f"\n {Wh}========== {Gr}SHOW INFORMATION YOUR IP {Wh}==========") + print(f"\n {Wh}[{Gr} + {Wh}] Your IP Adrress : {Gr}{Show_IP}") + print(f"\n {Wh}==============================================") + + +# OPTIONS +options = [ + { + 'num': 1, + 'text': 'IP Tracker', + 'func': IP_Track + }, + { + 'num': 2, + 'text': 'Show Your IP', + 'func': showIP + + }, + { + 'num': 3, + 'text': 'Phone Number Tracker', + 'func': phoneGW + }, + { + 'num': 4, + 'text': 'Username Tracker', + 'func': TrackLu + }, + { + 'num': 0, + 'text': 'Exit', + 'func': exit + } +] + + +def clear(): + # for windows + if os.name == 'nt': + _ = os.system('cls') + # for mac and linux + else: + _ = os.system('clear') + + +def call_option(opt): + if not is_in_options(opt): + raise ValueError('Option not found') + for option in options: + if option['num'] == opt: + if 'func' in option: + option['func']() + else: + print('No function detected') + +def execute_option(opt): + try: + call_option(opt) + input(f'\n{Wh}[ {Gr}+ {Wh}] {Gr}Press enter to return to menu...') + except ValueError as e: + print(f"\n{Re}Error: {e}") + time.sleep(2) + except KeyboardInterrupt: + print(f'\n{Wh}[ {Re}! {Wh}] {Re}Exit') + exit() + +def option_text(): + text = '' + for opt in options: + text += f'{Wh}[ {opt["num"]} ] {Gr}{opt["text"]}\n' + return text + + +def is_in_options(num): + for opt in options: + if opt['num'] == num: + return True + return False + + +def option(): + # BANNER TOOLS + clear() + stderr.writelines(f""" + ________ __ ______ __ + / ____/ /_ ____ _____/ /_ /_ __/________ ______/ /__ + / / __/ __ \/ __ \/ ___/ __/_____/ / / ___/ __ `/ ___/ //_/ + / /_/ / / / / /_/ (__ ) /_/_____/ / / / / /_/ / /__/ ,< + \____/_/ /_/\____/____/\__/ /_/ /_/ \__,_/\___/_/|_| + + {Wh}[ + ] C O D E B Y H U N X [ + ] + """) + + stderr.writelines(f"\n\n\n{option_text()}") + + +def run_banner(): + clear() + time.sleep(1) + stderr.writelines(f"""{Wh} + .-. + .' `. {Wh}-------------------------------- + :g g : {Wh}| {Gr}GHOST - TRACKER - IP ADDRESS {Wh}| + : o `. {Wh}| {Gr}@CODE BY HUNXBYTS {Wh}| + : ``. {Wh}-------------------------------- + : `. + : : . `. + : : ` . `. + `.. : `. ``; + `:; `:' + : `. + `. `. . + `'`'`'`---..,___`;.-' + """) + time.sleep(0.5) + +def main(): + while True: + clear() + option() + try: + opt_input = input(f"{Wh}\n [ + ] {Gr}Select Option : {Wh}") + if not opt_input.strip(): # Handles empty enter keys + continue + + opt = int(opt_input) + + if opt == 0: + print(f'\n{Wh}[ {Re}! {Wh}] {Re}Exiting...') + break + + execute_option(opt) + except ValueError: + print(f'\n{Wh}[ {Re}! {Wh}] {Re}Please input a valid number') + time.sleep(2) + +if __name__ == '__main__': + try: + main() + except KeyboardInterrupt: + print(f'\n{Wh}[ {Re}! {Wh}] {Re}Exit') + time.sleep(2) + exit()