Skip to content

Commit 5fc805e

Browse files
Merge pull request #4 from matteocapricci/main
Update url-status-checker.py
2 parents ce0a04c + a42f806 commit 5fc805e

File tree

2 files changed

+46
-25
lines changed

2 files changed

+46
-25
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@
77
<br>
88
</h1>
99
Status Checker is a Python script that checks the status of one or multiple URLs/domains and categorizes them based on their HTTP status codes.
10-
Version 1.0.0
11-
Created BY BLACK-SCORP10
12-
[t.me/BLACK-SCORP10](https://t.me/BLACK_SCORP10)
10+
Version 2.0.0
1311

1412
## Features
1513

1614
- Check the status of single or multiple URLs/domains.
1715
- Asynchronous HTTP requests for improved performance.
16+
- Follow the Redirections.
17+
- Track all the involved IP addresses.
1818
- Color-coded output for better visualization of status codes.
1919
- Progress bar when checking multiple URLs.
2020
- Save results to an output file.

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)