Telegram bot for Mikrotik

Возникла идея управлять устройствами Микротик “издалека”.

Например, получить список активных pptp пользователей или же получать уведомления, когда кто-то подключается к моей Wi-Fi точке. Или Большая Красная Кнопка.

Причем хотелось максимальной универсальности (чтобы и с Linux, и с MacOS, и с телефона на Андроиде, да даже с ПК на Windows %). Да, есть сторонние приложения, но … ну не нашел я того, чтобы работало нормально и на всём… А писать на всё платформы самому – нереально. Или реально?

И тут как-то пришлось прикручивать Telegram бота к Zabbix серверу. И возникла идея – а чем роутеры хуже? По сути они умеют всё, что нужно для управления ботом.

Итак родился модуль. Что его отличает от нескольких похожих, уже кем-то ранее написанных (гугл в помощь)? Максимальная универсальность – для добавления новых команд для бота не нужно разбираться, как работать с Telegram API – достаточно просто в самом боте добавить нужную команду (раскажу чуть позже как) и создать скрипт “tg_cmd_команда“, где команда – имя новой команды, которую должен будет выполнять ваш скрипт. И всё. Для примера я уже создал две команды ( /hi и /health).

Также написан самостоятельный скрипт отправки сообщений в телеграм (ему нужен только конфиг) – полезно, если желаете из своего скрипта послать сообщение в Telegram. Пример его использования смотрите в примерах скриптов tg_cmd_hi и tg_cmd_health .

А теперь по-порядку.

Установка скриптов

  1. Скачиваем архив telegram_v1 и распаковываем его.
  2. Файл telegram_v1.rsc закидываем на роутер.
  3. Импортируем в терминале командой:

    /import telegram_v1.rsc

  4. Проверяем – у вас в System->Scripts должны появиться скрипты:
    func_fetch – обертка для штатной /tool fetch команды – позволяет подождать окончания и получить результат чтения через http;
    tg_config – конфигурация;
    tg_getUpdates – скрипт проверяет наличие новых сообщений и вызывает соответствующие скрипты. Если команда не распознана или источник не есть доверенный – ничего не делаем.
    tg_getkey – вспомогательная для tg_getUpdates функция;
    tg_sendMessage – скрипт для отсылки сообщений в Telegram;
    tg_cmd_hi – пример реализации команды /hi
    tg_cmd_health – пример реализации команды /health;
    а также задача Telegram в Scheduler (по умолчанию она disabled).
  5. Заполняем tg_config:
    botAPI – ключ API для бота, его получаете при создании бота в Телеграмм (см. ниже)
    defaultChatID – id чата, в который по умолчанию отправляются сообщения скриптом tg_sendMessage
    trusted – строка-список через запятую id всех доверенных источников (то есть чьи команды будет выполнять бот). Как минимум это ваш личный id в Telegram (как его узнать –  ниже).
    storage – хранилище для временных файлов. Рекомендую вставить в роутер флэшку или SD-карту и указать их как временное хранилище (обычно это “disk1/”). Если хочется продлить жизнь внутренней флэш-памяти роутера.
  6. Задачу в Scheduler пока НЕ активируем.

 

Создаем бота в Telegram

Теперь:

А) заходим в телеграмм (если его у Вас еще нет – устанавливаем, регистрируемся).

Б) узнаем свой собственный id. Для этого в свой список контактов добавляем контакт @MyTelegramID_bot (Get Your Telegram User ID). Приветствуем его (посылаем команду /start). Он сразу же сообщит вам ваш личный id в telegram. Пишем его в defaultChatID и trusted .

В) создаем бота. Для этого в контакты добавляем другого бота – Отца Всех Ботов Телеграмм – @BotFather (просто BotFather). Выполняем команду /newbot . Отец Всех Ботов спросит имя бота и username. Отличие в том, что имя – по сути просто текстовое описание бота, а username – это уникальный идентификатор, который заканчивается на bot и может состоять только из ограниченного набора символов (латиница, цифры и некоторые знаки а-ля подчеркивания). После ввода нужных данных Отец Всех Ботов сообщит вам API token (сложно ошибиться- длинный набор непонятных цифр и букв через двоеточие). Запишите его в botAPI.

Г) чтобы телеграм выводил подсказку, какие команды понимает бот – пошлите Отцу Всех Ботов команду /setcommands , он спросит указать для какого бота. Далее каждая строчка – описание каждой команды. Внимание – Enter жмите только в конце. Для перехода между строчками используйте комбинацию Shift-Enter. Ну или просто скопируйте и отправьте текст ниже:

hi – echo
health – get router’s health

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

Отправьте по очереди команду /hi и /health

 

Проверяем

Вернитесь к роутеру, запустите терминал и выполните

/system script run tg_getUpdates

Если всё сделали правильно – получите в телеграмме ответ на первую команду.

Запустите эту команду еще раз – получите ответ на вторую.

Если же ответа не было – смотрим сообщения, что выводятся при выполнении скрипта в терминал – как правило, там содержится указание на ошибку.

После этого можно активировать задачу Telegram в Scheduler.

И теперь ваш роутер умеет говорить %)

 

Групповой чат

Как вариант, создать групповой чат, в него добавить себя и бота (и других админов или ботов). Желательно чат сделать закрытым (таки ненужно всем знать, что умеет ваш бот).

Далее в конфиг добавить id чата в список trusted . Чтобы узнать id чата добавьте на время в чат уже знакомого нам бота @MyTelegramID_bot – он сразу же сообщит вам нужную информацию прямо в чат. Можно id чата сделать дефолтным – defaultChatID

 

Посылка сообщений в Telegram

С этим всё достаточно просто – заполняем конфиг (botID, chatID) и в скрипте, где нужно послать сообщение:

А) импортируем нужную функцию (один раз):

:local send [:parse [/system script get tg_sendMessage source]]

Б) и просто посылаем сообщение:

$send text=(“Hi, how are you?”)

Более сложный вариант – с указанием, куда послать и с форматированием – смотри в примерах скриптов tg_cmd_hi / tg_cmd_health .

 

Ложка дегтя

Без этого никак. К сожалению, команда /tool fetch всегда пишет сообщение в лог а-ля “fetch: file download”. И отключить их нельзя (может таки добавят возможность в будущих прошивках). В результате лог засоряется этими сообщениями… Если иногда отсылаете сообщения – не проблема. Но если стоит в Scheduler задача, которая каждые надцать секунд в лог пишет это сообщение, то уже не очень хорошо. Можно конечно поставить проверку getUpdates реже, но тогда придется дольше ждать, пока бот ответит %)

Выхода нет? Есть! ROS API и бот на внешнем сервере %) Но это уже совсем другая история….

 

PS: вопросы можно задавать также на форуме – https://forum.mikrotik.com/viewtopic.php?f=9&t=128394