Telegram-Бот "попингуй"

Материал из Mindsellers
Перейти к: навигация, поиск

Python

У многих админов, в том числе и у нас, используется система мониторинга Zabbix с прикрученным к ней телеграм-ботом, который всякие ворнинги постоянно кидает в группу. Но бывает так, что падает агент заббикса, или происходит ложное срабатывание, ну и так далее. В итоге приходится ночью вскакивать с кровати, бежать к компу, ломиться на рабочий комп по удаленке - и все это ради того, чтобы просто пропинговать ресурс и убедиться в том, что он жив. Вот и решил я написать свой бот на Python, который будет болтаться на сервере в локальной сети и по заявкам пользователей пинговать что надо.

Сначала добавляем себе супер-бота @BotFather, создаем через него своего бота и получаем токен, который надо будет указать в скрипте, затем переходим к разработке.

Вот листинг самого скрипта

#!/usr/bin/python
# -*- coding: utf-8 -*-
import telebot
import subprocess
import shelve
db=shelve.open('/admin/teleusers.db')
token = '594234890:AAFxCNkxhv8Lb7kUO1WsdsdfcsdecsdDypYOw3A'
password = 'somepass'
allowed=set()
try: 
	allowed=db["users"]
except:
	pass
bot = telebot.TeleBot(token)
@bot.message_handler(content_types=["text"])
def messages(message): 
	if message.text == password:
		print message.from_user.id
		allowed.add(message.from_user.id)
		db["users"]=allowed
		bot.send_message(message.chat.id, 'Вы добавлены в список пользователей бота. Теперь можете писать адрес, который надо пропинговать')
	else:
		user= message.from_user.id
		if '.' not in message.text:
			bot.send_message(message.chat.id, 'Такое я и пинговать не буду')
		else:
			if user in allowed:
				bot.send_message(message.chat.id, 'Пингую, подождите')
				try:
					out, error=subprocess.Popen(['ping', '-c 10', message.text],stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
					resp=out+'\n'+error
				except:
					resp='Адрес недоступен с сервера srv-info'
				bot.send_message(message.chat.id, resp)
			else:
				bot.send_message(message.chat.id, 'Пока не скажешь пароль, ничего не получишь!')

bot.polling(none_stop=True)

Кроме стандартной работы с библиотекой telebot, интерес тут представляет механизм авторизации. Используя библиотеку shelve, мы будем хранить в файле эдакую базу данных "ключ: значение". В качестве ключа у нас будет слово users, а в качестве значения - множество ID наших клиентов. При запуске скрипта мы читаем из базы идентификаторы в множество(если, конечно, там уже есть нужный ключ. Если его нет, то множество останется пустым). Если пользователь отправит нам пароль, то мы внесем его в множество allowed и положим обновленное множество в базу. При каждом запросе проверяем, "наш человек или посторонний". Если наш, то запускаем пинг и возвращаем результат. Если пинг завершится неуспешно, то выводим сообщение о недоступности ресурса.

Для того, чтобы не морочиться с демонизацией нашего скрипта, применим современные технологии, а именно systemctl:

Создадим файлик /etc/systemd/system/telegrambot.service примерно такого содержания

[Unit]
Description=MyTelegramBot
After=multi-user.target
 
[Service]
Type=idle
ExecStart=/usr/bin/python /admin/telegrambot.py
Restart=always
 
[Install]
WantedBy=multi-user.target

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

sudo systemctl daemon-reload
sudo systemctl enable telegrambot.service
sudo systemctl start telegrambot.service

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