Русский
Русский
English
Статистика
Реклама

Python-telegram-bot

Из песочницы Как я делал Telegram-бота для работы с сетью

12.08.2020 06:16:44 | Автор: admin
Добрый день! image Я поделюсь с Вами интересным опытом по созданию мобильного инструмента для работы с сетью.

Предисловие

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

2013 год. У меня есть товарищ, который так же работал в одном из федералов, подключая клиентов и была история, когда он мне дал в руки телефон и полез на чердак что-то там делать с коммутатором. Я снизу стоял с телефоном на котором была открыта веб страничка с разными интересными скриптами. Скрипты эти выполняли проверку порта на коммутаторе, чистку ошибок и прочего.

То есть, инженер придя на адрес не беспокоил администратора по глупостям, т.к. у него самого был инструмент для работы с сетью.

На дворе июнь 2018 года, и я мучался с мыслями о том что А почему бы не написать бота который бы проверял оборудование разного уровня(ядро, агрегация, доступ)?. Проблема была в том что избавится от рутины хотел только я один, остальные жили сегодняшним днём.

Выбор языка программирования и платформы

Ребят, ну конечно же Python. На момент задумок я уже имел кое-какие навыки и небольшой опыт написания скриптов. Платформа была выбрана дружелюбная Telegram т.к. все IT-шники там и обитают.

Выбор библиотек для написания бота

1. Библиотека для работы с Telegram. pyTelegramBotAPI угасал, тем более во времена блокировок хотелось быстро дружиться с прокси и прочими вещами. Я выбрал python-telegram-bot, и за основу взял Conversation.

2. Библиотека для работы с оборудованием. Из-за простоты работы, мой выбор пал на python3-netsnmp.
Основа положена, пришло время писать.

Погнали

Сеть была зоопарком железа и пришлось брать отдельно вендора определенного и работать с ним. Так же важное условие было, наличие MIB-ов для выполнения задач.

Одна из задач была проверка длины кабеля и состояние пар, проверка состояния портов и наличия ошибок на портах.

Сейчас многие напишут мол Ну а что без SNMP обойтись было нельзя?. Отвечу, что Да, нельзя, если вы хотите снимать данные нормальным человеческим образом то только SNMP.
Сейчас кого-то уже подгорает пукан и он пишет что только NETCONF.

Пройдя оборудование доступа и реализовав с ним работу в боте, я столкнулся с тем что иногда действительно для специфичных задач, который протокол SNMP не решит, придётся заходить на оборудование.

На помощь мне пришла библиотека netmiko и я по-прежнему остаюсь ей доволен. Она решила очень много задач даже не связанных с ботом. Количество поддерживаемого оборудования просто огонь.

Так же для проверки IP-адресов мне очень пригодилась библиотека ipaddress

image

image

image

В целом, при программировании я учел много нюансов начиная от авторизации пользователя в боте до выдачи ему разных прав.

Функционал рос

Да, функционал действительно рос, а с ним и росла поддержка определенного оборудования. Я добавлял оборудование радио доступа, оптические приемники КТВ.

Как-то ко мне пришли люди и говорят вот мы будем ставить домофоны. Я головой своей понимаю что настройка так же ляжет на мои плечи и плечи коллег.

Я начал щупать, смотреть. Читал API, которое благо там было. Выбрал самую простую библиотеку для работы с HTTP и HTTPS requests.
Накрутив уже работу с домофонами появились потребности в базе, но как обычно ленивой *опе сильно напрягаться не хотелось. Поэтому выбор пал на sqlite3. Библиотека так же была выбрана максимально простая это dataset.

Тучи сгущаются

В какой-то момент работы становилось безумно много и моё детище по факту жило самостоятельно. Работы много, денег мало ну вы думаю улавливаете нотку. Я решил покинуть это заведение. Отработав несколько лет в федерале я неплохо прокачал skill по работе с языком программирования. Остался очень этим доволен.

