Эта статья не претендует на что-то серьезное, это просто мой опыт без каких-либо знаний языка Python в создании простого  Телеграм бота для проверки необходимых мне узлов/ресурсов сети интернет. Я понимаю, что всё, что будет написано ниже может выполнять вполне успешно Zabbix, но из-за нехватки времени мне оказалось проще реализовать какие-то нужные мне вещи за счет Телеграм бота. Прежде чем начать поясню, бота создавал и настраивал под пользователем user, который имеет обычные права в системе.

И так приступим!

И так для телеграмм бота я использовал ту же виртуальную машину от Scaleway (см. статью Разворачиваем свой SOCKS5 сервер на Scaleway).

Как развернуть среду питон на убунте можно найти в интернете или же на сайте моего друга и коллеги: https://flammlin.com/blog/2020/01/19/python-telegram-bot/ — статья подробно описывает схожую тематику по созданию телеграмм бота.

Принцип работы бота.

На создание бота у меня ушло наверно полных 3-4 дня + тестирование и обкатка. Причем делал в свободное от работы время, так что времени считаю ушло не много. Сначала это был просто бот, потом я вынес все настройки в txt файлы и считаю, что так удобнее. Хотелось конечно еще научить бота создавать файлы настроек, но руки так и не дошли.

И так принцип работы — изначально при запуске бот считывает все настройки из конфигурационного файла config.py  в котором у меня указаны следующие параметры:

users — список id пользователей которым разрешен доступ к боту

token — токен самого бота

tokenOWM — вы можете его не использовать, но мне уж очень хотелось знать температуру у себя в деревне, где находится дача ну и в своем городе, еще лежа в кровати.

proxy — параметр для подключения бота через прокси. Решил его здесь указать, потому как в большинстве примеров в интернете socks5h пишется так: socks5 — что вызывает ошибку в подключении прокси.

Файл config.py создайте заранее и впишите туда ваши данные. Этот файл должен лежать в той же папке, где у вас будет находиться и сам бот.

Далее бот проверяет есть ли txt файлы настроек, содержащий ip адреса либо доменные имена узлов сети, которые надо проверять. Для личного удобства я разделил настройки пользователя на  3 файла:

devices.txt — файл содержит узлы, работу которых я регулярно проверяю:

параметры указанные в файле вымышленные, но принцип заполнения очень прост:

название:ip-адрес:номер_порта

Количество строк в файле не ограничено! Но помните, если файл будет слишком большой, проверка очень сильно затянется. По этому важно (возможно в будущих версиях сделаю) разделить все проверки на отдельные потоки. А пока в файле 4-10 строк, можно поработать и так.

rdp.txt — файл, в который я вынес все свои RDS (RDP) сервера (порт может быть стандартный и нет):

Формат заполнения файла rdp.txt такой же как и у devices.txt: название:ip-адрес:номер_порта — это дает возможность указать не стандартные порты RDP.

site.txt — это файл с сайтами. В нем указываются url сайтов (не просто название сайта а url по которому можно будет проверить, если доменное имя отключат за не уплату и регистратор повесит заглушку). Забегая в перед могу сказать следующее — я изучал коды ответов при http запросов и в принципе этого было бы достаточно, чтобы понять сайт доступен или нет, но например Ру-Центр, при отключении домена вешает свою заглушку и http запрос не содержит ошибки. Я сначала этого не знал и мой код содержал ошибку. И по этому было принято решение чуть доработать (и в тоже время упростить) функцию проверки наличия сайта путем добавления после доменного имени адреса какого-либо файла либо уникальной страницы, которая есть на сайте. Ниже  функция из телеграм бота, в том виде, в котором она работала раньше:

И в принципе, на этом всё: бот считывает свои собственные настройки с файла config.py, далее проверяет наличие txt файлов настроек пользователя и после этого стартуя сообщая всем users из файла config.py, что бот готов к работе:

Для чего нужно это сообщение? Чтобы в принципе понимать, что бот у вас работает. Если по какой-то причине бот «упал» или ушел в перезагрузку ваш сервер, бот автоматически запустится (для этого мы укажем в конце статьи расписание запуска cron) со следующим содержимым файла:

И так рассмотрим код!

Код бота.

Еще раз хотелось напомнить, что данный бот был собран на коленке без знаний питона. Просто интернет и поиск дал мне какие-то ответы на мои запросы и я буду искренне рад, если в комментариях будут указаны мои ошибки или на оборот будет указан более оптимальный код.

Структура бота.

Бот можно представить в виде следующей структуры:

  • импорт подключаемых библиотек/функций
  • получение необходимых токенов и параметров прокси
  • описание функции проверки списка доступа пользователей к боту
  • описание функции массовой рассылки о статусе бота
  • описание функции проверки наличия файлов настроек
  • создание клавиатуры с нашими командами
  • создаем пустые справочники ошибок
  • описание функции проверки http/https соединений  с вызовом функции проверки на наличие файлов настроек
  • описание функции проверки rdp соединений  с вызовом функции проверки на наличие файлов настроек
  • описание функции проверки ssh/ftp и других соединений  с вызовом функции проверки на наличие файлов настроек
  • работаем с командами которые посылаем с клавиатуры, вызывая при этом соответствующие функции
  • добавляем возможность выключения бота (объяснять не буду, но мне так удобно: выключил бота, с телефона/планшета поправил код на сервере, сохранил, подождал пока он через cron запустится)
  • подключаем стикеры для разнообразия
  • вызываем функцию массовой рассылки о том, что бот запущен
  • запускаем бота в цикл прослушки команд функцией bot.polling()

Код бота с комментариями.

Теперь давайте рассмотрим код бота с комментариями. Комментарии вставлены в сам код, плюс на некоторых моментах я остановлюсь чуть подробнее.

Код идет последовательно, разрываясь на небольшие мои пояснения:

Команда Status вызывает проверку всех сайтов и узлов сети указанных во всех файлах настройках пользователя, команды: Сайты, RDP, Оборудование — вызывают уже отдельные функции, которые отвечают за проверку наличия сайтов, серверов удаленного рабочего стола и сетевого оборудования либо сервисов.

создаем пустые справочники для лога ошибок во время запроса пользователя. Идем далее:

Здесь в коде есть закомментированные строки: #print(errorLog) — я их оставил для наглядности, очень удобно во время выполнения функции (если вы делаете всё в блокноте и загружаете потом на сервер) вывод результатов работы функции видеть в консоле. Для этого правда необходимо будет запускать бота не по cron, а руками:

Далее идет функция проверки RDP соединений:

Теперь проверяем наличие сервисов или служб или же оборудование с любым открытым портом (о котором вы разумеется знаете):

Далее у нас идет большой кусок кода, который отвечает за команды с клавиатуры, которую мы объявляли выше:

Обращаю внимание на несколько моментов:

Если в блоке вызова функции проверки сайтов не использовать параметр disable_web_page_preview=True, то у вас в ответе бота будут еще и заголовки сайта с предпросмотром, что не всегда удобно если список сайтов большой.

Переменная colTXT в функции показа установок пользователя содержит имя файла установок.

Далее у нас идет функция работающая с командой /Start, когда вы подключаетесь к боту:

Далее команда выключения бота (вводится руками с клавиатуры: /пока):

Далее стикеры, рассылка сообщения и запуск бота:

На этом код бота завершен.

crontab.sh

Теперь нам необходимо создать bash скрипт для запуска бота при перезагрузке машины, либо при какой-либо другой непредвиденной ситуации. Код файла crontab.sh я писал выше, но тут еще раз его представлю. Сначала в каталоге бота создаем файл crontab.sh и открываем его на редактирование:

Далее вставляем скрипт:

Обязательно проверьте какая у вас версия питона! У меня в файле указана версия 3.6 и путь, по которому он установлен. Если вы не знаете, то прежде чем создавать файл скрипта crontab.sh выполните эти команды:

Далее делаем файл исполняемым:

и добавляем задачу в cron:

добавив эту строку:

Всё. В течении 5 минут ваш бот запустится!