Telegram-bot для мониторинга доступности сайтов
Работая в IT-компании, появилась необходимость отслеживания доступности сайтов. Конечно, есть много разных бесплатных сервисов, но зачастую это сайты, на которых нужно регистрироваться и получать уведомления на почту. Поэтому мы решили сами создать свой telegram-бот на Golang (как никак IT-шники).
Какие команды есть в боте:
/help — помощь
/addsite — добавить сайт для мониторинга
/checksite — проверить сайт на доступность
/checkipaddresses — посмотреть IP-адрес сайта
/listall — просмотр статуса доступности всех сайтов
/deletewatchlist — удалить все сайты из списка
/deletesite — удалить сайт из списка
Как установить?
- Запустить бота
- Добавить сайты
- Мониторить (Бот проверяет сайты на доступность каждую минуту)
Пока что MVP в таком виде, в дальнейшем планируем расширить функционал. Если будут идеи/предложения, welcome.
- golang
- телеграм-бот
- мониторинг сайта
- telegrambot
Как сделать телеграм бота для мониторинга сайтов
Получение уведомлений на услуге Мониторинг возможно на тарифном плане Pro или на услуге Дополнительный способ оповещения.
1. Зарегистрируйте нового бота в Telegram.
Для этого отправьте /newbot в @BotFather и следуйте инструкциям: укажите имя бота (name) и его имя пользователя (username).
Используйте уникальное название, например, использование номера подписки услуги Мониторинга или название организации.
На последнем шаге получите токен (token to access the HTTP API) — сохраните его.
2. Если вы хотите получать личные уведомления в Telegram, необходимо получить ID чата пользователя, которому бот должен отправлять сообщения.
Добавьте созданного бота к себе в контакты и запустите его — /start .
Отправьте /getid на @myidbot в Telegram.
Полученный ID сохраните.
3. Если вы хотите получать уведомления в группу Telegram, необходимо получить идентификатор группы, в которую бот будет отправлять сообщения.
Отправьте /start имя_бота (name).
Добавьте в группу созданного бота и @myidbot.
Отправьте сообщение /getgroupid @myidbot в группе — полученный ID сохраните.
4. Для завершения настройки, составьте заявку в службу технической поддержки, укажите ID подписки мониторинга и предоставьте токен (полученный на шаге 1) и ID чата пользователя или группы (шаг 2 и 3 соответственно).
Как создать Telegram-бота для мониторинга погоды на Python
В статье делимся пошаговой инструкцией, как написать Telegram-бота для получения данных о погоде и задеплоить его на виртуальный сервер.
Эта инструкция — часть курса «Как создавать Telegram-ботов».
Смотреть весь курс
Введение
Всем привет! Меня зовут Максим Плачковский, я автор канала PythonToday. Из этой статьи вы узнаете, как написать своего Telegram-бота для получения данных о погоде в любом городе нашей планеты. Мы детально рассмотрим работу с API, парсинг JSON и напишем бота на асинхронной библиотеке aiogram. А после — загрузим его на виртуальный сервер и запустим.
Подготовка API и рабочего окружения
Перед написанием кода нужно получить API-токены для работы с сервисом OpenWeather и Telegram-ботом, а также подготовить рабочее окружение.
Получаем токен OpenWeather
Начнем с самого простого: зарегистрируемся на официальном сайте и в разделе My API keys создадим токен.

После того, как вы создали API-ключ, дайте ему немного «отлежаться» — обычно это занимает 10-15 минут. Спустя это время можно общаться с OpenWeather с помощью сгенерированного токена.
Генерируем токен для Telegram-бота
Ключ для Telegram-бота можно получить у @BotFather, введя /newbot — команду для создания и регистрации нового бота. Во время настройки придумайте боту логин и название — например, Weather Bot. Есть также опциональные настройки: текст приветствия, изображение. Используйте, если хотите получить более уникального бота!

Импортируем необходимые библиотеки
Для работы нам понадобятся модули requests и aiogram — установим их.
pip install requests aiogram
После импортируем модули и классы в файл нашего пет-проекта.
import os import datetime import requests from aiogram import Bot, types from aiogram.dispatcher import Dispatcher from aiogram.utils import executor bot = Bot(token='your_bot_token') dp = Dispatcher(bot)
Создание бота
Первое сообщение
Для начала проверим, что aiogram увидел бота и мы можем с ним взаимодействовать. Создадим простую асинхронную функцию start_command для ответа на команду /start . И добавляем метод start_polling для запуска бота.
import os import datetime import requests from aiogram import Bot, types from aiogram.dispatcher import Dispatcher from aiogram.utils import executor bot = Bot(token='your_bot_token') dp = Dispatcher(bot) @dp.message.handler(commands=["start"]) async def start_command(message: types.Message): await message.reply("Привет! Напиши мне название города и я пришлю сводку погоды") if __name__ == "__main__": # С помощью метода executor.start_polling опрашиваем # Dispatcher: ожидаем команду /start executor.start_polling(dp)
Запускаем скрипт, заходим в Telegram и пишем команду /start — все работает: бот возвращает нужное сообщение.

