From cfb06c74ed93e95823d855fa539d7e2af80d0fd9 Mon Sep 17 00:00:00 2001 From: seilor junior Date: Thu, 5 Mar 2026 13:31:14 -0300 Subject: [PATCH] Refactor code structure for improved readability and maintainability --- GhostTR.py | 216 +++++++++++++++++++++------- __pycache__/GhostTR.cpython-313.pyc | Bin 0 -> 23204 bytes 2 files changed, 168 insertions(+), 48 deletions(-) create mode 100644 __pycache__/GhostTR.cpython-313.pyc diff --git a/GhostTR.py b/GhostTR.py index ccc1455c..c1e6d3b0 100644 --- a/GhostTR.py +++ b/GhostTR.py @@ -13,6 +13,7 @@ import phonenumbers from phonenumbers import carrier, geocoder, timezone from sys import stderr +from concurrent.futures import ThreadPoolExecutor, as_completed Bl = '\033[30m' # VARIABLE BUAT WARNA CUYY Re = '\033[1;31m' @@ -24,6 +25,18 @@ Wh = '\033[1;37m' +# HTTP Configuration +HEADERS = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' + '(KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'Accept-Language': 'en-US,en;q=0.5', +} + +REQUEST_TIMEOUT = 10 # seconds +MAX_WORKERS = 20 # concurrent threads + + # utilities # decorator for attaching run_banner to a function @@ -42,8 +55,11 @@ 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 + req_api = requests.get(f"http://ipwho.is/{ip}", headers=HEADERS, timeout=REQUEST_TIMEOUT) ip_data = json.loads(req_api.text) + if not ip_data.get('success', True): + print(f"\n {Re}Error: {ip_data.get('message', 'Invalid IP address')}") + return time.sleep(2) print(f"{Wh}\n IP target :{Gr}", ip) print(f"{Wh} Type IP :{Gr}", ip_data["type"]) @@ -56,8 +72,8 @@ def IP_Track(): 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']) + lat = ip_data['latitude'] + lon = 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"]) @@ -118,57 +134,160 @@ def phoneGW(): print(f" {Wh}Type :{Gr} This is another type of number") +# Social media sites list — each entry can have: +# url : profile URL template (use {} for username) +# name : display name +# err_code : HTTP code that means "not found" (default 404) +# err_text : if the site returns 200 for missing users, a string to look for in the body +SOCIAL_MEDIA = [ + # --- Major platforms --- + {"url": "https://www.facebook.com/{}", "name": "Facebook"}, + {"url": "https://www.instagram.com/{}", "name": "Instagram"}, + {"url": "https://x.com/{}", "name": "X (Twitter)"}, + {"url": "https://www.tiktok.com/@{}", "name": "TikTok"}, + {"url": "https://www.youtube.com/@{}", "name": "YouTube"}, + {"url": "https://www.linkedin.com/in/{}", "name": "LinkedIn"}, + {"url": "https://www.snapchat.com/add/{}", "name": "Snapchat"}, + {"url": "https://www.threads.net/@{}", "name": "Threads"}, + + # --- Dating (popular in Brazil) --- + {"url": "https://tinder.com/@{}", "name": "Tinder"}, + {"url": "https://badoo.com/profile/{}", "name": "Badoo"}, + {"url": "https://www.happn.com/app/user/{}", "name": "Happn"}, + {"url": "https://bumble.com/profile/{}", "name": "Bumble"}, + {"url": "https://hinge.co/profile/{}", "name": "Hinge"}, + {"url": "https://www.okcupid.com/profile/{}", "name": "OkCupid"}, + {"url": "https://www.pof.com/viewprofile.aspx?profile_id={}", "name": "Plenty of Fish"}, + {"url": "https://www.parperfeito.com.br/profile/{}", "name": "Par Perfeito"}, + {"url": "https://www.inner.circle/profile/{}", "name": "Inner Circle"}, + {"url": "https://grindr.com/profile/{}", "name": "Grindr"}, + {"url": "https://hornet.com/@{}", "name": "Hornet"}, + + # --- Dev / Tech --- + {"url": "https://github.com/{}", "name": "GitHub"}, + {"url": "https://gitlab.com/{}", "name": "GitLab"}, + {"url": "https://bitbucket.org/{}", "name": "Bitbucket"}, + {"url": "https://codepen.io/{}", "name": "CodePen"}, + {"url": "https://replit.com/@{}", "name": "Replit"}, + {"url": "https://stackoverflow.com/users/?tab=Accounts&SearchText={}", "name": "StackOverflow", "err_text": "page not found"}, + {"url": "https://dev.to/{}", "name": "DEV.to"}, + {"url": "https://hackernoon.com/@{}", "name": "HackerNoon"}, + + # --- Creative --- + {"url": "https://www.behance.net/{}", "name": "Behance"}, + {"url": "https://dribbble.com/{}", "name": "Dribbble"}, + {"url": "https://www.deviantart.com/{}", "name": "DeviantArt"}, + {"url": "https://www.flickr.com/people/{}", "name": "Flickr"}, + {"url": "https://unsplash.com/@{}", "name": "Unsplash"}, + {"url": "https://500px.com/p/{}", "name": "500px"}, + + # --- Music / Video --- + {"url": "https://soundcloud.com/{}", "name": "SoundCloud"}, + {"url": "https://open.spotify.com/user/{}", "name": "Spotify"}, + {"url": "https://www.twitch.tv/{}", "name": "Twitch"}, + {"url": "https://vimeo.com/{}", "name": "Vimeo"}, + {"url": "https://www.dailymotion.com/{}", "name": "Dailymotion"}, + + # --- Blogging / Writing --- + {"url": "https://medium.com/@{}", "name": "Medium"}, + {"url": "https://www.tumblr.com/{}", "name": "Tumblr"}, + {"url": "https://substack.com/@{}", "name": "Substack"}, + {"url": "https://{}.wordpress.com", "name": "WordPress"}, + {"url": "https://{}.blogspot.com", "name": "Blogger"}, + + # --- Social / Community --- + {"url": "https://www.reddit.com/user/{}", "name": "Reddit"}, + {"url": "https://www.quora.com/profile/{}", "name": "Quora"}, + {"url": "https://www.pinterest.com/{}", "name": "Pinterest"}, + {"url": "https://mastodon.social/@{}", "name": "Mastodon"}, + {"url": "https://t.me/{}", "name": "Telegram"}, + {"url": "https://www.weheartit.com/{}", "name": "We Heart It"}, + {"url": "https://ello.co/{}", "name": "Ello"}, + {"url": "https://www.producthunt.com/@{}", "name": "Product Hunt"}, + {"url": "https://about.me/{}", "name": "About.me"}, + {"url": "https://gravatar.com/{}", "name": "Gravatar"}, + {"url": "https://keybase.io/{}", "name": "Keybase"}, + {"url": "https://hub.docker.com/u/{}", "name": "Docker Hub"}, + + # --- Gaming --- + {"url": "https://steamcommunity.com/id/{}", "name": "Steam"}, + {"url": "https://www.roblox.com/user.aspx?username={}", "name": "Roblox", "err_text": "Page cannot be found"}, + {"url": "https://namemc.com/profile/{}", "name": "NameMC (Minecraft)"}, + {"url": "https://osu.ppy.sh/users/{}", "name": "osu!"}, + + # --- Finance --- + {"url": "https://cash.app/${}", "name": "Cash App"}, + {"url": "https://www.patreon.com/{}", "name": "Patreon"}, + + # --- Misc --- + {"url": "https://www.thingiverse.com/{}", "name": "Thingiverse"}, + {"url": "https://www.instructables.com/member/{}", "name": "Instructables"}, + {"url": "https://tryhackme.com/p/{}", "name": "TryHackMe"}, + {"url": "https://www.fiverr.com/{}", "name": "Fiverr"}, + {"url": "https://linktr.ee/{}", "name": "Linktree"}, +] + + +def _check_site(site, username, session): + """Check a single site for a username. Returns (name, url|None).""" + url = site['url'].format(username) + try: + resp = session.get(url, headers=HEADERS, timeout=REQUEST_TIMEOUT, allow_redirects=True) + + # Some sites return 200 even for missing users; check body text + if 'err_text' in site: + if resp.status_code == 200 and site['err_text'].lower() not in resp.text.lower(): + return (site['name'], url) + return (site['name'], None) + + # Default: treat 200 as found + if resp.status_code == 200: + return (site['name'], url) + + return (site['name'], None) + except requests.exceptions.RequestException: + return (site['name'], None) + + @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 + username = input(f"\n {Wh}Enter Username : {Gr}").strip() + if not username: + print(f"\n {Re}Username cannot be empty!") + return + + print(f"\n {Wh}[{Gr} * {Wh}] Searching {Gr}{len(SOCIAL_MEDIA)}{Wh} sites for \"{Gr}{username}{Wh}\" ...\n") + + found = [] + not_found = [] + + session = requests.Session() + with ThreadPoolExecutor(max_workers=MAX_WORKERS) as pool: + futures = { + pool.submit(_check_site, site, username, session): site + for site in SOCIAL_MEDIA + } + for future in as_completed(futures): + name, url = future.result() + if url: + found.append((name, url)) + print(f" {Wh}[ {Gr}+ {Wh}] {name}: {Gr}{url}") + else: + not_found.append(name) + print(f" {Wh}[ {Ye}- {Wh}] {name}: {Ye}Not Found") + + print(f"\n {Wh}========== {Gr}SEARCH COMPLETE {Wh}==========") + print(f" {Wh}[{Gr} + {Wh}] Found : {Gr}{len(found)}{Wh} sites") + print(f" {Wh}[{Ye} - {Wh}] Not Found: {Ye}{len(not_found)}{Wh} sites") - print(f"\n {Wh}========== {Gr}SHOW INFORMATION USERNAME {Wh}==========") - print() - for site, url in results.items(): - print(f" {Wh}[ {Gr}+ {Wh}] {site} : {Gr}{url}") + except Exception as e: + print(f"\n{Re}Error : {e}") @is_option def showIP(): - respone = requests.get('https://api.ipify.org/') + respone = requests.get('https://api.ipify.org/', headers=HEADERS, timeout=REQUEST_TIMEOUT) Show_IP = respone.text print(f"\n {Wh}========== {Gr}SHOW INFORMATION YOUR IP {Wh}==========") @@ -259,13 +378,14 @@ def is_in_options(num): def option(): # BANNER TOOLS clear() - stderr.writelines(f""" + banner_art = r""" ________ __ ______ __ / ____/ /_ ____ _____/ /_ /_ __/________ ______/ /__ / / __/ __ \/ __ \/ ___/ __/_____/ / / ___/ __ `/ ___/ //_/ / /_/ / / / / /_/ (__ ) /_/_____/ / / / / /_/ / /__/ ,< \____/_/ /_/\____/____/\__/ /_/ /_/ \__,_/\___/_/|_| - +""" + stderr.writelines(f"""{banner_art} {Wh}[ + ] C O D E B Y H U N X [ + ] """) diff --git a/__pycache__/GhostTR.cpython-313.pyc b/__pycache__/GhostTR.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64c22418cc458b61a5c4ab8649c99b37a3f62515 GIT binary patch literal 23204 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 SpJM*vR7=kh)58`6g#R0&jca!R literal 0 HcmV?d00001