Эпилог

Пожалуй, это толи большая, толи не очень история подошла к завершению. Сетевик на мой взгляд без программирования никуда, особенно с зоопарком железа. В итоге парк поддерживаемого оборудования был такой:
23 модели коммутаторов доступа
3 модели оптических приемников КТВ
4 модели шассийных коммутаторов
1 модель шассийного маршрутизатора
3 модели оборудования радио доступа
Подробнее..

Простой Telegram-бот для получения информации через MQTT

04.05.2021 06:11:43 | Автор: admin

Этот бот был разработан для просмотра информации, находящейся на mqtt сервере внутри локальной сети. Он может работать на одном компьютере с mqtt сервером (в том числе на Raspberry PI или подобном) или отдельно. Задача удалённого управления не ставилась, только предоставление доступа к данным.

Протокол MQTT предназначен специально для использования в различных устройствах автоматики, на нём очень легко организовать телеметрию и сбор данных. Этот протокол поддерживают как "умные" бытовые устройства, так и многие промышленные контроллеры. Также есть множество проектов на ESP8266, ESP32 или подобных платформах.

На mqtt сервере публикуются данные телеметрии с различных датчиков - допустим, это метеостанция и термометры в теплицах. Для их просмотра на десктопе я раньше делал виджет, веб-страницу, потом захотелось иметь эти данные всегда под рукой. Конечно, можно было пробросить доступ к серверу наружу или разместить его в облаке, но тут возникает ещё целый ряд проблем. Тема использования бота в мессенджере для меня не новая - ещё пятнадцать лет назад я использовал ICQ клиента на мобильном телефоне, чтобы с помощью ICQRemote и скрипта на AutoIt переключать треки в Winamp на десктопе. Сейчас средний телефон гораздо мощнее того десктопа и имеет почти столько же постоянной памяти, но проблема внешнего подключения к устройству в локальной сети по-прежнему существует. И боты всё так же отлично справляются с решением этой проблемы. В общем, было решено делать Телеграм-бота, который просто предоставляет по запросу необходимую информацию.

Я не буду рассказывать про регистрацию имени бота и получение токена, так как это всё уже есть в каждой предыдущей статье про телеграм-ботов. Перейду сразу к программе на Python. Она разрабатывалась под Windows, но я не вижу препятствий для её запуска под другими системами - используемые библиотеки python-telegram-bot и paho-mqtt это позволяют.

Настройки программы хранятся в ini файле. В секции TELEGRAM прописывается токен для бота, в секции MQTT адрес и логин/пароль mqtt сервера, а также топик для получения данных (если несколько - через запятую, без пробелов). При запуске бот подключается к mqtt серверу и подписывается на необходимые топики. Глубина вложенности уровней может быть любой. Поступающие данные попадают в словарь alldata, ключом является полный топик:

{'greenhouse/1/temp': '24.76','greenhouse/1/upd': '22.04 18:20:30','greenhouse/2/temp': '22.95','greenhouse/3/temp': '28.91','air/outdoor/1/temp': '17.32','air/outdoor/1/upd': '22.04 18:21:25','air/outdoor/1/pressure': '739','air/outdoor/1/humidity': '58.3'}

При необходимости чтения из этого словаря формируется разбитый на уровни вложенный словарь tree - дерево данных. Это преобразование выполняет функция maketree.

def maketree(group, items, path):    def sep(s):        return s.split('/', 1)    head = [i for i in items if len(sep(i)) == 2]    tail = [i for i in items if len(sep(i)) == 1]    if len(tail) == 1:        return group, tail[0]    gv = groupby(sorted(head), lambda i: sep(i)[0])    return group, dict([(i, path) for i in tail] + [maketree(g, [sep(i)[1] for i in v], '') for g, v in gv])

В результате получается такая структура:

