Telegram + MikroTik part 1. Включаем домашний пк сообщением в телеграме

Опишу реальный процесс настройки этой связки, работает у меня уже несколько месяцев без нареканий. Весь мануал будет разделен на три этапа – настройка бота в тг, написание скрипта в Микротике, добавление своих команд.

Перед тем, как приступать, необходимо активировать функцию Wake On Lane в биосе и системе. Под конкретную материнскую плату и систему всё индивидуально, но легко ищется.

Этап 1. Создание бота в telegram.

  1. Находим в глобальном поиске аккаунт с именем @botfather
  2. Запускаем бота кнопкой Start (в нижней части экрана)
  3. И пишем ему команду /newbot
  4. Бот задаст два вопроса
  • Имя создаваемого бота - можно задать любое, пусть будет SysAdminTg
  • Ник создаваемого бота - SysAdminTg_bot (должен обязательно оканчиваться на bot)

image

Если всё правильно сделано, бот выдаст вот такое сообщение. Нам из него надо скопировать токен бота, а именно строчку

1154187995:AAFUq2fa0DZBDz4gRcEnuW_Jqd7w5lyuCyI

Токен всё равно у всех отличается, и я палю его всю инструкцию, чтобы было понятно.

  1. Теперь надо найти нашего бота в глобальном поиске по имени SysAdminTg_bot, и запустить кнопкой Start.
  2. После запуска бота, нужно открыть браузер, и ввести эту строчку (вместо 11111111111 подставить свой скопированный токен из шага 4)

https://api.telegram.org/bot11111111111/getUpdates

Откроется вот такая страница:

image

На этой странице надо найти параметр вида «chat»:{«id»:000000000 (под нулями ваши числа, чат id я буду писать всегда 000000000, либо замазывать, потому что этот параметр точно палить нельзя)

Для проверки можно перейти по такой ссылке в браузере:

https://api.telegram.org/bot1154187995:AAFUq2fa0DZBDz4gRcEnuW_Jqd7w5lyuCyI/sendmessage?chat_id=000000000&text=testbot

image

  1. Итак, у нас есть вся информация для перехода ко второму этапу:
    Токен нашего бота: 1154187995:AAFUq2fa0DZBDz4gRcEnuW_Jqd7w5lyuCyI
    ID чата, куда он будет писать: 000000000

Этап 2. Написание скрипта в Микротике

  1. В ROS есть консольная утилита для копирования файлов через ftp или http/https, под называнием fetch. Она-то нам и нужна.

Открываем Winbox, слева New Terminal и вводим:

/tool fetch url=“https://api.telegram.org/bot1154187995:AAFUq2fa0DZBDz4gRcEnuW_Jqd7w5lyuCyI/sendmessage\?chat_id=000000000&text=testmicrotik” keep-result=no

Важно! Для MicroTik в ссылке необходим \ для экранирования знака " ? " в URL

image

И в бот нам падает сообщение, заданное в параметре chat_id=000000000&text=testmicrotik

image

  1. Теперь непосредственно к скриптам. Первым будет /check.
    В winbox – system – scripts - жмём на плюсик и вписываем свои параметры.
    По сути этот скрипт повторяет первый шаг. Но я его сделал для себя, чтобы при необходимости чекать буквально одной командой в тг, а есть ли у меня вообще инет дома.
    Тело скрипта, и скрин, чтобы было понятно что куда.
    (не забываем вписывать свои токен бота, id чата (этап 1 пункт 8))

/tool fetch url=“https://api.telegram.org/bot1154187995:AAFUq2fa0DZBDz4gRcEnuW_Jqd7w5lyuCyI/sendmessage\?chat_id=000000000&text=check ok” keep-result=no

image

  1. Второй - /wolpc.
    Тело скрипта:
    (не забываем вписывать свои токен бота, id чата (этап 1 пункт 8))

    /tool wol interface=ether3 mac=00:00:00:00:00:00
    /tool fetch url=“https://api.telegram.org/bot1154187995:AAFUq2fa0DZBDz4gRcEnuW_Jqd7w5lyuCyI/sendmessage\?chat_id=000000000&text=wol ok” keep-result=no

Важно!
Имя интерфейса в микротике, к которому подключен пк, может отличаться, у меня он называется ether3.

Вместо нулей надо вставить mac-адрес своего устройства, как его можно найти, на каждой конкретной системе, за несколько секунд ответит гугл))

После отправки на пк «магического пакета» скрипт так же сообщит нам, что он отработал. Кстати, можно уже проверить работу, нажав Run Script.

