import requests
import json
import re
from typing import List, Set
from fake_useragent import UserAgent
def fetch_data_from_crt(ip_address: str) -> str:
"""
Получает json данные о доменах, связанных с указанным IP, из сервиса crt.sh.
:param ip_address: IP-адрес для поиска доменов.
:return: JSON-строка с результатами запроса.
"""
url = f'https://crt.sh/?q={ip_address}&output=json'
ua = UserAgent()
headers = {'User-Agent': ua.random}
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
except requests.RequestException as e:
print(f"Ошибка при запросе: {e}")
return ""
else:
return response.text
def extract_domains(data: str) -> List[str]:
"""
Извлекает уникальные домены из JSON-ответа crt.sh.
:param data: JSON-строка с данными о сертификатах.
:return: Отсортированный список уникальных доменов.
"""
if not data:
print("Нет данных для обработки.")
return []
try:
certs = json.loads(data)
except json.JSONDecodeError:
print("Ошибка при обработке JSON-данных.")
return []
else:
domains: Set[str] = set()
for cert in certs:
domains.add(cert['name_value'])
return sorted(domains)
def is_valid_ip(ip: str) -> bool:
"""
Проверяет корректность IP-адреса с использованием регулярного выражения.
:param ip: IP-адрес в виде строки.
:return: True, если IP корректный, иначе False.
"""
ip_pattern = re.compile(r'^(?:\d{1,3}\.){3}\d{1,3}$')
return bool(ip_pattern.match(ip))
def read_ip_from_file() -> str:
"""
Запрашивает путь к файлу и читает из него IP-адрес, проверяя его корректность.
:return: Корректный IP-адрес или пустая строка при ошибке.
"""
file_path = input("Введите путь к файлу с IP-адресом: ")
try:
with open(file_path, 'r', encoding='utf-8') as file:
ip_address = file.read().strip()
if is_valid_ip(ip_address):
return ip_address
else:
print("Некорректный IP-адрес в файле.")
return ""
except FileNotFoundError:
print("Файл не найден.")
return ""
if __name__ == "__main__":
if ip_address := read_ip_from_file():
data = fetch_data_from_crt(ip_address)
domains = extract_domains(data)
print(f"Найдено {len(domains)} доменов на IP {ip_address}:")
for domain in domains:
print(domain)
else:
print("В файле не обнаружено корректных данных")