· 7 months ago · Mar 06, 2025, 10:25 PM
1import requests
2import time
3from datetime import datetime
4
5class SubdomainFinder:
6 def __init__(self, api_key):
7 self.api_key = api_key
8 self.base_url = "https://api.securitytrails.com/v1"
9 self.headers = {'apikey': self.api_key}
10
11 def find_subdomains(self, domain, children_only=False):
12
13 try:
14 all_subdomains = []
15 page = 1
16 total_pages = 1
17
18 while page <= total_pages:
19 params = {
20 'children_only': str(children_only).lower(),
21 'page': page,
22 'limit': 100
23 }
24
25 response = requests.get(
26 f"{self.base_url}/domain/{domain}/subdomains",
27 headers=self.headers,
28 params=params
29 )
30 response.raise_for_status()
31
32 data = response.json()
33 current_subs = data.get('subdomains', [])
34 all_subdomains.extend([f"{sub}.{domain}" for sub in current_subs])
35
36 meta = data.get('meta', {})
37 total_pages = meta.get('max_page', 1)
38
39 print(f"🔠Memproses halaman {page}/{total_pages}...")
40 page += 1
41 time.sleep(0.3)
42
43 return all_subdomains
44
45 except Exception as e:
46 print(f"⌠Error: {str(e)}")
47 return []
48
49def save_to_file(domain, subdomains):
50
51 filename = f"results_{domain}.txt"
52 with open(filename, 'w') as f:
53 f.write("\n".join(subdomains))
54 return filename
55
56def print_banner():
57
58 print("""
59
60» Subdomain Finder
61» Author: ./KeyzNet
62» Contact: t.me/keyznet
63 """)
64
65def main():
66 API_KEY = ""
67
68 print_banner()
69
70 if len(API_KEY) != 32 or not API_KEY.startswith('ADL'):
71 print("\nâš ï¸ ERROR: Format API key tidak valid!")
72 return
73
74 finder = SubdomainFinder(API_KEY)
75
76 domain = input("\n⌨ Masukkan domain target: ").strip().lower()
77 if not domain:
78 print("\nâš ï¸ ERROR: Domain tidak boleh kosong!")
79 return
80
81 children_only = input("🔘 Cari subdomain langsung saja? (y/n): ").lower() == 'y'
82
83 print("\n🔄 Memulai scanning...")
84 try:
85 subdomains = finder.find_subdomains(domain, children_only)
86
87 if subdomains:
88 filename = save_to_file(domain, subdomains)
89 print(f"\n✅ Berhasil menemukan {len(subdomains)} subdomain")
90 print(f"💾 Hasil tersimpan di: {filename}")
91 else:
92 print("\n⌠Tidak ditemukan subdomain")
93
94 except KeyboardInterrupt:
95 print("\n🛑 Operasi dibatalkan oleh pengguna")
96
97if __name__ == "__main__":
98 main()