{    "air": {        "outdoor": {            "1": {                "humidity": "58.3",                "pressure": "739",                "temp": "17.32",                "upd": "22.04 18:21:25"            }        }    },    "greenhouse": {        "1": {            "temp": "24.76",            "upd": "22.04 18:20:30"        },        "2": {            "temp": "22.95"        },        "3": {            "temp": "28.91"        }    }}

Из такого словаря очень легко получить нужные данные. Например, температура в 1 теплице находится по адресу tree[greenhouse][1][temp]. Так как данные обновляются намного чаще, чем запрашиваются, преобразование в момент запроса достаточно эффективно. При более частых запросах лучше будет формировать и обновлять такое дерево сразу при поступлении данных.

Затем идёт подключение к серверу Телеграм. Бот предназначен для работы в локальной сети без возможности пробросить необходимый для веб-хука порт, поэтому для подключения он использует Long Polling запросы. Используется библиотека python-telegram-bot версии 12.8, так как в 13 версии разработчики что-то поломали. Установить её можно командой pip3 install python-telegram-bot==12.8

Для упрощения работы с ботом не используются команды: в ответ на знакомое слово он отсылает информацию, на незнакомое выдаёт кнопки выбора. В моём случае кнопок две, они прописаны в функции get_keyb:

def get_keyb():    return [[InlineKeyboardButton('Погода', callback_data='1'),            InlineKeyboardButton('Теплицы', callback_data='2')]] 

А также в словаре, строчными буквами для удобства сравнения:

keys = {'погода': '1', 'теплицы': '2', 'приборы': '3'}

Ключ "приборы" добавлен для отладки, на него ответ всегда "40"

Вариант диалогаВариант диалога

Кнопки можно многократно использовать для обновления информации.

В принципе, подобного бота можно использовать и для управления чем-либо, например через публикацию команд в те же mqtt топики - это ограничивается только Вашей фантазией. Но тогда нужно будет добавить авторизацию и список контактов. Полный код бота на GitHub

Подробнее..

Телеграм бот для поддержки своими руками

28.01.2021 22:20:35 | Автор: admin

Представьте, что у вас есть свой канал в Телеге. Допустим, вы высказываете непопулярную политическую точку зрения и, соответственно, ловите хейт в личку со стороны читателей и проходящих мимо.

Или, например, вы продаете что-то через свой канал. Клиентов так много, что один "продажник" (=вы) не справляется. Или поддержка вашего бизнеса отвечает всем в публичном чате, который прикреплен к вашему каналу. Но многие стесняются задать вопросы, так как их могут увидеть, поэтому пишут в личку, что не масштабируется.

Проблем много, а решение одно: сделать Телеграм бот, который будет работать посредником между вашими клиентами и командой поддержки.

Мое мнение: это самый лучшее применение телеграм ботов за всю историю их существования. На втором месте - рассылка закрытой информации через бота только проплатившим пользователям.

Самый популярный конструктор таких ботов - Livegrambot. Он позволяет сделать тоже самое, но при этом бот будет писать вашим пользователям "я сделан через Livegrambot", выпрашивая деньги у вас. Будучи умелым создателем Телеграм ботов, я решил сделать свой аналог, но уже с открытым исходным кодом и легким способом запустить его бесплатно на бесплатные серверы.

Ниже я расскажу, как в 1 клик запустить такого бота и как он технически устроен.

TL;DR: Код выложил сюда: https://github.com/ohld/telegram-support-bot

Юзер стори или как с этим ботом работать.

Действующие лица:

  • Ваши Пользователи (читатели канала, клиенты),

  • Закрытый Чат Поддержки (где сидят те, кто будет отвечать на вопросы Пользователей),

  • Бот (которому Пользователи будут писать свои вопросы).

Вот так это все будет работать:

  1. Вы публикуете ссылку на Бота,

  2. Пользователи пишут в него свои вопросы,

  3. Бот пересылает их сообщения в ваш Чат Поддержки,

  4. В этом чате вы или ваши помощники отвечают на сообщение (через reply),

  5. Бот пересылает ответ обратно пользователю от своего лица, скрывая аккаунт отвечающего.