image

  1. Теперь самое интересное – задание, которое, если по-простому, будет постоянно опрашивать нашего бота на наличие новых команд. Скрипт актуален на 05.2020.
    Даём имя, и вводим тело скрипта:
    (не забываем вписывать свои токен бота, id чата (этап 1 пункт 8))

:delay 15
:global mtIdentity [/system identity get name];
:global “botID1154187995:AAFUq2fa0DZBDz4gRcEnuW_Jqd7w5lyuCyI" ;
:global myChatID “000000000” ;
:local chatId 0;
:local messageId 0;

:local parse do={
:local startLoc ([:find $content $variable -1] + [:len $variable] + 2);
:local commaLoc ([:find $content “,” $startLoc] - 1 + 1);
:local braceLoc ([:find $content “}” $startLoc] - 1 + 1);
:local endLoc $commaLoc;
:local startSymbol [:pick $content $startLoc]
:if ($braceLoc != 0 and ($commaLoc = 0 or $braceLoc < $commaLoc)) do={
:set endLoc $braceLoc;
};
:if ($startSymbol = “{”) do={
:set endLoc ($braceLoc + 1);
};
:if ($quotas = true) do={
:set startLoc ($startLoc + 1);
:set endLoc ($endLoc - 1);
}
:if ($endLoc < $startLoc) do={
:set endLoc ($startLoc + 1);
};
:local message [:pick $content $startLoc $endLoc]
#:log info $message;
:return $message;
}

:while ( true ) do={
:do {
#:log info “https://api.telegram.org/$botID/getUpdates\?offset=$messageId&limit=1&allowed_updates=message&timeout=60”;
:tool fetch url=(“https://api.telegram.org/$botID/getUpdates\?offset=$messageId&limit=1&allowed_updates=message&timeout=60”) dst-path=“getUpdates”;
:local content [/file get [/file find name=getUpdates] contents] ;
#:log info $content;
:if ([:len $content] > 30) do={
:set messageId ([$parse content=$content variable=“update_id”] + 1)
:local message [$parse content=$content variable=“text” quotas=true]
:local chat [$parse content=$content variable=“chat”]
:local chatId [$parse content=$chat variable=“id”]
:if (($chatId = $myChatID) and ([/system script find name=$message] != “”)) do={
:system script run $message;
} else={
:tool fetch url=(“https://api.telegram.org/$botID/sendmessage\?chat_id=$chatId&text=$mtIdentity: Unknown command: $message”) keep-result=no
}
}
} on-error={}
};

Должно получиться примерно такое:

  1. Осталось вписать задание, созданное выше, в шедулер, который будет запускать скрипт при загрузке системы.
    System – scheduler – на плюсик - создаём новое задание. Даём имя (я дал SysAdminTg), а в большое поле внизу пишем:

/system script run SysAdminTg

(SysAdminTg это имя скрипта, которое мы дали выше, в пункте 4)

И обязательно параметр Start Time поставить startup.

image

Сохраняем, закрываем.

Этап 3. Добавление своих команд.

  1. Дело осталось за малым. Переходим в телеграмме в @BotFather, где мы создавали бота, и пишем ему команду /setcommands
  2. Он спросит – какому боту мы хотим добавить команды, выбираем свой.
  3. И отправляем ему следующее.
    wolpc – wake up pc
    check – check status

image

  1. Переходим в бот, и видим, что команды добавились.

image

  1. Проверяем работоспособность))

image

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

Осилит путь идущий! Отдаю все свои должные.

Вторая часть:

6 Likes

Это пять! Автор, пиши ещё!

2 Likes

Отличная статья. Спасибо!

Было бы неплохо заменить в скрипте и на ". А так же поставить " не перед botID, а после. Но это уже украшательства…

Так же команды, посылаемые боту, почти всегда выполняются 2 раза. Это можно как-то побороть?

Спасибо)
Не задвоился скрипт? Шедулер правильно настроен?

1 Like

Похоже, что каким-то образом были запущены 2 копии скрипта… После перезапуска всё наладилось. Благодарю!

1 Like

Для отсылки команд с канала имя скрипта должно быть вида /check@имябота, т.к. телеграмм отсылает именно так.
На досуге попробую докрутить переменные до имени компа из DHCP таблицы, всегда “зажимаю” всех лизов.
Большое спасибо, заготовка отличная, жду вторую часть с нетерпением.

Этап 2 пункт 2 и пункт 3 - именно поэтому они и называются со слешем)
Стоит упомянуть это в статье?

Да, кстати, а если на этом интерфейсе висит несколько компов, или вообще свитч? :thinking:
Было бы очень интересно посмотреть на Вашу реализацию.

Magic packet идет через любой свит, поэтому без разницы, можно вешать на бридж.
Сквозь L2 туннели тоже.

