3
3
import asyncio
4
4
from tqdm import tqdm
5
5
from colorama import Fore , Style
6
+ import socket
7
+ from urllib .parse import urlparse
6
8
7
9
# Banner
8
10
BANNER = """
9
11
╔═══════════════════════════════╗
10
12
║ StatusChecker.py ║
11
13
║ Created By: BLACK_SCORP10 ║
12
- ║ Telegram: @BLACK_SCORP10 ║
14
+ ║ Enanched By: matteocapricci ║
13
15
╚═══════════════════════════════╝
14
16
"""
15
17
23
25
"Invalid" : Fore .WHITE
24
26
}
25
27
26
- # Function to check URL status
28
+ # Function to resolve hostname to IP:Port
29
+ def resolve_ip_and_port (url ):
30
+ try :
31
+ parsed = urlparse (url )
32
+ hostname = parsed .hostname
33
+ scheme = parsed .scheme
34
+ port = parsed .port or (443 if scheme == "https" else 80 )
35
+ ip_address = socket .gethostbyname (hostname )
36
+ return f"{ ip_address } :{ port } "
37
+ except Exception :
38
+ return "IP:Port Not Found"
39
+
40
+ # Function to check URL status and redirection
27
41
async def check_url_status (session , url_id , url ):
28
42
if "://" not in url :
29
- url = "https://" + url # Adding https:// if no protocol is specified
43
+ url = "https://" + url
30
44
try :
31
- response = await session .head (url )
32
- return url_id , url , response .status_code
45
+ response = await session .get (url , follow_redirects = True , timeout = 10 )
46
+ final_url = str (response .url )
47
+
48
+ original_ip_port = resolve_ip_and_port (url )
49
+ redirect_ip_port = resolve_ip_and_port (final_url ) if final_url != url else None
50
+
51
+ return url_id , url , response .status_code , final_url if final_url != url else None , original_ip_port , redirect_ip_port
33
52
except httpx .RequestError :
34
- return url_id , url , None
53
+ return url_id , url , None , None , None , None
35
54
36
- # Function to parse arguments
55
+ # Argument parser
37
56
def parse_arguments ():
38
57
parser = argparse .ArgumentParser (description = "URL Status Checker" )
39
58
parser .add_argument ("-d" , "--domain" , help = "Single domain/URL to check" )
@@ -74,13 +93,13 @@ async def main():
74
93
if len (urls ) > 1 :
75
94
with tqdm (total = len (urls ), desc = "Checking URLs" ) as pbar :
76
95
for coro in asyncio .as_completed (tasks ):
77
- url_id , url , status_code = await coro
78
- results [url_id ] = (url , status_code )
96
+ url_id , url , status , redirect , ip , redirect_ip = await coro
97
+ results [url_id ] = (url , status , redirect , ip , redirect_ip )
79
98
pbar .update (1 )
80
99
else :
81
100
for coro in asyncio .as_completed (tasks ):
82
- url_id , url , status_code = await coro
83
- results [url_id ] = (url , status_code )
101
+ url_id , url , status , redirect , ip , redirect_ip = await coro
102
+ results [url_id ] = (url , status , redirect , ip , redirect_ip )
84
103
85
104
status_codes = {
86
105
"1xx" : [],
@@ -91,27 +110,29 @@ async def main():
91
110
"Invalid" : []
92
111
}
93
112
94
- for url_id , (url , status ) in results .items ():
113
+ for url_id , (url , status , redirect , ip , redirect_ip ) in results .items ():
95
114
if status is not None :
96
115
status_group = str (status )[0 ] + "xx"
97
- status_codes [status_group ].append ((url , status ))
116
+ status_codes [status_group ].append ((url , status , redirect , ip , redirect_ip ))
98
117
else :
99
- status_codes ["Invalid" ].append ((url , "Invalid" ))
118
+ status_codes ["Invalid" ].append ((url , "Invalid" , None , "IP:Port Not Found" , None ))
100
119
101
- for code , urls in status_codes .items ():
102
- if urls :
120
+ for code , urls_info in status_codes .items ():
121
+ if urls_info :
103
122
print (COLORS .get (code , Fore .WHITE ) + f'===== { code .upper ()} =====' )
104
- for url , status in urls :
105
- print (f'[Status : { status } ] = { url } ' )
123
+ for url , status , redirect , ip , redirect_ip in urls_info :
124
+ redirect_str = f"[Redirect: { redirect } ({ redirect_ip } )]" if redirect else "[Redirect: None]"
125
+ print (f'[Status: { status } ] [IP: { ip } ] { url } { redirect_str } \n ' )
106
126
print (Style .RESET_ALL )
107
127
108
128
if args .output :
109
129
with open (args .output , 'w' ) as file :
110
- for code , urls in status_codes .items ():
111
- if urls :
130
+ for code , urls_info in status_codes .items ():
131
+ if urls_info :
112
132
file .write (f'===== { code .upper ()} =====\n ' )
113
- for url , status in urls :
114
- file .write (f'[Status : { status } ] = { url } \n ' )
133
+ for url , status , redirect , ip , redirect_ip in urls_info :
134
+ redirect_str = f"[Redirect: { redirect } ({ redirect_ip } )]" if redirect else "[Redirect: None]"
135
+ file .write (f'[Status: { status } ] [IP: { ip } ] { url } { redirect_str } \n ' )
115
136
116
137
if __name__ == "__main__" :
117
138
asyncio .run (main ())
0 commit comments