Такая схема неплохо масштабируется: достаточно нанять больше Агентов поддержки, и все Пользователи получат свои ответы вовремя и через бота.

Как это все запустить? Желательно, без навыков.

Планируя дизраптнуть платный аналог, необходимо продумать онбординг. Большинству проще заплатить, чем самому разбираться в коде, технологии и деплое. К счастью, я фанат Heroku, а именно там можно бесплатно хостить свой код, нажав всего одну кнопку.

В README.md я добавил волшебную кнопку от Heroku, которая поможет запустить код из репозитория. После нажатия, при наличии аккаунта на Heroku (который можно создать также по 1 кнопке), вы увидите такую картину:

Heroku уже понял, какие данные нужно запросить у вас, у создателя, чтобы все завелось автоматически. Давайте пройдемся по этим параметрам:

- App name: название приложения в системе Heroku. Можно придумать любое.

- Choose a region: где Хероку запустит ваш код. Можно выбрать любое место.

- HEROKU_APP_NAME: впишите сюда тоже самое, что указали выше в App name (это важно для того, чтобы завести тг бота через вебхуки).

- TELEGRAM_SUPPORT_CHAT_ID: айдишник чата, куда Телеграм бот будет пересылать сообщения пользователей. Как узнать его - смотрите ниже.

- TELEGRAM_TOKEN: токен вашего бота, который можно получить у BotFather.

Как узнать TELEGRAMSUPPORTCHAT_ID

Способов много, но самый простой - это добавить вот этого бота в ваш созданный приватный чат. Этот бот возвращает все данные, которые ему присылает Телеграм, в частности событие "меня добавили в чат", откуда вы и сможете извлечь chat_id.

Как реализовать такого бота?

Ниже будет много технической информации. Мы же на Хабре, поэтому я решил добавить этот раздел для любителей разобраться в коде и при необходимости его адаптировать. Это раздел можно спокойно пропустить, если хотите.

Примеры кода я буду писать на языке Python и использовать библиотеку python-telegram-bot. Итогда я буду вставлять ссылки на GitHub (гит), чтобы легко можно было найти этот кусок кода в моем репозитории.

Хендлеры (обработчики событий)

Для нашей задумки необходимы всего 3 хендлера (гит):

from telegram.ext import Updaterfrom telegram.ext import CommandHandler, MessageHandler, Filtersupdater = Updater(TELEGRAM_TOKEN)dp = updater.dispatcher# Для приветственного сообщения и для "к вам подключился {username}"dp.add_handler(CommandHandler('start', start))# Для пересылки из бота в чат поддержкиdp.add_handler(MessageHandler(Filters.chat_type.private, forward_to_chat))# Для пересылки ответа из чата обратно пользователюdp.add_handler(MessageHandler(Filters.chat(TELEGRAM_SUPPORT_CHAT_ID) & Filters.reply, forward_to_user))

С командой /start все понятно. Юзер нажал - прислать приветственное сообщение - прислать в чат поддержки о том, что подключился новый юзер (гит).

def start(update, context):    update.message.reply_text(WELCOME_MESSAGE)    user_info = update.message.from_user.to_dict()    context.bot.send_message(        chat_id=TELEGRAM_SUPPORT_CHAT_ID,        text=f"? Connected {user_info}.",    )

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

def forward_to_chat(update, context):    update.message.forward(chat_id=TELEGRAM_SUPPORT_CHAT_ID)

В случае отправление ответа (reply) на пересланное сообщение, необходимо скопировать содержимое сообщения и отправить его от лица бота. Если аналогично сделать .forward, то будет виден отправитель. А тут как раз недавно в Telegram Bot API добавили возможность удобно копировать содержимое сообщения (гит):

