├── 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 |
22 |
23 |
24 |
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 |
--------------------------------------------------------------------------------