Моніторинг стану свого ресурсу за допомогою Telegram-бота

Привіт, Хабр! Я вже давно спостерігаю за тобою, але все ніяк не наважуюсь зробити свій перший крок. Тепер мені здалося що я готовий. Розповім про свій досвід роботи з telegram ботом — останнім часом ця тема досить популярна на просторах мережі, так і на самому Хабре я зустрічав вже не мало статей. Але здебільшого в них розповідається про принципи створення ботів, і немає ні слова про те, яку практичну користь можна з цих самих ботів витягти.

У мене був досвід створення систем моніторингу стану серверів, з можливістю налаштування стратегій тестування і відправкою коротких sms-повідомлень з метою інформування про неполадки на одному з спостережуваних серверів, але все це досить не зручно, а так само платно — кожне повідомлення коштує грошей.

Що таке «система моніторингу стану»? По своїй архітектурі це має бути невеликий модуль, який відповідає за перевірку стану та за інформування про відхилення від нормального стану.

Є безліч готових комплексних рішень, що включають у себе таку систему моніторингу. Це і знаменитий zabbix та nagios та yandex метрика і ще величезна купа аналогічних прекрасних інструментів.

Аналітика
На етапі створення сайту будь-розробник використовую свій локальний сервер розробки. Але як тільки проект приходить в робочий стан, його тут же хочеться викласти на production сервер. І часто саме це стає великою помилкою, адже як тільки ваш сайт стає доступним для користувачів мережі інтернет, ви потрапляєте в прекрасний світ пригод і замість розробки починаєте займатися налаштуванням. І ось тут, хочеш, знову згадується система контролю стану. Дуже зручно, коли про якісь труднощі чи проблеми дізнаєшся відразу і від свого інформатора.

Перший час будь свіжий сайт мало цікавий користувачам. Однак при достатніх зусиллях або грошових вкладеннях (зазвичай і те і інше) на ресурсі з'являється трафік.

Ми вже помістили в наш код скрипт google analytics і можемо спостерігати за динамікою зміни нашої аудиторії. Але цього не завжди буває достатньо. Іноді хочеться знати більше — хочеться контролювати весь процес знаходження користувача на сайті, вести його, направляти. Аналізуючи заголовки запитів і відповідей можна отримати вичерпну інформацію про те, що робив користувач, коли і навіщо. Для цього рано чи пізно ви починаєте читати логи вашого веб-сервера — іноді там прихована помилка, яка допоможе виправити вам серйозний баг, а іноді просто цікаво зрозуміти: хто ж все-таки спам вашу гостьову книгу?

Бот
Python і django ідеально підходять для роботи з telegram ботом. Що таке бот? У цьому контексті, бот — це інтерфейс взаємодії між вашою програмою і клієнтом telegram. Цей інтерфейс дозволить відправляти повідомлення в залежності від бізнес логіки вашої програми.
Я не буду розписувати тут весь процес створення і налаштування веб-додатки на django — навряд чи у мене вийде зробити це краще ніж у творців офіційної докумментации. Скажу тільки, що це не повинно зайняти у вас більше десяти хвилин, якщо ви вже працювали з цим фреймворком.

Хочеться сказати спасибі Павлу Дурову і його команді — завдяки можливості установки webHook, працювати з ботом стало максимально просто і зручно. Все що необхідно це:

  • Створити свого бота за допомогою інтерфейсу BotFather клієнта телеграм і налаштувати його, слідуючи інструкціям папи бота

  • Встановити webHook, використовуючи свій token, який папа бот допоможе вам отримати. Для цього переходимо url: api.telegram.org/bot{{ token }}/setWebhook?url={{ url }}, token — ваше кільце аутентифікації, а url — це посилання, запит на яку обробляє контролер вашого телеграм бота. Відзначу так само, що може використовуватися тільки https протокол, тобто необхідний SSL.

  • Створити контролер, обробний url з пункту 2, створити бізнес логіку для вашого бота. Прив'язати контролер до обробника url. В частина url необхідно так само додати свій token щоб забезпечити інші люди не могли надсилати запити на цю адресу.

  • Додати бота в свій список контактів. Це можна зробити через пошук в клієнті telegram або використовуючи посилання @{{ bot_name }}