def forward_to_user(update, context):    user_id = update.message.reply_to_message.forward_from.id    context.bot.copy_message(        message_id=update.message.message_id,        chat_id=user_id,        from_chat_id=update.message.chat_id    )

Бесплатный деплой на Heroku

Чтобы захостить это все бесплатно на Heroku, бот должен быть запущен в режиме Webhook, а не Pooling. Разница их в том, что вебхук "слушает новые сообщения от Телеги", а пулинг "периодически запрашивает". Чтобы запрашивать, сервер должен работать постоянно (условно, каждую секунду запрашивать у серверов Телеграмма новые сообщения, которые кто-то написал в бот). Однако, в случае с вебхуками, сервер может просто ждать, когда серверы Телеграмма сами отправят нам новые обновления бота.

Этот факт критически важен, если мы хотим бесплатно пользоваться услугами Heroku (который по факту дает нам свои серверы в аренду). Хероку любит "усыплять" простаивающие машины, которые пробуждаются в момент нового входящего запроса. Именно новые сообщения от серверов Телеграмма и будут пробуждать наш сервер тогда, когда необходимо переслать пользовательское сообщение из лички бота в наш чат поддержки.

Для того, чтобы настроить Webhook, необходимо поднять вебсервер, который будет слушать входящие сообщения по endpoint. Сказать Телеграму: "присылай события бота мне на сервер - по этому адресу". Также нужно как-нибудь защититься от злоумышленников, которые могут отправить на наш вебсервер событие, прикинувшись сервером телеги. Также телеграм требует, чтобы все работало https.

Звучит сложно, однако Heroku автоматически и бесплатно обеспечит https, а вебсервер для вебхука уже встроен в библиотеку python-telegram-bot. Если добавить секретный токен вашего бота в URL, по которому вы будете слушать события от Телеги, то можно защититься от стороннего вмешательства.

Вот как можно запустить Телеграм бот в webhook-режиме (гит) через эту библиотеку:

# запускаем слушающий вебсервер updater.start_webhook(  listen="0.0.0.0",  port=PORT,  # HEROKU требует, чтобы порт вебсервера задавался через переменные окружения  url_path=TELEGRAM_TOKEN  # добавляем секретное значение в адрес, который слушаем)# говорим Телеграму: "присылай события бота по этому адресу"updater.bot.set_webhook(f"https://{HEROKU_APP_NAME}.herokuapp.com/{TELEGRAM_TOKEN}")updater.idle()

Помните, мы отдельно задавали переменную окружения HEROKU_APP_NAME , куда копипастили название нашей Heroku App? Дело в том, что эта переменная используется в адресе, по которому Heroku запускает наш вебсервер. Но при этом, имя приложения Хероку нельзя получить изнутри, поэтому решение "скопипастить название App Name в отдельную переменную окружения" для меня звучит норм.

Что дальше?

Допустим, вы запустили бота, у вас уже много клиентов и вы хотите усовершенствовать функционал телеграм бота. Что можно сделать?

Во-первых, можно сохранять список пользователей, которые как-нибудь контактировали с ботом. Это пригодится как для выстраивания воронок, так и для массовой рассылки им сообщения через бота. Во-вторых, можно улучшить сервис со стороны агентов поддержки: в сообщения добавить кнопки с ссылками на CRM, спрашивать у пользователей качество ответа, выводить больше информации о подключенном юзере и запрашивать у них контакты.


Спасибо за просмотр. Теперь вы знаете, как можно сделать и бесплатно задеплоить Телеграм бота поддержки. Полный код проекта (вместе с волшебной кнопкой "задеплой это на хероку") лежит тут. В своем Телеграм канале я делюсь опытом разработки больших телеграм ботов, делюсь датасетами и продуктовой аналитикой. Заходите.

А какие другие популярные юзкейсы Телеграм ботов вы бы выделили? Напишите в комментариях.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru