Загрузка данных


import os
import sys
import socket
import argparse
import datetime
import requests
from bs4 import BeautifulSoup
import whois
import pygeoip
import dns.resolver
from dns import reversename, resolver
from nslookup import Nslookup
import validators

# ==================== МОДУЛЬ ПРОВЕРКИ ВВОДА И СЕТИ ====================

def check_internet():
    try:
        requests.get("http://www.google.com", timeout=3)
        return True
    except requests.ConnectionError:
        return False

def validate_input(value, target_type="host"):
    if target_type == "ip":
        return validators.ipv4(value) or validators.ipv6(value)
    elif target_type == "domain":
        return validators.domain(value)
    elif target_type == "url":
        return validators.url(value)
    return False

def get_input(prompt, default=None, expected_type=None):
    try:
        val = input(prompt).strip()
        if not val and default is not None:
            return default
        if expected_type and not validate_input(val, expected_type):
            print(f"[!] Некорректный ввод. Ожидался {expected_type}.")
            return None
        return val
    except (KeyboardInterrupt, EOFError):
        print("\n[!] Ввод прерван пользователем.")
        return None

def load_logo():
    if os.path.exists('logo.txt'):
        with open('logo.txt', 'r') as f:
            return f.read()
    return "OSINT FRAMEWORK"

# ==================== ОСНОВНЫЕ ФУНКЦИИ ====================

def address(host=None):
    if not host:
        host = get_input('Enter host: ', expected_type="host")
    if not host: return
    try:
        if '://' in host:
            host = host.split('://')[1]
        host = host.replace('/', '')
        remote_ip = socket.gethostbyname(host)
        print(f"IP Address of {host} is {remote_ip}")
    except socket.gaierror:
        print("[!] Не удалось разрешить имя хоста.")
    except Exception as e:
        print(f"[!] Ошибка: {e}")

def geo_ip(ip=None):
    if not ip:
        ip = get_input('Enter ip: ', expected_type="ip")
    if not ip: return
    try:
        gi = pygeoip.GeoIP('GeoIPCity.dat')
        city = gi.record_by_addr(ip)
        if city:
            for key in city:
                if city[key] is None or city[key] == 0:
                    continue
                print(f"{key}: {city[key]}")
        else:
            print("[!] Данные для этого IP не найдены.")
    except FileNotFoundError:
        print("[!] Файл GeoIPCity.dat не найден!")
    except Exception as e:
        print(f"[!] Ошибка: {e}")

def whois_add(domain_name=None):
    if not domain_name:
        domain_name = get_input('Enter domain: ', expected_type="domain")
    if not domain_name: return
    try:
        domain = whois.query(domain_name)
        if domain:
            res = domain.__dict__
            for i in res:
                print(f"{i}: {res[i]}")
        else:
            print("[!] Информация WHOIS не найдена.")
    except Exception as e:
        print(f"[!] Ошибка WHOIS: {e}")

def site_nslookup(domain=None):
    if not domain:
        domain = get_input('Enter host: ', expected_type="host")
    if not domain: return
    try:
        dns_query = Nslookup(dns_servers=["1.1.1.1"])
        ips_record = dns_query.dns_lookup(domain)
        for i in ips_record.response_full:
            print(i)
        try:
            soa_record = dns_query.soa_lookup(domain)
            for i in soa_record.response_full:
                print('\n'.join(i.split('. ')))
        except Exception:
            pass
    except Exception as e:
        print(f"[!] Ошибка NSlookup: {e}")

def dns_resolver(domain=None):
    if not domain:
        domain = get_input('Enter host: ', expected_type="host")
    if not domain: return
    try:
        my_resolver = dns.resolver.Resolver(configure=False)
        my_resolver.nameservers = ['8.8.8.8', '1.1.1.1']
        answers = my_resolver.query(domain, 'MX')
        for rdata in answers:
            print('MX Record:', rdata.exchange)
    except dns.resolver.NoAnswer:
        print("[!] MX-записи не найдены.")
    except Exception as e:
        print(f"[!] Ошибка MX: {e}")

def reversed_dns(ip=None):
    if not ip:
        ip = get_input('Enter ip: ', expected_type="ip")
    if not ip: return
    try:
        rev_name = reversename.from_address(ip)
        reversed_dns_res = str(resolver.query(rev_name, "PTR")[0])
        print(reversed_dns_res)
    except Exception as e:
        print(f"[!] Ошибка Reverse DNS: {e}")

def robots_txt(url=None):
    if not url:
        url = get_input('Enter host [https://site.com]: ', default='https://site.com', expected_type="url")
    if not url: return
    try:
        head = {"User-Agent": "Mozilla/5.0"}
        full_url = url + '/robots.txt' if url[-1] != '/' else url + 'robots.txt'
        page = requests.get(full_url, headers=head, timeout=5)
        if page.status_code != 404:
            print(page.text)
        else:
            print('File "robots.txt" not found!')
    except Exception as e:
        print(f"[!] Ошибка: {e}")

