|
| 1 | +# Import necessary libraries |
| 2 | +import requests # For making HTTP requests |
| 3 | +import argparse # For parsing command line arguments |
| 4 | +import concurrent.futures # For concurrent execution |
| 5 | +from collections import OrderedDict # For maintaining order of websites |
| 6 | +from colorama import init, Fore # For colored terminal output |
| 7 | +import time # For handling time-related tasks |
| 8 | +import random # For generating random numbers |
| 9 | + |
| 10 | +# Initialize colorama for colored output. |
| 11 | +init() |
| 12 | + |
| 13 | +# Ordered dictionary of websites to check for a given username. |
| 14 | +WEBSITES = OrderedDict([ |
| 15 | + ("Instagram", "https://www.instagram.com/{}"), |
| 16 | + ("Facebook", "https://www.facebook.com/{}"), |
| 17 | + ("YouTube", "https://www.youtube.com/user/{}"), |
| 18 | + ("Reddit", "https://www.reddit.com/user/{}"), |
| 19 | + ("GitHub", "https://github.com/{}"), |
| 20 | + ("Twitch", "https://www.twitch.tv/{}"), |
| 21 | + ("Pinterest", "https://www.pinterest.com/{}/"), |
| 22 | + ("TikTok", "https://www.tiktok.com/@{}"), |
| 23 | + ("Flickr", "https://www.flickr.com/photos/{}") |
| 24 | +]) |
| 25 | + |
| 26 | +REQUEST_DELAY = 2 # Delay in seconds between requests to the same website |
| 27 | +MAX_RETRIES = 3 # Maximum number of retries for a failed request |
| 28 | +last_request_times = {} # Dictionary to track the last request time for each website |
| 29 | + |
| 30 | +def check_username(website, username): |
| 31 | + """ |
| 32 | + Check if the username exists on the given website. |
| 33 | + Returns the full URL if the username exists, False otherwise. |
| 34 | + """ |
| 35 | + url = website.format(username) # Format the URL with the given username |
| 36 | + retries = 0 # Initialize retry counter |
| 37 | + |
| 38 | + # Retry loop |
| 39 | + while retries < MAX_RETRIES: |
| 40 | + try: |
| 41 | + # Implement rate limiting. |
| 42 | + current_time = time.time() |
| 43 | + if website in last_request_times and current_time - last_request_times[website] < REQUEST_DELAY: |
| 44 | + delay = REQUEST_DELAY - (current_time - last_request_times[website]) |
| 45 | + time.sleep(delay) # Sleep to maintain the request delay. |
| 46 | + |
| 47 | + response = requests.get(url) # Make the HTTP request |
| 48 | + last_request_times[website] = time.time() # Update the last request time. |
| 49 | + |
| 50 | + if response.status_code == 200: # Check if the request was successful. |
| 51 | + return url |
| 52 | + else: |
| 53 | + return False |
| 54 | + except requests.exceptions.RequestException: |
| 55 | + retries += 1 # Increment retry counter on exception. |
| 56 | + delay = random.uniform(1, 3) # Random delay between retries. |
| 57 | + time.sleep(delay) # Sleep for the delay period. |
| 58 | + |
| 59 | + return False # Return False if all retries failed. |
| 60 | + |
| 61 | +def main(): |
| 62 | + # Parse command line arguments. |
| 63 | + parser = argparse.ArgumentParser(description="Check if a username exists on various websites.") |
| 64 | + parser.add_argument("username", help="The username to check.") |
| 65 | + parser.add_argument("-o", "--output", help="Path to save the results to a file.") |
| 66 | + args = parser.parse_args() |
| 67 | + |
| 68 | + username = args.username # Username to check. |
| 69 | + output_file = args.output # Output file path. |
| 70 | + |
| 71 | + print(f"Checking for username: {username}") |
| 72 | + |
| 73 | + results = OrderedDict() # Dictionary to store results. |
| 74 | + |
| 75 | + # Use ThreadPoolExecutor for concurrent execution. |
| 76 | + with concurrent.futures.ThreadPoolExecutor() as executor: |
| 77 | + # Submit tasks to the executor. |
| 78 | + futures = {executor.submit(check_username, website, username): website_name for website_name, website in WEBSITES.items()} |
| 79 | + for future in concurrent.futures.as_completed(futures): |
| 80 | + website_name = futures[future] # Get the website name. |
| 81 | + try: |
| 82 | + result = future.result() # Get the result. |
| 83 | + except Exception as exc: |
| 84 | + print(f"{website_name} generated an exception: {exc}") |
| 85 | + result = False |
| 86 | + finally: |
| 87 | + results[website_name] = result # Store the result. |
| 88 | + |
| 89 | + # Print the results. |
| 90 | + print("\nResults:") |
| 91 | + for website, result in results.items(): |
| 92 | + if result: |
| 93 | + print(f"{Fore.GREEN}{website}: Found ({result})") |
| 94 | + else: |
| 95 | + print(f"{Fore.RED}{website}: Not Found") |
| 96 | + |
| 97 | + # Save results to a file if specified. |
| 98 | + if output_file: |
| 99 | + with open(output_file, "w") as f: |
| 100 | + for website, result in results.items(): |
| 101 | + if result: |
| 102 | + f.write(f"{website}: Found ({result})\n") |
| 103 | + else: |
| 104 | + f.write(f"{website}: Not Found\n") |
| 105 | + print(f"{Fore.GREEN}\nResults saved to {output_file}") |
| 106 | + |
| 107 | +# Call the main function |
| 108 | +main() |
0 commit comments