├── 355773902211342 ├── credentials.json ├── ALDILA NOVANDA YUDANTINTO ├── King hack ├── requirements.txt ├── License ├── .vscode └── settings.json ├── templates ├── script.js ├── style.css └── index.html ├── README.md ├── .github └── FUNDING.yml ├── PhoneNumber_Tracker ├── tracker.py ├── Locator.py └── directions_map.html ├── Track.py └── CyberTrack.py /355773902211342: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /credentials.json: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ALDILA NOVANDA YUDANTINTO: -------------------------------------------------------------------------------- 1 | AL 2 | -------------------------------------------------------------------------------- /King hack: -------------------------------------------------------------------------------- 1 | 351759873349571 2 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | requests==2.26.0 2 | -------------------------------------------------------------------------------- /License: -------------------------------------------------------------------------------- 1 | 📄 This project is licensed under the MIT License. -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "workbench.colorCustomizations": { 3 | "minimap.background": "#00000000", 4 | "scrollbar.shadow": "#00000000" 5 | } 6 | } -------------------------------------------------------------------------------- /templates/script.js: -------------------------------------------------------------------------------- 1 | function trackDevice() { 2 | var imei = document.getElementById('imeiInput').value; 3 | 4 | // Use jQuery for simplicity, you can use other methods like fetch 5 | $.get(`/track?imei=${imei}`, function(response) { 6 | console.log(response); 7 | }); 8 | } 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | ## Project Status 3 | 🚧 **Under Development:** The HTML, JS, and CSS components of the web interface are being actively developed. 4 | 5 | --- 6 | 7 | ## Collaboration Opportunities 🤝 8 | We are open to collaborating with developers and tech enthusiasts to enhance this project. 9 | If you have ideas or skills that can contribute to improving the IMEI Tracker, feel free to reach out! 10 | -------------------------------------------------------------------------------- /templates/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: 'Arial', sans-serif; 3 | background-color: aqua; 4 | text-align: center; 5 | justify-content: center; 6 | align-items: center; 7 | } 8 | 9 | .container { 10 | max-width: 400px; 11 | margin: 50px auto; 12 | padding: 20px; 13 | border: 1px solid #ccc; 14 | border-radius: 5px; 15 | } 16 | 17 | button { 18 | padding: 10px; 19 | margin-top: 10px; 20 | cursor: pointer; 21 | } 22 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: CHEGEBB 4 | patreon: CHEGEBB 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 12 | polar: # Replace with a single Polar username 13 | buy_me_a_coffee: # Replace with a single Buy Me a Coffee username 14 | thanks_dev: # Replace with a single thanks.dev username 15 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 16 | -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | IMEI Tracker 9 | 10 | 11 |

IMEI Tracker

12 | 13 | 17 |
18 | 19 | 20 |
21 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /PhoneNumber_Tracker/tracker.py: -------------------------------------------------------------------------------- 1 | import webbrowser 2 | import requests 3 | 4 | def get_location(lat, lng, api_key): 5 | url = f"https://api.opencagedata.com/geocode/v1/json?q={lat},{lng}&key={api_key}" 6 | response = requests.get(url) 7 | data = response.json() 8 | if data['results']: 9 | return data['results'][0]['formatted'] 10 | else: 11 | return None 12 | 13 | def main(): 14 | api_key = 'YOUR_API_KEY' # Replace with your OpenCage API key 15 | current_lat = input("Enter your current latitude: ") 16 | current_lng = input("Enter your current longitude: ") 17 | dest_lat = input("Enter destination latitude: ") 18 | dest_lng = input("Enter destination longitude: ") 19 | 20 | current_location = get_location(current_lat, current_lng, api_key) 21 | dest_location = get_location(dest_lat, dest_lng, api_key) 22 | 23 | print(f"Your current location: {current_location}") 24 | print(f"Destination location: {dest_location}") 25 | 26 | maps_url = f"https://www.google.com/maps/dir/{current_lat},{current_lng}/{dest_lat},{dest_lng}" 27 | webbrowser.open(maps_url) 28 | 29 | if __name__ == "__main__": 30 | main() 31 | -------------------------------------------------------------------------------- /PhoneNumber_Tracker/Locator.py: -------------------------------------------------------------------------------- 1 | import phonenumbers 2 | from phonenumbers import geocoder as phonenumbers_geocoder 3 | from phonenumbers import carrier 4 | from opencage.geocoder import OpenCageGeocode 5 | import webbrowser 6 | import math 7 | import time 8 | import sys 9 | from colorama import Fore, Style 10 | 11 | # Replace with your OpenCage API key 12 | key = "8c3d04ff9f4a410b8ba3d6e8aa9408f7" 13 | 14 | def get_coordinates(location, api_key): 15 | geocoder = OpenCageGeocode(api_key) 16 | result = geocoder.geocode(location) 17 | if result and len(result): 18 | return result[0]['geometry']['lat'], result[0]['geometry']['lng'] 19 | else: 20 | return None, None 21 | 22 | def calculate_distance(lat1, lng1, lat2, lng2): 23 | R = 6371.0 # radius of the Earth in km 24 | 25 | lat1_rad = math.radians(lat1) 26 | lng1_rad = math.radians(lng1) 27 | lat2_rad = math.radians(lat2) 28 | lng2_rad = math.radians(lng2) 29 | 30 | dlng = lng2_rad - lng1_rad 31 | dlat = lat2_rad - lat1_rad 32 | 33 | a = math.sin(dlat / 2)**2 + math.cos(lat1_rad) * math.cos(lat2_rad) * math.sin(dlng / 2)**2 34 | c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) 35 | 36 | distance = R * c # distance in km 37 | return distance 38 | 39 | def print_animated_message(message): 40 | animation = "|/-\\" 41 | for i in range(20): 42 | time.sleep(0.1) 43 | sys.stdout.write(f"\r{Fore.GREEN}{animation[i % len(animation)]} {message}{Style.RESET_ALL}") 44 | sys.stdout.flush() 45 | 46 | def banner(): 47 | print(Fore.YELLOW + r""" 48 | 49 | _____ _____ _ _______ _ 50 | / ____| | __ \| | |__ __| | | 51 | | | __ ___ ___ | |__) | |__ ___ _ __ ___| |_ __ __ _ ___| | _____ _ __ 52 | | | |_ |/ _ \/ _ \| ___/| '_ \ / _ \| '_ \ / _ | | '__/ _` |/ __| |/ / _ | '__| 53 | | |__| | __| (_) | | | | | | (_) | | | | __| | | | (_| | (__| | __| | 54 | \_____|\___|\___/|_| |_| |_|\___/|_| |_|\___|_|_| \__,_|\___|_|\_\___|_| 55 | 56 | 57 | 58 | 59 | """ + Style.RESET_ALL) 60 | print(Fore.YELLOW + "Created by CHEGEBB" + Style.RESET_ALL) 61 | print(Fore.YELLOW + "Computer Science Student and Cybersecurity Enthusiast" + Style.RESET_ALL) 62 | print(Fore.YELLOW + "GitHub: https://github.com/CHEGEBB" + Style.RESET_ALL) 63 | 64 | def menu(): 65 | print(Fore.BLUE + "\nMenu:") 66 | print("[1] Locate Phone Number") 67 | print("[2] Exit" + Style.RESET_ALL) 68 | 69 | def locate_phone_number(): 70 | print(Fore.BLUE + "\nLocate Phone Number:") 71 | number = input("Enter phone number in international format (e.g., +123456789): ") 72 | new_number = phonenumbers.parse(number) 73 | location = phonenumbers_geocoder.description_for_number(new_number, "en") 74 | print(f"\nLocation based on phone number: {Fore.GREEN}{location}{Style.RESET_ALL}") 75 | service_name = carrier.name_for_number(new_number, "en") 76 | print(f"Service provider: {Fore.BLUE}{service_name}{Style.RESET_ALL}") 77 | geocoder_client = OpenCageGeocode(key) 78 | query = str(location) 79 | print("\nLocating the target coordinates...") 80 | result = geocoder_client.geocode(query) 81 | if result and len(result): 82 | target_lat = result[0]['geometry']['lat'] 83 | target_lng = result[0]['geometry']['lng'] 84 | print(f"Target coordinates: {Fore.GREEN}{target_lat}, {target_lng}{Style.RESET_ALL}") 85 | print(Fore.BLUE + "\nEnter your current location (city or address):" + Style.RESET_ALL) 86 | user_location_input = input("Location: ") 87 | print("\nLocating your current coordinates...") 88 | user_lat, user_lng = get_coordinates(user_location_input, key) 89 | if user_lat is not None and user_lng is not None: 90 | print(f"Your current location: {Fore.GREEN}{user_location_input}{Style.RESET_ALL}") 91 | distance = calculate_distance(user_lat, user_lng, target_lat, target_lng) 92 | print(f"Distance to target location: {Fore.BLUE}{distance:.2f} km{Style.RESET_ALL}") 93 | maps_url = f"https://www.google.com/maps/dir/{user_lat},{user_lng}/{target_lat},{target_lng}" 94 | webbrowser.open(maps_url) 95 | else: 96 | print(f"\nFailed to geocode the location: {Fore.RED}{user_location_input}{Style.RESET_ALL}") 97 | else: 98 | print("\nFailed to geocode the target location.") 99 | 100 | def main(): 101 | banner() 102 | print_animated_message("Welcome to Phone Number Locator!") 103 | 104 | while True: 105 | menu() 106 | option = input("\nChoose an option: ") 107 | 108 | if option == "1": 109 | locate_phone_number() 110 | elif option == "2": 111 | print("Exiting...") 112 | break 113 | else: 114 | print("Invalid option. Please choose again.") 115 | 116 | if __name__ == "__main__": 117 | main() 118 | -------------------------------------------------------------------------------- /Track.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import time 3 | import webbrowser 4 | from getpass import getpass 5 | import os 6 | from time import sleep 7 | import re 8 | 9 | def clear_screen(): 10 | os.system('clear') 11 | 12 | def animate_text(text, delay=0.03): 13 | for char in text: 14 | print(char, end='', flush=True) 15 | sleep(delay) 16 | print() 17 | 18 | def show_banner(): 19 | banner = """ 20 | ╔══════════════════════════════════════╗ 21 | ║ IMEI TRACKER v2.0 ║ 22 | ║ Created for Termux Users ║ 23 | ╚══════════════════════════════════════╝ 24 | """ 25 | print("\033[94m" + banner + "\033[0m") 26 | 27 | def loading_animation(text, duration=2): 28 | symbols = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] 29 | start_time = time.time() 30 | i = 0 31 | while time.time() - start_time < duration: 32 | print(f'\r{text} {symbols[i%len(symbols)]}', end='', flush=True) 33 | time.sleep(0.1) 34 | i += 1 35 | print() 36 | 37 | def validate_imei(imei): 38 | """Validate IMEI number format.""" 39 | if not re.match(r'^\d{15}$', imei): 40 | return False 41 | return True 42 | 43 | def validate_email(email): 44 | """Validate email format.""" 45 | pattern = r'^[\w\.-]+@[\w\.-]+\.\w+$' 46 | return re.match(pattern, email) is not None 47 | 48 | def authenticate(gmail, password): 49 | loading_animation("Authenticating with Google Find My Device") 50 | # This is a simulation - in a real implementation, you would use Google's API 51 | return True 52 | 53 | def authenticate_apple(apple_id, password): 54 | loading_animation("Authenticating with Apple Find My iPhone") 55 | # This is a simulation - in a real implementation, you would use Apple's API 56 | return True 57 | 58 | def request_location(imei): 59 | loading_animation("Requesting device location") 60 | # Simulated location request 61 | return "37.7749,-122.4194" 62 | 63 | def parse_location(response_text): 64 | try: 65 | latitude, longitude = map(float, response_text.strip().split(',')) 66 | return f"{latitude},{longitude}" 67 | except (ValueError, AttributeError): 68 | animate_text("Error: Could not parse location information.", 0.03) 69 | return None 70 | 71 | def track_android(imei, gmail, password): 72 | if not validate_imei(imei): 73 | animate_text("Error: Invalid IMEI format. Please enter a 15-digit IMEI number.", 0.03) 74 | return 75 | 76 | if not validate_email(gmail): 77 | animate_text("Error: Invalid email format.", 0.03) 78 | return 79 | 80 | animate_text(f"Tracking Android device with IMEI: {imei}", 0.03) 81 | 82 | if authenticate(gmail, password): 83 | response_text = request_location(imei) 84 | if response_text: 85 | location = parse_location(response_text) 86 | if location: 87 | find_my_device_url = f"https://www.google.com/android/find?u=0&hl=en&source=android-browser&q={location}" 88 | animate_text("\nLocation found! Opening map...", 0.03) 89 | print(f"\n\033[92mDevice Location URL:\033[0m {find_my_device_url}") 90 | try: 91 | webbrowser.open(find_my_device_url) 92 | except Exception as e: 93 | print(f"\n\033[91mError opening browser: {e}\033[0m") 94 | 95 | def track_iphone(apple_id, password): 96 | if not validate_email(apple_id): 97 | animate_text("Error: Invalid Apple ID format.", 0.03) 98 | return 99 | 100 | animate_text(f"Tracking iPhone device with Apple ID: {apple_id}", 0.03) 101 | 102 | if authenticate_apple(apple_id, password): 103 | # Simulated tracking process 104 | loading_animation("Accessing Find My iPhone service") 105 | animate_text("\nTracking completed. This is a simulation.", 0.03) 106 | 107 | def main(): 108 | try: 109 | while True: 110 | clear_screen() 111 | show_banner() 112 | 113 | animate_text("\nSelect device type:", 0.03) 114 | print("\033[96m1.\033[0m Android") 115 | print("\033[96m2.\033[0m iPhone") 116 | print("\033[96m3.\033[0m Exit") 117 | 118 | choice = input("\n\033[93mEnter your choice (1-3):\033[0m ") 119 | 120 | if choice == "1": 121 | clear_screen() 122 | show_banner() 123 | imei = input("\n\033[93mEnter IMEI:\033[0m ") 124 | gmail = input("\033[93mEnter Gmail:\033[0m ") 125 | password = getpass("\033[93mEnter Password:\033[0m ") 126 | track_android(imei, gmail, password) 127 | 128 | elif choice == "2": 129 | clear_screen() 130 | show_banner() 131 | apple_id = input("\n\033[93mEnter Apple ID:\033[0m ") 132 | password = getpass("\033[93mEnter Password:\033[0m ") 133 | track_iphone(apple_id, password) 134 | 135 | elif choice == "3": 136 | animate_text("\nThank you for using IMEI Tracker!", 0.03) 137 | break 138 | 139 | else: 140 | print("\n\033[91mInvalid choice. Please try again.\033[0m") 141 | 142 | input("\n\033[93mPress Enter to continue...\033[0m") 143 | 144 | except KeyboardInterrupt: 145 | print("\n\n\033[91mProgram terminated by user.\033[0m") 146 | except Exception as e: 147 | print(f"\n\033[91mAn error occurred: {e}\033[0m") 148 | 149 | if __name__ == "__main__": 150 | main() -------------------------------------------------------------------------------- /PhoneNumber_Tracker/directions_map.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 27 | 37 | 38 | 39 | 40 | 41 | 42 |
43 | 44 | 45 | 132 | -------------------------------------------------------------------------------- /CyberTrack.py: -------------------------------------------------------------------------------- 1 | import requests Track phone 2 | import time 23:25 3 | import webbrowser 4 | from tkinter import *354595804618131 5 | from tkinter import ttk 6 | from tkinter import simpledialog 7 | from tkinter import faryed078@gmail.com 8 | import threading 9 | from datetime import datetime 10 | import re 11 | import json 12 | from pathlib import Path 13 | from tkinter import font 14 | import os Android 15 | 16 | class FontManager: 17 | @staticmethod 18 | def load_rubik_font(): 19 | # Create fonts directory if it doesn't exist 20 | os.makedirs("fonts", exist_ok=True) 21 | 22 | # Define font files to check/download 23 | font_files = { 24 | "Rubik-Regular.ttf": "https://github.com/googlefonts/rubik/raw/main/fonts/ttf/Rubik-Regular.ttf", 25 | "Rubik-Bold.ttf": "https://github.com/googlefonts/rubik/raw/main/fonts/ttf/Rubik-Bold.ttf", 26 | "Rubik-Medium.ttf": "https://github.com/googlefonts/rubik/raw/main/fonts/ttf/Rubik-Medium.ttf" 27 | } 28 | 29 | # Download missing font files 30 | for font_file, url in font_files.items(): 31 | font_path = f"fonts/{font_file}" 32 | if not os.path.exists(font_path): 33 | try: 34 | response = requests.get(url) 35 | with open(font_path, 'wb') as f: 36 | f.write(response.content) 37 | except Exception as e: 38 | print(f"Error downloading font: {e}") 39 | return False 40 | 41 | # Load fonts into Tkinter 42 | for font_file in font_files.keys(): 43 | font_path = f"fonts/{font_file}" 44 | try: 45 | font.families() # Initialize font system 46 | font.Font(file=font_path) 47 | except Exception as e: 48 | print(f"Error loading font: {e}") 49 | return False 50 | 51 | return True 52 | 53 | class CustomFont: 54 | REGULAR = "Rubik" 55 | MEDIUM = "Rubik Medium" 56 | BOLD = "Rubik Bold" 57 | 58 | # Font sizes 59 | H1 = 24 60 | H2 = 18 61 | H3 = 16 62 | BODY = 12 63 | SMALL = 10 64 | 65 | class ThemeColors: 66 | PRIMARY = '#2C3E50' 67 | SECONDARY = '#34495E' 68 | ACCENT = '#3498DB' 69 | SUCCESS = '#27AE60' 70 | ERROR = '#E74C3C' 71 | WARNING = '#F39C12' 72 | TEXT_LIGHT = '#ECF0F1' 73 | TEXT_DARK = '#2C3E50' 74 | GRAY = '#BDC3C7' 75 | 76 | class LoginWindow: 77 | def __init__(self, on_login_success): 78 | self.window = Tk() 79 | self.window.title("🔐 Secure Login") 80 | self.window.geometry("400x500") 81 | self.window.configure(bg=ThemeColors.PRIMARY) 82 | 83 | self.on_login_success = on_login_success 84 | 85 | # Header 86 | self.header = Label( 87 | self.window, 88 | text="🌟 Welcome to Device Tracker Pro", 89 | font=(CustomFont.BOLD, CustomFont.H2), 90 | bg=ThemeColors.PRIMARY, 91 | fg=ThemeColors.TEXT_LIGHT 92 | ) 93 | self.header.pack(pady=20) 94 | 95 | # Login frame 96 | self.login_frame = Frame(self.window, bg=ThemeColors.SECONDARY, padx=20, pady=20) 97 | self.login_frame.pack(fill=X, padx=20) 98 | 99 | # Email 100 | Label( 101 | self.login_frame, 102 | text="📧 Email", 103 | bg=ThemeColors.SECONDARY, 104 | fg=ThemeColors.TEXT_LIGHT, 105 | font=(CustomFont.MEDIUM, CustomFont.BODY) 106 | ).pack(pady=5) 107 | 108 | self.email_entry = Entry( 109 | self.login_frame, 110 | font=(CustomFont.REGULAR, CustomFont.BODY), 111 | bg=ThemeColors.TEXT_LIGHT 112 | ) 113 | self.email_entry.pack(fill=X, pady=5) 114 | 115 | # Password 116 | Label( 117 | self.login_frame, 118 | text="🔑 Password", 119 | bg=ThemeColors.SECONDARY, 120 | fg=ThemeColors.TEXT_LIGHT, 121 | font=(CustomFont.MEDIUM, CustomFont.BODY) 122 | ).pack(pady=5) 123 | 124 | self.password_entry = Entry( 125 | self.login_frame, 126 | font=(CustomFont.REGULAR, CustomFont.BODY), 127 | bg=ThemeColors.TEXT_LIGHT, 128 | show="•" 129 | ) 130 | self.password_entry.pack(fill=X, pady=5) 131 | 132 | # Remember me 133 | self.remember_var = BooleanVar() 134 | Checkbutton( 135 | self.login_frame, 136 | text="Remember me", 137 | variable=self.remember_var, 138 | bg=ThemeColors.SECONDARY, 139 | fg=ThemeColors.TEXT_LIGHT, 140 | selectcolor=ThemeColors.PRIMARY, 141 | font=(CustomFont.REGULAR, CustomFont.SMALL) 142 | ).pack(pady=10) 143 | 144 | # Login button with hover effect 145 | self.login_button = Button( 146 | self.login_frame, 147 | text="🚀 Login", 148 | command=self.login, 149 | bg=ThemeColors.SUCCESS, 150 | fg=ThemeColors.TEXT_LIGHT, 151 | font=(CustomFont.BOLD, CustomFont.BODY), 152 | width=15, 153 | height=2, 154 | relief=FLAT, 155 | cursor="hand2" 156 | ) 157 | self.login_button.pack(pady=10) 158 | 159 | # Add hover effect 160 | self.login_button.bind("", lambda e: self.login_button.configure(bg=ThemeColors.ACCENT)) 161 | self.login_button.bind("", lambda e: self.login_button.configure(bg=ThemeColors.SUCCESS)) 162 | 163 | # Register link 164 | self.register_button = Button( 165 | self.login_frame, 166 | text="📝 New User? Register Here", 167 | command=self.show_register, 168 | bg=ThemeColors.SECONDARY, 169 | fg=ThemeColors.ACCENT, 170 | font=(CustomFont.REGULAR, CustomFont.SMALL, "underline"), 171 | bd=0, 172 | relief=FLAT, 173 | cursor="hand2" 174 | ) 175 | self.register_button.pack(pady=5) 176 | 177 | # Status label 178 | self.status_label = Label( 179 | self.login_frame, 180 | text="", 181 | bg=ThemeColors.SECONDARY, 182 | fg=ThemeColors.ERROR, 183 | font=(CustomFont.REGULAR, CustomFont.SMALL) 184 | ) 185 | self.status_label.pack(pady=5) 186 | 187 | # Load saved credentials if any 188 | self.load_saved_credentials() 189 | 190 | # Status label 191 | self.status_label = Label( 192 | self.login_frame, 193 | text="", 194 | bg='#34495E', 195 | fg='#E74C3C', 196 | font=("Rubik", 10) 197 | ) 198 | self.status_label.pack(pady=5) 199 | 200 | # Load saved credentials if any 201 | self.load_saved_credentials() 202 | 203 | def validate_email(self, email): 204 | pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$' 205 | return re.match(pattern, email) is not None 206 | 207 | def login(self): 208 | email = self.email_entry.get() 209 | password = self.password_entry.get() 210 | 211 | if not email or not password: 212 | self.status_label.config(text="❌ Please fill in all fields") 213 | return 214 | 215 | if not self.validate_email(email): 216 | self.status_label.config(text="❌ Invalid email format") 217 | return 218 | 219 | # Simulate login verification 220 | self.login_button.config(state=DISABLED, text="🔄 Logging in...") 221 | self.window.after(1500, lambda: self.process_login(email, password)) 222 | 223 | def process_login(self, email, password): 224 | # Save credentials if remember me is checked 225 | if self.remember_var.get(): 226 | self.save_credentials(email, password) 227 | 228 | self.window.destroy() 229 | self.on_login_success(email) 230 | 231 | def show_register(self): 232 | RegisterWindow(self.window) 233 | 234 | def save_credentials(self, email, password): 235 | data = {'email': email, 'password': password} 236 | Path('credentials.json').write_text(json.dumps(data)) 237 | 238 | def load_saved_credentials(self): 239 | try: 240 | if Path('credentials.json').exists(): 241 | data = json.loads(Path('credentials.json').read_text()) 242 | self.email_entry.insert(0, data.get('email', '')) 243 | self.password_entry.insert(0, data.get('password', '')) 244 | self.remember_var.set(True) 245 | except: 246 | pass 247 | 248 | def run(self): 249 | self.window.mainloop() 250 | 251 | class RegisterWindow: 252 | def __init__(self, parent): 253 | self.window = Toplevel(parent) 254 | self.window.title("📝 Register New Account") 255 | self.window.geometry("400x500") 256 | self.window.configure(bg='#2C3E50') 257 | 258 | # Register frame 259 | self.register_frame = Frame(self.window, bg='#34495E', padx=20, pady=20) 260 | self.register_frame.pack(fill=X, padx=20, pady=20) 261 | 262 | # Fields 263 | fields = [ 264 | ("👤 Full Name", "name"), 265 | ("📧 Email", "email"), 266 | ("🔑 Password", "password"), 267 | ("🔄 Confirm Password", "confirm_password") 268 | ] 269 | 270 | self.entries = {} 271 | for label_text, key in fields: 272 | Label( 273 | self.register_frame, 274 | text=label_text, 275 | bg='#34495E', 276 | fg='white', 277 | font=("Rubik", 12) 278 | ).pack(pady=5) 279 | 280 | entry = Entry( 281 | self.register_frame, 282 | font=("Rubik", 12), 283 | bg='#ECF0F1' 284 | ) 285 | if 'password' in key: 286 | entry.config(show="•") 287 | entry.pack(fill=X, pady=5) 288 | self.entries[key] = entry 289 | 290 | # Register button 291 | Button( 292 | self.register_frame, 293 | text="📝 Register", 294 | command=self.register, 295 | bg='#27AE60', 296 | fg='white', 297 | font=("Rubik", 12, "bold"), 298 | width=15, 299 | height=2, 300 | relief=FLAT 301 | ).pack(pady=20) 302 | 303 | # Status label 304 | self.status_label = Label( 305 | self.register_frame, 306 | text="", 307 | bg='#34495E', 308 | fg='#E74C3C', 309 | font=("Rubik", 10) 310 | ) 311 | self.status_label.pack(pady=5) 312 | 313 | def register(self): 314 | # Validate fields 315 | if not all(entry.get() for entry in self.entries.values()): 316 | self.status_label.config(text="❌ Please fill in all fields") 317 | return 318 | 319 | if self.entries['password'].get() != self.entries['confirm_password'].get(): 320 | self.status_label.config(text="❌ Passwords don't match") 321 | return 322 | 323 | # Simulate registration success 324 | self.status_label.config(text="✅ Registration successful!", fg='#27AE60') 325 | self.window.after(1500, self.window.destroy) 326 | 327 | class AnimatedLabel(Label): 328 | def __init__(self, master, **kwargs): 329 | super().__init__(master, **kwargs) 330 | self.colors = ['#FF5733', '#33FF57', '#3357FF', '#FF33F5'] 331 | self.current_color = 0 332 | 333 | def animate(self): 334 | self.configure(fg=self.colors[self.current_color]) 335 | self.current_color = (self.current_color + 1) % len(self.colors) 336 | self.after(1000, self.animate) 337 | 338 | class LoadingBar: 339 | def __init__(self, master, width=300): 340 | self.progress = ttk.Progressbar( 341 | master, 342 | orient="horizontal", 343 | length=width, 344 | mode="determinate" 345 | ) 346 | self.progress.pack(pady=10) 347 | self.progress.pack_forget() 348 | 349 | def start(self): 350 | self.progress.pack(pady=10) 351 | self.progress["value"] = 0 352 | 353 | def update(self, value): 354 | self.progress["value"] = value 355 | 356 | def hide(self): 357 | self.progress.pack_forget() 358 | 359 | class DeviceTracker: 360 | def __init__(self, user_email): 361 | self.root = Tk() 362 | self.root.title("📱 Advanced Device Tracker Pro") 363 | self.root.geometry("600x700") 364 | self.root.configure(bg='#2C3E50') 365 | 366 | # User info 367 | self.user_email = user_email 368 | 369 | # Custom styles 370 | style = ttk.Style() 371 | style.configure("TButton", padding=10, font=('Helvetica', 10)) 372 | style.configure("TProgressbar", thickness=20, background='#27AE60') 373 | 374 | # Header with user info 375 | self.header_frame = Frame(self.root, bg='#2C3E50') 376 | self.header_frame.pack(fill=X, pady=10) 377 | 378 | self.header = AnimatedLabel( 379 | self.header_frame, 380 | text="📱 Advanced Device Tracker Pro", 381 | font=("Rubik", 24, "bold"), 382 | bg='#2C3E50', 383 | fg='white' 384 | ) 385 | self.header.pack(pady=10) 386 | self.header.animate() 387 | 388 | # User info 389 | Label( 390 | self.header_frame, 391 | text=f"👤 Logged in as: {user_email}", 392 | font=("Rubik", 10), 393 | bg='#2C3E50', 394 | fg='#BDC3C7' 395 | ).pack() 396 | 397 | # Time display 398 | self.time_label = Label( 399 | self.root, 400 | font=("Rubik", 12), 401 | bg='#2C3E50', 402 | fg='#ECF0F1' 403 | ) 404 | self.time_label.pack() 405 | self.update_time() 406 | 407 | # Main frame 408 | self.main_frame = Frame(self.root, bg='#34495E', padx=20, pady=20) 409 | self.main_frame.pack(fill=X, padx=20) 410 | 411 | # Device selection 412 | self.device_var = StringVar(self.root) 413 | self.device_var.set("Android") 414 | 415 | device_frame = LabelFrame( 416 | self.main_frame, 417 | text="Select Device Type", 418 | bg='#34495E', 419 | fg='white', 420 | font=("Helvetica", 12) 421 | ) 422 | device_frame.pack(fill=X, pady=10) 423 | 424 | for device in ["Android", "iPhone"]: 425 | Radiobutton( 426 | device_frame, 427 | text=device, 428 | variable=self.device_var, 429 | value=device, 430 | bg='#34495E', 431 | fg='white', 432 | selectcolor='#2C3E50', 433 | command=self.update_ui 434 | ).pack(side=LEFT, padx=10) 435 | 436 | # Input frames 437 | self.android_frame = Frame(self.main_frame, bg='#34495E') 438 | self.iphone_frame = Frame(self.main_frame, bg='#34495E') 439 | 440 | # Android inputs 441 | Label( 442 | self.android_frame, 443 | text="IMEI Number:", 444 | bg='#34495E', 445 | fg='white', 446 | font=("Rubik", 12) 447 | ).pack(pady=5) 448 | self.imei_entry = Entry( 449 | self.android_frame, 450 | font=("Rubik", 12), 451 | bg='#ECF0F1' 452 | ) 453 | self.imei_entry.pack(fill=X, pady=5) 454 | 455 | # iPhone inputs 456 | Label( 457 | self.iphone_frame, 458 | text="Apple ID:", 459 | bg='#34495E', 460 | fg='white', 461 | font=("Rubik", 12) 462 | ).pack(pady=5) 463 | self.apple_id_entry = Entry( 464 | self.iphone_frame, 465 | font=("Rubik", 12), 466 | bg='#ECF0F1' 467 | ) 468 | self.apple_id_entry.pack(fill=X, pady=5) 469 | 470 | # Loading bar 471 | self.loading_bar = LoadingBar(self.main_frame) 472 | 473 | # Status display 474 | self.status_frame = LabelFrame( 475 | self.root, 476 | text="Status Log", 477 | bg='#34495E', 478 | fg='white', 479 | font=("Rubik", 12) 480 | ) 481 | self.status_frame.pack(fill=BOTH, expand=True, padx=20, pady=20) 482 | 483 | self.status_display = Text( 484 | self.status_frame, 485 | height=15, 486 | width=50, 487 | bg='#ECF0F1', 488 | fg='#2C3E50', 489 | font=("Courier", 10), 490 | state=DISABLED 491 | ) 492 | self.status_display.pack(padx=10, pady=10, fill=BOTH, expand=True) 493 | 494 | # Buttons 495 | self.button_frame = Frame(self.root, bg='#2C3E50') 496 | self.button_frame.pack(pady=10) 497 | 498 | buttons = [ 499 | ("Track Device", self.track_device, '#27AE60'), 500 | ("Clear Log", self.clear_status, '#E74C3C') 501 | ] 502 | 503 | for text, command, color in buttons: 504 | Button( 505 | self.button_frame, 506 | text=text, 507 | command=command, 508 | bg=color, 509 | fg='white', 510 | font=("Rubik", 12, "bold"), 511 | width=15, 512 | height=2, 513 | relief=FLAT 514 | ).pack(side=LEFT, padx=10) 515 | 516 | self.update_ui() 517 | 518 | def update_time(self): 519 | current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") 520 | self.time_label.config(text=current_time) 521 | self.root.after(1000, self.update_time) 522 | 523 | def update_ui(self): 524 | frames = { 525 | "Android": (self.android_frame, self.iphone_frame), 526 | "iPhone": (self.iphone_frame, self.android_frame) 527 | } 528 | show_frame, hide_frame = frames[self.device_var.get()] 529 | hide_frame.pack_forget() 530 | show_frame.pack(fill=X, pady=10) 531 | 532 | def log_status(self, message, level="info"): 533 | colors = { 534 | "info": "#2C3E50", 535 | "success": "#27AE60", 536 | "error": "#E74C3C", 537 | "warning": "#F39C12" 538 | } 539 | 540 | self.status_display.config(state=NORMAL) 541 | timestamp = datetime.now().strftime("%H:%M:%S") 542 | self.status_display.insert(END, f"[{timestamp}] ", "timestamp") 543 | self.status_display.insert(END, f"{message}\n", level) 544 | self.status_display.tag_config("timestamp", foreground="#7F8C8D") 545 | self.status_display.tag_config(level, foreground=colors.get(level, "#2C3E50")) 546 | self.status_display.see(END) 547 | self.status_display.config(state=DISABLED) 548 | 549 | def authenticate(self, credentials): 550 | time.sleep(1) # Simulate authentication 551 | return True 552 | 553 | def request_location(self, device_id): 554 | time.sleep(2) # Simulate location request 555 | return "37.7749,-122.4194" # Sample coordinates 556 | 557 | def simulate_tracking_progress(self): 558 | steps = [ 559 | ("Initializing tracking system...", 10), 560 | ("Connecting to secure servers...", 30), 561 | ("Authenticating credentials...", 50), 562 | ("Requesting device location...", 70), 563 | ("Processing location data...", 90), 564 | ("Finalizing results...", 100) 565 | ] 566 | 567 | for message, progress in steps: 568 | self.log_status(message) 569 | self.loading_bar.update(progress) 570 | time.sleep(0.5) 571 | 572 | def track_device(self): 573 | def tracking_thread(): 574 | self.loading_bar.start() 575 | device_type = self.device_var.get() 576 | 577 | try: 578 | if device_type == "Android": 579 | imei = self.imei_entry.get() 580 | if not imei: 581 | self.log_status("Please enter IMEI number", "error") 582 | return 583 | 584 | self.log_status(f"Tracking Android device: {imei}") 585 | self.simulate_tracking_progress() 586 | 587 | location = self.request_location(imei) 588 | if location: 589 | url = f"https://www.google.com/android/find?u=0&hl=en&source=android-browser&q={location}" 590 | webbrowser.open(url) 591 | self.log_status("Location found! Opening map...", "success") 592 | 593 | else: # iPhone 594 | apple_id = self.apple_id_entry.get() 595 | if not apple_id: 596 | self.log_status("Please enter Apple ID", "error") 597 | return 598 | 599 | self.log_status(f"Tracking iPhone device: {apple_id}") 600 | self.simulate_tracking_progress() 601 | self.log_status("iPhone tracking completed", "success") 602 | 603 | except Exception as e: 604 | self.log_status(f"Error: {str(e)}", "error") 605 | finally: 606 | self.loading_bar.hide() 607 | 608 | threading.Thread(target=tracking_thread).start() 609 | 610 | def clear_status(self): 611 | self.status_display.config(state=NORMAL) 612 | self.status_display.delete(1.0, END) 613 | self.status_display.config(state=DISABLED) 614 | self.log_status("Status log cleared", "info") 615 | 616 | def run(self): 617 | self.root.mainloop() 618 | 619 | def main(): 620 | def start_main_app(user_email): 621 | app = DeviceTracker(user_email) 622 | app.run() 623 | 624 | login_window = LoginWindow(start_main_app) 625 | login_window.run() 626 | 627 | if __name__ == "__main__": 628 | main() 629 | --------------------------------------------------------------------------------