def sitemap_xml(url=None):
    if not url:
        url = get_input('Enter host [https://site.com]: ', default='https://site.com', expected_type="url")
    if not url: return
    try:
        full_url = url + '/sitemap.xml' if url[-1] != '/' else url + 'sitemap.xml'
        page = requests.get(full_url, timeout=5)
        if page.status_code == 200:
            soup = BeautifulSoup(page.text, 'lxml')
            for loc in soup.find_all("loc"):
                print(loc.text)
        else:
            print('File "sitemap.xml" not found!')
    except Exception as e:
        print(f"[!] Ошибка: {e}")

def reverse_ip_lookup(ip=None):
    if not ip:
        ip = get_input('Enter ip: ', expected_type="ip")
    if not ip: return
    try:
        url = f"https://api.hackertarget.com/reverseiplookup/?q={ip}"
        response = requests.get(url, timeout=10)
        if response.status_code == 200:
            print(response.text)
        else:
            print(f"[!] Сервис вернул код {response.status_code}")
    except Exception as e:
        print(f"[!] Ошибка запроса: {e}")

# ==================== ПУНКТ 10: ALL ITEMS ====================

def all_items(target):
    if not target:
        target = get_input('Enter host or IP: ')
    if not target: return
    
    is_ip = validate_input(target, "ip")
    
    # Если это URL, извлекаем домен
    domain = target
    if '://' in target:
        domain = target.split('://')[1].split('/')[0]
    
    # Если введен IP, получаем данные только по IP
    if is_ip:
        ip = target
        domain = None
    else:
        # Если введен URL/домен, получаем IP
        try:
            ip = socket.gethostbyname(domain)
        except Exception as e:
            print(f"[!] Не удалось получить IP: {e}")
            return

    # Формируем имя файла
    safe_host = target.replace('https://', '').replace('http://', '').replace('/', '_').replace('.', '_')
    timestamp = datetime.datetime.now().strftime("%Y_%m_%d_%H-%M")
    filename = f"check_{safe_host}_{timestamp}.txt"

    # Список функций для выполнения
    tasks = [
        ("1. Host IP", lambda: address(domain if domain else ip)),
        ("2. Site location", lambda: geo_ip(ip)),
        ("3. Whois", lambda: whois_add(domain) if domain else print("Пропущено: нет домена")),
        ("4. Nslookup", lambda: site_nslookup(domain) if domain else print("Пропущено: нет домена")),
        ("5. DNS MX-Record", lambda: dns_resolver(domain) if domain else print("Пропущено: нет домена")),
        ("6. Reverse DNS", lambda: reversed_dns(ip)),
        ("7. robots.txt", lambda: robots_txt(target if '://' in target else f"https://{domain}") if domain else print("Пропущено: нет домена")),
        ("8. sitemap.xml", lambda: sitemap_xml(target if '://' in target else f"https://{domain}") if domain else print("Пропущено: нет домена")),
        ("9. Reverse IP Lookup", lambda: reverse_ip_lookup(ip)),
    ]

    # Перенаправляем stdout в файл
    original_stdout = sys.stdout
    try:
        with open(filename, 'w', encoding='utf-8') as f:
            sys.stdout = f
            for title, func in tasks:
                print('-' * 35)
                print(title)
                print('-' * 35)
                func()
                print()
            sys.stdout = original_stdout
            print("Done!")
    except Exception as e:
        sys.stdout = original_stdout
        print(f"[!] Ошибка при записи в файл: {e}")

# ==================== ГЛАВНЫЙ ЦИКЛ ====================

def main():
    parser = argparse.ArgumentParser(description="OSINT Framework")
    parser.add_argument('--ip', help="IP-адрес для проверки")
    parser.add_argument('--url', help="URL или домен для проверки")
    parser.add_argument('--all', action='store_true', help="Запустить все пункты (пункт 10)")
    args = parser.parse_args()

    # Если переданы аргументы --ip или --url с --all
    if args.all and (args.ip or args.url):
        target = args.ip if args.ip else args.url
        all_items(target)
        return

    print(load_logo())
    
    if not check_internet():
        print("[!] Нет доступа в интернет. Проверьте подключение.")
        sys.exit(1)

    menu = """
0. Exit the program
1. Host IP
2. Site location
3. Whois
4. Nslookup
5. DNS MX-Record
6. Reverse DNS
7. robots.txt
8. sitemap.xml
9. Reverse IP Lookup
10. All items
"""
    
    while True:
        print(menu)
        try:
            num_str = input('Enter the option number: ')
            if not num_str:
                continue
            num = int(num_str)
            
            print('-'*35)
            if num == 0:
                print('The program is complete!')
                break
            elif num == 1: address()
            elif num == 2: geo_ip()
            elif num == 3: whois_add()
            elif num == 4: site_nslookup()
            elif num == 5: dns_resolver()
            elif num == 6: reversed_dns()
            elif num == 7: robots_txt()
            elif num == 8: sitemap_xml()
            elif num == 9: reverse_ip_lookup()
            elif num == 10: all_items(None)
            else:
                print("[!] Неверный номер опции.")
            print('-'*35 + '\n')
            
        except ValueError:
            print("[!] Введите корректное число.")
        except (KeyboardInterrupt, EOFError):
            print("\nThe program is complete!")
            break
        except Exception as e:
            print(f"[!] Непредвиденная ошибка: {e}")

if __name__ == "__main__":
    main()