
Лига Сисадминов
Как я контролирую доступ к порту через телеграм бота
Я курирую контроль непрерывной работы облачной записи видеопотока камер видеонаблюдения нескольких пунктов выдачи wildberries. И я часто сталкиваюсь с проблемами потери связи клиент-сервер. Будь то неуплата за интернет, отключение электричества, отказ оборудования и т.д. Решил немного автоматизировать процесс с помощью уведомлений из телеграмм бота. Процедура относительно несложная. Сейчас распишу все поэтапно.
В первую очередь нужно создать телеграмм бота. Для этого в поиске телеги ищем пользователя @botfather, пишем ему команду /newbot и создаем своего бота. После создания бота получаем токен. Он пригодится нам позже.
Для создания бота я буду использовать язык питон. Качаем и устанавливаем сам питон на офф сайте. Проверить установлен ли питон можно через команду "python --version" без кавычек. Если программа установлена правильно, вы получите ответ с версией программы. Через командную строку устанавливаем нужные нам библиотеки:
"pip install python-telegram-bot"
"pip install pyTelegramBotAPI"
"pip install aiogram"
Все, теперь перейдем к написанию кода.
Для написания кода можно использовать любой текстовый, кодовый редактор. Хоть блокнот. Главное что бы расширение файла было .py.
Перед тем как писать код, надо определиться какие цели мне нужно достичь. В моем случае я имею 4 ПВЗ с белыми айпи адресами. У меня открыт 554 порт, который я должен проверять. То есть я хочу проверять каждый адрес по очереди раз в 5 минут. Если порт не отвечает, через 2 минуты повторяю попытку еще раз. Если ответа нет, мне в телеграмм приходит уведомление где указано состояние порта (Отвечает или Недоступен), айпи и порт, адрес пункта выдачи. Так же я хочу добавить кнопку "Проверка доступа", что бы получить состояние всех пунктов списком. Снизу приведу готовый код.
"import telebot
import socket
import threading
import time
# Телеграм токен вашего бота
TOKEN = 'Здесь указываете ваш токен'
bot = telebot.TeleBot(TOKEN)
# Данные для проверки адресов. Пишите свои адреса и названия
addresses = [
{'ip': '192.168.1.127', 'port': 554, 'name': 'Москва'},
{'ip': '192.168.1.128', 'port': 554, 'name': 'Казань'},
{'ip': '192.168.1.129, 'port': 554, 'name': 'Киров'},
{'ip': '192.168.1.126', 'port': 554, 'name': 'Краснодар'}
]
check_interval = 300 # Интервал в секундах между проверками (5 минут)
retry_interval = 120 # Интервал повторной проверки в секундах (2 минуты)
checking = False # Флаг для управления проверками
# Функция для проверки доступности порта
def check_port(ip, port):
try:
with socket.create_connection((ip, port), timeout=5):
return True
except (socket.timeout, socket.error):
return False
# Фоновая задача для постоянной проверки
def periodic_check(chat_id):
global checking
while checking:
for address in addresses:
ip, port, name = address['ip'], address['port'], address['name']
if not check_port(ip, port):
time.sleep(retry_interval)
if not check_port(ip, port):
bot.send_message(chat_id, f"🔴 {name} ({ip}:{port}) - Не отвечает")
time.sleep(check_interval)
# Обработчик команды /start
@bot.message_handler(commands=['start'])
def start(message):
global checking
if not checking:
checking = True
bot.send_message(message.chat.id, "✅ Бот запущен. Начинаем проверки.")
threading.Thread(target=periodic_check, args=(message.chat.id,), daemon=True).start()
else:
bot.send_message(message.chat.id, "ℹ️ Бот уже работает.")
# Обработчик команды /stop
@bot.message_handler(commands=['stop'])
def stop(message):
global checking
if checking:
checking = False
bot.send_message(message.chat.id, "⏹️ Проверки остановлены.")
else:
bot.send_message(message.chat.id, "ℹ️ Бот уже остановлен.")
# Обработчик кнопки "Проверка доступа"
@bot.message_handler(func=lambda message: message.text == "Проверка доступа")
def manual_check(message):
results = []
for address in addresses:
ip, port, name = address['ip'], address['port'], address['name']
status = "🟢 Доступен" if check_port(ip, port) else "🔴 Не отвечает"
results.append(f"{status} - {name} ({ip}:{port})")
bot.send_message(message.chat.id, "\n".join(results))
# Добавление кнопки "Проверка доступа"
@bot.message_handler(commands=['menu'])
def show_menu(message):
markup = telebot.types.ReplyKeyboardMarkup(resize_keyboard=True)
markup.add(telebot.types.KeyboardButton("Проверка доступа"))
bot.send_message(message.chat.id, "📋 Выберите действие:", reply_markup=markup)
# Запуск бота
bot.polling(none_stop=True)"
Не забудьте вставить свой токен и вписать свои айпи адреса. Сохраняем файл с названием bot.py например на рабочем столе. Если все сделали правильно, то должно выглядеть примерно так:
Вроде все работает. Мы запустили программу на вашем ПК. Но бот будет фунциклировать, пока ваша программа запущена и компьютер работает. Что бы бот работал 24/7 нужен VPS сервер.
4. Запуск на VPS сервере. Арендуем любой облачный сервер. У меня это Beget. У них самый дешевый сервер стоит 210 рублей в месяц, а запустить на нем можно до 10 таких ботов одновременно. После аренды облачного сервера устанавливаем на него какой либо дистрибутив линукс. У меня это Ubuntu. Заходим через SSH и устанавливаем на него питон командой
"sudo apt update"
"sudo apt install python3 python3-pip python3-venv"
Устанавливаем библиотеки
"pip install python-telegram-bot"
Через файловый менеджер создаем папку на сервере и перебрасываем туда наш файл bot.py
В командной строке перемещаемся в нужную нам директорию, и запускаем файл командой "python3 bot.py"
5. Вуаля, живем и радуемся. Кстати, не забудьте настроить работу файла в фоновом режиме и автоматический запуск.
Проблема с сетью
Сеть: коммутатор DGS-1210-28, от него 40 метров витухи (нормальной, 4-парной, флюком бьётся) стоит роутер Keenetic Giga KN-1010 (не новый уже, знаю), на последней прошивке OS 4.2.5, за ним компьютер вполне приличный.
Линк в гигабите везде. Ошибок на портах нет, а скорость ровно 100. Обычно, когда шейпер режет до сотни, на клиенте видно 120 и падение до 100, а тут 98 и ни грамма больше. Началось примерно месяц назад. Возможно, обновилась прошивка. Больше ничего не менялось. Комп тот же, роутер тот же, кабель и порт - те же.
Что проверил:
Флюком кабель с ответкой - цел, обжат нормально.
Потерь до коммутатора нет ни с какой стороны
Комп напрямую без роутера работает нормально - свои 800 Мбит тянет, в зависимости от загрузки аплинка коммутатора
Кабель-диагностика с коммутатора выдает иногда то одну, то другую пару в обрыве у роутера.
На роутере WAN - комбо. Попробовал SFP медный сунуть - та же картина.
Сбросил роутер в заводские.
Уже не понимаю, куда рыть. Остаётся прошивка роутера.