- PVSM.RU - https://www.pvsm.ru -
На данную реализацию меня подтолкнул Александр Корюкин GeXoGeN [1] своей публикацией habrahabr.ru/post/313794 [2] «Удалённое включение компьютера бесплатно, без SMS и без облаков, с помощью Mikrotik».
И комментарий в одной из групп ВК Кирилла Казакова
Да уж, совсем не секьюрно. Я бы лучше написал телеграм бота, который принимает только с моего аккаунта команды на включение.
Я решил написать такого бота.
Итак, первое, что нужно сделать – это создать бота в telegram.
Потом отвечаем на 2 несложных вопроса:
В ответ получим токен нашего бота, в моём случае это:
Use this token to access the HTTP API: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
Затем, нужно найти нашего бота в поиске по имени @MikrotikROuter_bot и нажать на кнопку Start.
После этого нужно открыть браузер и ввести следующую строку:
https://api.telegram.org/botXXXXXXXXXXXXXXXXXX/getUpdates
Где XXXXXXXXXXXXXXXXXX – токен вашего бота.
Откроется страница примерно следующего вида:
Находим на ней следующий текст:
«chat»:{«id»:631290,
Итак, у нас есть вся необходимая информация для написания скриптов для Mikrotik'а, а именно:
Токен бота: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
ID чата, куда он должен писать: 631290
Для проверки можем зайти через браузер:
https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=<b>test</b>
Должны получить результат:
Для нашего удобства, сразу добавим команды для бота:
Находим аккаунт с именем @botfather
После чего пишем ему команду /setcommands
Пишем:
@MikrotikROuter_bot
Добавляем команды:
Теперь если набрать в чате "/", то должны получить:
Теперь переходим к MikroTik.
В RouterOS есть консольная утилита для копирования файлов через ftp или http/https, утилита называется fetch, именно ей мы и будем пользоваться.
Открываем terminal и вводим:
/tool fetch url="https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test " keep-result=no
Обратите внимание в MikroTik необходим "" для экранирования знака "?" в URL.
Должны получить результат:
Теперь переходим к сриптам:
system script add name="helloworld" policy=read source={/tool fetch url="https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=Hello,world! " keep-result=no}
system script add name="itsworking" policy=read source={/tool fetch url="https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=Test OK, it's Working " keep-result=no}
system script add name="wolmypc" policy=read source={//tool wol mac=XX:XX:XX:XX:XX:XX interface=ifname}
Не забываем указать правильный mac и имя интерфейс.
Сейчас немного поясню что они делаю:
Скрипт «helloworld» отправляет сообщение: " Hello,world!" в наш чат с ботом.
Скрипт «itsworking» отправляет сообщение: " Test OK, it's Working !" в наш чат с ботом.
Данные скрипты для демонстрации работы.
Скрипт «wolmypc» я добавил, как одну из возможных реализации.
По сути можно запускать абсолютно любой скрипт.
Создаем задание:
/system scheduler add interval=30s name=Telegram on-event=":global botID "bot265373548:AAFyGCqJCei9m
vcxvXOWBfnjSt1p3sX1XH4"r
n:tool fetch url=("https://api.telegram.org/".$botID."/getUpdates")
r
n:global content [/file get [/file find name=getUpdates] contents] ;r
n:global startLoc 0;r
n:do {r
n:set startLoc [:find $content "update_id" $lastEnd ] ;r
n:set startLoc ( $startLoc + 11 ) ;r
n:local endLoc [:find $content "," $startLoc] ;r
n:local messageId ([:pick $content $startLoc $endLoc] + (1));r
n:put [$messageId]r
n:set startLoc [:find $content "text" $lastEnd ] ;r
n:set startLoc ( $startLoc + 7 ) ;r
n:local endLoc [:find $content "," ($startLoc)] ;r
n:set endLoc ( $endLoc - 1 ) ;r
n:local message [:pick $content ($startLoc + 2) $endLoc] ;r
n:put [$message]r
n:system script run $messager
n:tool fetch url=("https://api.telegram.org/".$botID."/getUpdates\?
offset=$messageId") keep-result=nor
n}r
n" policy=
ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon
start-date=nov/01/2016 start-time=00:00:00
Скачиваем наши сообщения «getUpdates» каждые 30 сек., затем парсим, чтобы узнать update_id (номер сообщения) и text (наши команды). По умолчанию getUpdates выводит от 1 до 100 сообщений, для удобства после прочтения команды, сообщение удаляем. в Telegram api сказано, чтобы прочесть сообщение необходимо номер сообщения + 1
/getUpdates?offset=update_id + 1
Все проверено на Mikrotik rb915 RouterOS 6.37.1
Если отправить сразу много команд, они все по очереди будут выполняться с интервалом 30 сек.
P.S. Огромное спасибо Кирилу Казакову за идею и Блажееву Александру за помощь со скриптами.
habrahabr.ru/post/313794 [4]
1spla.ru/index.php/blog/telegram_bot_for_mikrotik [5]
core.telegram.org/bots/api [6]
wiki.mikrotik.com/wiki/Manual [7]:Scripting
Автор: dimonw
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/sistemnoe-administrirovanie/204879
Ссылки в тексте:
[1] GeXoGeN: https://habrahabr.ru/users/gexogen/
[2] habrahabr.ru/post/313794: https://habrahabr.ru/post/313794/
[3] api.telegram.org: https://api.telegram.org/
[4] habrahabr.ru/post/313794: https://habrahabr.ru/post/313794
[5] 1spla.ru/index.php/blog/telegram_bot_for_mikrotik: https://1spla.ru/index.php/blog/telegram_bot_for_mikrotik/
[6] core.telegram.org/bots/api: https://core.telegram.org/bots/api/
[7] wiki.mikrotik.com/wiki/Manual: http://wiki.mikrotik.com/wiki/Manual
[8] Источник: https://habrahabr.ru/post/314108/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.