Skip to content

Commit 7af2829

Browse files
Update url-status-checker.py
This new version introduces a set of functional and structural enhancements to the existing StatusChecker.py script. The primary objective is to improve the visibility and diagnostic capability of HTTP(S) endpoint checks by incorporating IP:Port resolution and enhanced redirection tracing. At the end also the Format Output Reporting.
1 parent ce0a04c commit 7af2829

File tree

1 file changed

+43
-22
lines changed

1 file changed

+43
-22
lines changed

url-status-checker.py

Lines changed: 43 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33
import asyncio
44
from tqdm import tqdm
55
from colorama import Fore, Style
6+
import socket
7+
from urllib.parse import urlparse
68

79
# Banner
810
BANNER = """
911
╔═══════════════════════════════╗
1012
║ StatusChecker.py ║
1113
║ Created By: BLACK_SCORP10 ║
12-
Telegram: @BLACK_SCORP10
14+
Enanched By: matteocapricci
1315
╚═══════════════════════════════╝
1416
"""
1517

@@ -23,17 +25,34 @@
2325
"Invalid": Fore.WHITE
2426
}
2527

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
2741
async def check_url_status(session, url_id, url):
2842
if "://" not in url:
29-
url = "https://" + url # Adding https:// if no protocol is specified
43+
url = "https://" + url
3044
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
3352
except httpx.RequestError:
34-
return url_id, url, None
53+
return url_id, url, None, None, None, None
3554

36-
# Function to parse arguments
55+
# Argument parser
3756
def parse_arguments():
3857
parser = argparse.ArgumentParser(description="URL Status Checker")
3958
parser.add_argument("-d", "--domain", help="Single domain/URL to check")
@@ -74,13 +93,13 @@ async def main():
7493
if len(urls) > 1:
7594
with tqdm(total=len(urls), desc="Checking URLs") as pbar:
7695
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)
7998
pbar.update(1)
8099
else:
81100
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)
84103

85104
status_codes = {
86105
"1xx": [],
@@ -91,27 +110,29 @@ async def main():
91110
"Invalid": []
92111
}
93112

94-
for url_id, (url, status) in results.items():
113+
for url_id, (url, status, redirect, ip, redirect_ip) in results.items():
95114
if status is not None:
96115
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))
98117
else:
99-
status_codes["Invalid"].append((url, "Invalid"))
118+
status_codes["Invalid"].append((url, "Invalid", None, "IP:Port Not Found", None))
100119

101-
for code, urls in status_codes.items():
102-
if urls:
120+
for code, urls_info in status_codes.items():
121+
if urls_info:
103122
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')
106126
print(Style.RESET_ALL)
107127

108128
if args.output:
109129
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:
112132
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')
115136

116137
if __name__ == "__main__":
117138
asyncio.run(main())

0 commit comments

Comments
 (0)