Далі все зводиться до простої схеми. Як тільки вашу роботу приходить якесь повідомлення, на url, встановлений в webHook приходить запит з інформацією про цьому повідомленні. Зокрема там є інформація про дату повідомлення, про id чату відправника, про відправника. Цю інформацію краще зберігати в базу даних, щоб випадково не втратити з нею потрібно працювати. Ми програмуємо бота таким чином, що якщо йому приходить повідомлення, яке є командою — він виконує яку-небудь дію. Скажімо, я хочу, щоб бот відправляв мені повідомлення в telegram з інформацією про кожному запиті, що приходить на мій сайт. Для цього потрібно задати йому всього дві команди, наприклад:

/requests /stop_requests. Перша команда додасть в базу підписку на розсилку інформації про запити на сайт, друга команда — видалить цю підписку. Далі необхідно створити свій context processor — це можна зробити в більшості сучасних MVC фреймворків. У його коді необхідно обробити підписки на розсилку і далі відправити повідомлення в чат із зазначеними id, який ми зберегли в базу, коли нам прийшов запит на наш webHook url. Так само ми можемо оформляти підписки на абсолютно будь-які події на своєму сайті: реєстрації користувача (зручно реалізовувати через сигнали), коментарі, помилки. Простір для творчості просто бездонний. На своєму ресурсіborn2fish, де можна редагувати інформацію про річках і озерах Світу, я використовував бота для отримання інформації про те, коли сутність водойми хтось зраджував. Це допомагає оперативно отримувати повідомлення про водоймах, які потребують перевірки модератором.

Сама надсилання повідомлення залежить від реалізації. На python вона виглядає так:

def _send_msg(bot, chat_id, message):
bot.sendMessage(chat_id=chat_id, text=message)

А ось так може виглядати функція обробки підписок і відправки інформації про запит:

def send_requests_subscriptions(request, city):
""" send Telegram messages subscribed to users """
bot_message = request.META['HTTP_USER_AGENT'] + " request from " + get_client_ip(
request) + " (" + str(city['city']) + ") url = [" + request.path_info + "]"
subscriptions = RequestsSubscription.objects.all()
for subscr in subscriptions:
_send_msg(bot=bot, chat_id=subscr.chat_id, message=bot_message)

Цей метод дозволяє показати користувачеві допомогу, яка зчитується з файлу help.md:

def _display_help():
return render_to_string('help.md')

Замість висновку
На словах все здається дуже простим, але зазначу, що таких ботів важко тестувати. Оптимальним рішенням стане Unit Test, в якому ви будете симулювати запит від telegram і перевіряти роботу бізнес логіки бота.

Що ще може знадобиться? Не завжди інформація в профілі користувача telegram заповнена повністю, так що слід перевіряти значення на None перед збереженням у базу, щоб не отримати IndexError.

Ви можете додати свого бота в групу. Це допоможе не розсилати інформацію кожному користувачеві, а відправляти її в єдине місце, звідки вона вже буде доступна всім бажаючим. Зробити це можна через інтерфейс клієнта telegram, в налаштуваннях вашого бота і вашої групи.
В якості прикладу хочу поділитися посиланням на свого тестового бота: @born2fishBot, Напишіть йому /help щоб отримати список можливих команд.

Телеграм — чудовий додаток, яке відкриває нові горизонти програмістам, адміністратору, так і простим користувачам. Використовуючи нововведення, можна отримати відчутну вигоду від використання telegram ботів, при зовсім невеликих тимчасових витратах на розробку. Отримуйте всі найсвіжіші дані про стан вашого веб-ресурсу першим. І нехай ці новини будуть лише приємні.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.