Обрабатываем входные данные
Теперь добавим функцию, которая будет реагировать на текстовые сообщения с названиями городов. Она должна проверять их на корректность и выводить ошибку, если валидация не была пройдена.
@dp.message_handler() async def get_weather(message: types.Message): pass
OpenWeather должен принимать название города через API и возвращать данные о погоде. Исходя из документации, кроме названия города запрос должен содержать API-токен.

Усовершенствуем запрос: в параметр q будем передавать город, добавим параметр lang=ru , чтобы API работал с кириллицей. А также используем units=metric для установки метрической системы:
http://api.openweathermap.org/data/2.5/weather?q=москва&lang=ru&units=metric&appid=наш_токен
Теперь добавим блок try-except для обработки пользовательских запросов и создадим переменную для записи результатов OpenWeather, которые возвращает сервис в JSON-формате.
@dp.message_handler() async def get_weather(message: types.Message): try: response = requests.get( f"http://api.openweathermap.org/data/2.5/weather?q=москва&lang=ru&units=metric&appid=your_token" ) data = response.json() except: await message.reply("Проверьте название города!")
Отправим запрос через браузер и посмотрим, какая температура, например, в Бангкоке.

В ответе получаем не только данные о температуре, но и облачность, давление, влажность, время заката, рассвета и другие величины.
Парсим JSON
Приступим к парсингу ответа OpenWeather в формате JSON: заберем данные о городе и температуре, влажности, давлении и скорости ветра.
city = data["name"] cur_temp = data["main"]["temp"] humidity = data["main"]["humidity"] pressure = data["main"]["pressure"] wind = data["wind"]["speed"]
OpenWeather возвращает время рассвета и заката в формате unix timestamp. Извлечем эти данные и преобразуем в секунды.
# получаем время рассвета и преобразуем его в читабельный формат sunrise_timestamp = datetime.datetime.fromtimestamp(data["sys"]["sunrise"]) # то же самое проделаем со временем заката sunset_timestamp = datetime.datetime.fromtimestamp(data["sys"]["sunset"])
Зная время рассвета и заката, мы можем вернуть пользователю продолжительность дня. В результате получается следующее:
@dp.message_handler() async def get_weather(message: types.Message): try: response = requests.get( f"http://api.openweathermap.org/data/2.5/weather?q=москва&lang=ru&units=metric&appid=your_token" ) data = response.json() city = data["name"] cur_temp = data["main"]["temp"] humidity = data["main"]["humidity"] pressure = data["main"]["pressure"] wind = data["wind"]["speed"] sunrise_timestamp = datetime.datetime.fromtimestamp(data["sys"]["sunrise"]) sunset_timestamp = datetime.datetime.fromtimestamp(data["sys"]["sunset"]) # продолжительность дня length_of_the_day = datetime.datetime.fromtimestamp(data["sys"]["sunset"]) - datetime.datetime.fromtimestamp(data["sys"]["sunrise"]) except: await message.reply("Проверьте название города!")
Декорируем сообщения
Разнообразим текст сообщений — будем выводить разные эмодзи в зависимости от погоды.
У словаря, который мы ранее спарсили, есть ключ main — он хранит описание погоды. На его основе мы можем создать свою коллекцию с эмодзи под разные ситуации.
code_to_smile =
Также напишем условие, чтобы в случае специфической погоды, для которой эмодзи не предусмотрен, программа не ломалась, а выводила специальное сообщение.
# получаем значение погоды weather_description = data["weather"][0]["main"] if weather_description in code_to_smile: wd = code_to_smile[weather_description] else: # если эмодзи для погоды нет, выводим другое сообщение wd = "Посмотри в окно, я не понимаю, что там за погода. "
Возвращаем данные пользователю
Данные собрали — время отдать их пользователю. Сформируем строки с датой и временем, погодой, влажностью и другими данными. Главное — учесть формат данных. Например, OpenWeather возвращает значение давления в гектопаскалях. Так, если вы хотите отдавать пользователю данные в миллиметрах ртутного столба, значение нужно разделить на 1.33 и округлить в большую сторону.
await message.reply(f""\n f"Погода в городе: \nТемпература: °C \n" f"Влажность: %\nДавление: мм.рт.ст\nВетер: м/с \n" f"Восход солнца: \nЗакат солнца: \nПродолжительность дня: \n" f"Хорошего дня!" )
Супер — бот работает и возвращает данные в удобочитаемом формате!