Спасибо за статью!
Подскажите какой командой сделать перезагрузку роутера.
Если сделать скрипт с командой /system reboot, то роутер уходит в циклическую перезагрузку.

Привет, на втором этапе не получется в терминале ввести первую команду! Пробовал и с разделителем и без () Что не так подскажите? Capture|690x27

Ладно, я разобрался… Ваши фигурные ковычки “ не проходят, нужны нормальные "…

Этот скрипт не хочет работать, проверьте, плиз, что не так?

На будущее - всегда проверяй кавычки в скриптах))

FYI @tohtegende

Проверьте плиз, что не так, я ковычки проверил, не вижу проблемы…

Админ ну помоги, пропустил пока этот шаг с длинным скриптом выше, он сохранен, но не знаю, работает он или нет, при нажатии на кнопку Run Script ничего не просходит (может и не должно пока комп включен?). До этого шага все сделал и все работает, бот живой. После этого скрипта добавил его в Scheduler, добавил команды в бот check и wolpc, они приняты BotFather, но в моем боте они не появились как у вас на скрине, при отправке команды /start бот не выдет спикок команд… При отправе в бот команд /wolpc и /check от бота тишина, нет ответа… Подскажите куда копать…

К автору обратись, на сколько знаю, кто внимательно читал статью у тех все получалось, попробуй пересмотреть внимательнее.

А для тестирования телеграм апи, попробуй в ручную сначала в него что-нибудь отправить

Да я уже все проверил по 100 раз, с утра сижу, затык в этом крайнем скрипте, который слушает команды из телеграма, и еще в самомо боте, почему то он не реагирует на команды, вообще тишина… У автора в скрипте не исправлены до сих пор кавычки… и теперь думай, где еще не исправлено и почему не работает скрипт… А как к автору обратиться, все обыскал, не вижу как написать ему…

Так, админ, предлагаю автора в топку… Я весь день убил на то, чтобы раздуплить крайний скрипт автора… Он весь в ошибках из-за неправильных кавычек… Зачем такой скрипт выставлен на сайте, не понимаю… Выкладываю рабочий скрипт, будет желание, замените в теме…

:delay 15
:global mtIdentity [/system identity get name];
:global botID "botXXXXX" ;
:global myChatID "XXXXXXXXX" ;
:local chatId 0;
:local messageId 0;


:local parse do={
  :local startLoc ([:find $content $variable -1] + [:len $variable] + 2);
  :local commaLoc ([:find $content "," $startLoc] - 1 + 1);
  :local braceLoc ([:find $content "}" $startLoc] - 1 + 1);
  :local endLoc $commaLoc;
  :local startSymbol [:pick $content $startLoc]
  :if ($braceLoc != 0 and ($commaLoc = 0 or $braceLoc < $commaLoc)) do={
    :set endLoc $braceLoc;
  };
  :if ($startSymbol = "{") do={
    :set endLoc ($braceLoc + 1);
  };
  :if ($quotas = true) do={
    :set startLoc ($startLoc + 1);
    :set endLoc ($endLoc - 1);
  }
  :if ($endLoc < $startLoc) do={
    :set endLoc ($startLoc + 1);
  };
  :local message [:pick $content $startLoc $endLoc]
  #:log info $message;
  :return $message;
}


:while ( true ) do={
  :do {
    #:log info "https://api.telegram.org/$botID/getUpdates\?offset=$messageId&limit=1&allowed_updates=message&timeout=60";
    :tool fetch url=("https://api.telegram.org/$botID/getUpdates\?offset=$messageId&limit=1&allowed_updates=message&timeout=60") dst-path="getUpdates";
    :local content [/file get [/file find name=getUpdates] contents] ;
    #:log info $content;
    :if ([:len $content] > 30) do={
      :set messageId ([$parse content=$content variable="update_id"] + 1)
      :local message [$parse content=$content variable="text" quotas=true]
      :local chat [$parse content=$content variable="chat"]
      :local chatId [$parse content=$chat variable="id"]      
      
      :if (($chatId = $myChatID) and ([/system script find name=$message] != "")) do={
        :system script run $message;
      } else={
        :tool fetch url=("https://api.telegram.org/$botID/sendmessage\?chat_id=$chatId&text=$mtIdentity: Unknown command: $message") keep-result=no
      }
    }
  } on-error={}
};
1 Like

так, скрипт этот я поборол, он работает. Осталась крайняя проблема, команда /check в боте работает, выдает ответ, а вот команда /wolpc не работает, бот отвечает ошибкой MikroTik: Unknown command: /wolpc какие мысли по этой ошибке? Я так понимаю, мне самому придется все решить до конца, помощи ни от кого нет…

1 Like