Наверное проверять наличие портов и устройств на вашем роутере на телефоне та еще задача, особенно если у вас нет рут прав. Но это легко можно сделать с помощью моего нового бота. Достаточно ввести команду /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/