Деплой бота
Сейчас синоптик запущен на компьютере. Это неудобно, если вы хотите общаться с ним круглосуточно. Ведь тогда нужно поддерживать бесперебойную работу компьютера и постоянное соединение с интернетом.
Облачные серверы с гибкой производительностью ядра vCPU
Бота лучше перенести в облако. Поскольку затраты процессора на работу с простым Open Weather API минимальны, будет достаточно виртуального сервера с 1 vCPU и 1 ГБ оперативной памяти. С учетом выделенного IP-адреса такая конфигурация выйдет примерно в 30 ₽/день.
Для начала зарегистрируемся в панели управления и создадим новый сервер в разделе Облачная платформа. Затем настроим его.

Далее подключимся к серверу по SSH, создадим виртуальное окружение для бота и загрузим его удобным способом.

Последним шагом нужно создать .service-файл, который будет автоматически поднимать бота в случае перезагрузки сервера.


Запускаем командой: systemctl enable tg_bot.service
Проверяем статус: systemctl status tg_bot.service
И перезапускаем .service-файл: systemctl restart tg_bot.service

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

Заключение
Следуя инструкции, каждый может создать бота для мониторинга погоды. А использование виртуальной машины из линейки Shared Line позволит избежать капитальных затрат. Платите только за потребленные ботом мощности по модели pay-as-you-go, а также экономьте на неполной загрузке ядра.
Автор: Максим Плачковский, создатель канала PythonToday
Как подключить платежную систему с Payments к Telegram
Как разработать веб-приложение (интернет-магазин) в Telegram
Зарегистрируйтесь в панели управления
И уже через пару минут сможете арендовать сервер, развернуть базы данных или обеспечить быструю доставку контента.
Читайте также:
Инструкция
Как создать 100 серверов в облаке за минуту? Работа с OpenStack клиентом
Инструкция
Как создать веб-приложение на базе Telegram Mini Apps
Инструкция
Что делает команда chmod и как ее использовать в Linux
Telegram бот, который улучшит любую IT компанию

Всем привет, в этой статье я хотел бы рассказать о создании бота для мониторинга систем (сайтов) и внутренних сервисов – их доступность/недоступность.
Кому данный бот будет полезен 100%?
Абсолютно всем!
Вы можете мониторить как одну систему, так и хоть 100, получать уведомления в Telegram и оперативно принимать меры по устранению проблем.
Вкратце опишу принцип работы бота. Есть список URL, первый поток бегает по ним и проверяет на доступность, если находит недоступный ресурс – помещает его в список не работающих ресурсов и оповещает нас о недоступности ресурса, временно удаляя неработающий ресурс из списка рабочих. В свою очередь список неработающих систем также мониторится и в случае обнаружения рабочего ресурса – нас оповещают об этом и ресурс, который был в списке неработающих покидает этот список.
Первое что мы делаем – это создаем бота в @BotFather. Придумываем имя и получаем токен. Итак, перейдем непосредственно к коду.
Импортируем нужные библиотеки, telebot (pyTelegramBotAPI) хорошая и лёгкая библиотека для создания бота на Python. Библиотека threading импортируется для запуска в несколько потоков.

В этой части кода указываем тайм-ауты для запросов и долгих response, иногда ресурс может отдать ответ за 5 секунд иногда и 30 будет недостаточно. Прописываем интервал пересылки из бота в беседу (можно не делать пересылку в беседу, но тогда придется прописывать user ID, на который будет триггерить бот, иначе любой кто зайдет в бота сможет запустить проверку сначала). И указываем шаблон оповещения доступной системы.

Создаем функцию, которая будет обрабатывать загрузку файлов. Проходимся построчно по .ТХТ файлу, помещая все значения в список, прописываем кодировку (можно указать кодировку в .ТХТ, но лучше в коде, так как часто файлы меняются и этот момент забывается, либо некорректно воспроизводится другими пользователями). Указываем разделитель, по которому будет происходить отсечение значения, вносим сайт в список.

Переходим непосредственно к checking ресурсов и помещению их в списки (рабочие/нерабочие ресурсы), и оповещению в боте о нерабочих ресурсах.

И получаем в боте сообщение такого формата:

В данном блоке check-аются недоступные ресурсы. Поток бегает по списку недоступных систем и оповещает в боте.

Оповещение о доступности будет иметь такой вид:

Опрашиваем серверы Telegram на предмет новых сообщений, не прекращая опрос при получении ошибки.

Для удобства закинем бота в контейнер Docker.

docker build -t python-docker-checker .
docker run python-docker-checker
И вот бот уже крутится в контейнере.

P.S. Помимо систем, можно мониторить и внутренние сервисы, имеющие Status Code.
- bot
- telegrambot
- мониторинг сайта
- мониторинг сервера
- мониторинг
- бот телеграм