Как Я сделал Своего Бота Телеграм Для Сканирования Портов И IP адресов

от автора

Наверное проверять наличие портов и устройств на вашем роутере на телефоне та еще задача, особенно если у вас нет рут прав. Но это легко можно сделать с помощью моего нового бота. Достаточно ввести команду /scan и первые три цифры в конце точки вашего айпи адреса и он автоматически вышлет уведомлении лог-листа.

Функция сканирования портов, и словарь портов.

def scan_single_ip(ip):    ports_to_scan = [21, 22, 23, 53, 80, 443, 445, 631, 8080]    discovered_ports = []    device_type = "Неизвестное устройство"    for port in ports_to_scan:        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)        s.settimeout(0.3)        result = s.connect_ex((ip, port))        if result == 0:            discovered_ports.append(port)            if port in PORT_GUESSER:                device_type = PORT_GUESSER[port]        s.close()    if discovered_ports:        return {            "ip": ip,            "ports": discovered_ports,            "type": device_type        }    return Noneasync def run_network_scan(subnet):    ip_list = [f"{subnet}{i}" for i in range(1, 255)]    loop = asyncio.get_running_loop()
with ThreadPoolExecutor(max_workers=50) as executor:    tasks = [loop.run_in_executor(executor, scan_single_ip, ip) for ip in ip_list]    results = await asyncio.gather(*tasks)return [r for r in results if r is not None]

А это исходный код бота кому интересно, делайте что хотите.

# -*- coding: utf-8 -*-import asynciofrom aiogram import Bot, Dispatcher, typesfrom aiogram.filters import Commandfrom concurrent.futures import ThreadPoolExecutorimport threadingimport socketimport requestsAPI_TOKEN = 'Ваш токен от ботфазер'bot = Bot(token=API_TOKEN)dp = Dispatcher()PORT_GUESSER = {    21: "FTP-сервер",    22: "Линукс-девайс (SSH)",    23: "Telnet-устройство",    53: "DNS-сервер / Роутер",    80: "Веб-интерфейс (Роутер/Камера)",    443: "Защищенный веб (Роутер/ПК)",    445: "Компьютер с Windows",    631: "Сетевой Принтер",    8080: "Прокси / Веб-сервер"}def scan_single_ip(ip):    ports_to_scan = [21, 22, 23, 53, 80, 443, 445, 631, 8080]    discovered_ports = []    device_type = "Неизвестное устройство"    for port in ports_to_scan:        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)        s.settimeout(0.3)        result = s.connect_ex((ip, port))        if result == 0:            discovered_ports.append(port)            if port in PORT_GUESSER:                device_type = PORT_GUESSER[port]        s.close()    if discovered_ports:        return {            "ip": ip,            "ports": discovered_ports,            "type": device_type        }    return Noneasync def run_network_scan(subnet):    ip_list = [f"{subnet}{i}" for i in range(1, 255)]    loop = asyncio.get_running_loop()        with ThreadPoolExecutor(max_workers=50) as executor:        tasks = [loop.run_in_executor(executor, scan_single_ip, ip) for ip in ip_list]        results = await asyncio.gather(*tasks)        return [r for r in results if r is not None]@dp.message(Command("help"))async def help_list(message: types.Message):    await message.answer("channel - мой канал на хабре, scan [ваш айпи 3 цифры] - сканирование портов")@dp.message(Command("start"))async def send_welcome(message: types.Message):    await message.answer("Бот Запущен! Сервер в рабочем состоянии! В случае если бот не будет отвечать, возможно мой ноутбук в выключенном состоянии.")@dp.message(Command("channel"))async def add_chanel(message: types.Message):    await message.answer("Мой хабр: @dk_runkeevich")    @dp.message(Command("scan"))async def start_scan(message: types.Message):    args = message.text.split()    if len(args) < 2:        await message.answer("Ошибка. Введите сеть, пример:\n/scan 192.168.1.")        return    subnet = args[1]    await message.answer(f"Запускаю многопоточный сканер для {subnet}0/24...\nЭто займет около 10 секунд.")    try:        devices = await run_network_scan(subnet)                if not devices:            await message.answer("Сканирование завершено. Живых устройств с открытыми портами не найдено.")            return        report = f"📊 ОТЧЕТ О СКАН ИРОВАНИИ СЕТИ {subnet}0/24:\n\n"        for dev in devices:            report += f"🌐 IP: {dev['ip']}\n"            report += f"🔌 Порты: {', '.join(map(str, dev['ports']))}\n"            report += f"📝 Тип: {dev['type']}\n"            report += "—" * 20 + "\n"        await message.answer(report)    except Exception as e:        await message.answer(f"Произошла ошибка при сканировании: {e}")async def main():    await dp.start_polling(bot)if __name__ == "__main__":    asyncio.run(main())

Если вы просто обычный пользователь а не кодер то вот ссылка на бота: https://t.me/dkrun_bot Извиняюсь что не выкладываю исходный код на гитхаб, это все потому что я не хочу пользователя заставлять нажать на какую то ссылку, зачем там если можно здесь?

p.p.s Мой бот не работает в 12 часов ночи. У меня не серверная а просто обычный ноут.

ссылка на оригинал статьи https://habr.com/ru/articles/1041392/