Принцип действия
Сегодня телеграм предоставляет возможность создавать ботов. Создадим такого и научим управлять его микротиком.
- Создается бот, у него есть уникальный id с помощью которого к боту можно обращаться.
- Когда ты пишешь кому-то в телеграм, то принимающая сторона понимает что ты это ты по служебному полю chat, id которого так же уникален. Это нам поможет научить бота слушаться только тех кому разрешено командовать.
- На микротике создаются скрипты, которые будут запускаться из телеграм. Например, создадим скрипты с именами «disable» и «enable», которые будут выключать и включать l2tp сервер.
- На микротик заливается скрипт, который запускается при старте системы и повторяется каждые 10 или 30 сек. Он проверяет новые сообщения у бота, в которых ищет команды. Если в чат пришел текст, который содержит имя исполняемого скрипта (например текст «disable»), то внутри микротика выполнится этот одноименный скрипт.
Создание бота, сбор необходимой информации
Официальная документация по созданию ботов.
1. Ищем в телеге бота @BotFather, Пишем ему /start и получаем список его команд.
2. Создаем нового бота командой /newbot, имя должно оканчиваться на «bot». Если имя имеет правильное окончание и не занято, то получаем сообщение с токеном нового бота. Выглядит примерно так 5310275458:AFWSZIqo2henSpN02VO-jJSW9jCgDF1MDdw
3. Получаем id моего с ботом чата. Для этого пишем ему что-нибудь и открываем в браузере ссылку https://api.telegram.org/bot5310275458:AFWSZIqo2henSpN02VO-jJSW9jCgDF1MDdw/getUpdates. Там увидим сообщение полученное ботом и все служебные поля.
4. Добавляем нашему боту меню командой /setcommands.
Результат выглядит вот так. Команды можно писать от руки или пользоваться кнопкой.
Пишем скрипты управления L2TP сервером
Вот таким образом создадим скрипты на микротике.
ВАЖНО! Имя скрипта должно соответствовать буква-в-букву той команде, которую мы задали в меню бота. Если мы делали команду disable, то и имя скрипта должно быть такое же.
Скрипт «disable»
:global botID;
:global myChatID;
:local content [/interface l2tp-server server set enabled=no];
:tool fetch url=("https://api.telegram.org/".$botID."/sendmessage\?chat_id=".$myChatID."&text=Link disabled.") keep-result=no ;
Аналогичным образом создаем скрипт для запуска L2TP сервера, называем его «enable».
:global botID;
:global myChatID;
:local content [/interface l2tp-server server set enabled=yes];
:tool fetch url=("https://api.telegram.org/".$botID."/sendmessage\?chat_id=".$myChatID."&text=Link enabled.") keep-result=no ;
Пишем скрипт опроса бота
Теперь создаем 2 служебных скрипта. Первый загонит в оперативку микротика глобальные переменные. Второй будет опрашивать бота и реагировать на команды.
Обращаю внимание, что права на эти 2 служебных скрипта должны быть полные.
Скрипт «telegram-vars»
botID — токен бота
myChatID — chat id, можно через точку с запятой указать несколько id, если ботом нужно управлять с нескольких аккаунтов телеграма.
#Schedule run at startup.
#Telegram API keys for use in another scripts.
:global botID "bot5310275458:AFWSZIqo2henSpN02VO-jJSW9jCgDF1MDdw" ;
:global myChatID "12332112;98778998" ;
Скрипт «telegram-main»
#Schedule run every ~30sec.
:global botID;
:global myChatID;
: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 + 2);
:set endLoc ($endLoc - 1);
}
:if ($endLoc < $startLoc) do={
:set endLoc ($startLoc + 1);
};
:local value [:pick $content $startLoc $endLoc]
:log debug message="Telegram: parsed $variable : $value";
:return $value;
}
:local content [/tool fetch url=("https://api.telegram.org/".$botID."/getUpdates?limit=1&allowed_updates=message") as-value output=user];
:set content ($content ->"data");
:if ([:len $content] > 23 ) do={
:local updateId [$parse content=$content variable="update_id"]
:local chat [$parse content=$content variable="chat"]
:local chatId [$parse content=$chat variable="id"]
:if ( :typeof [:find "$myChatID" "$chatId"] >= 0 ) do={
:local message [$parse content=$content variable="text" quotas=true] ;
:log warn message="Command $message received" ;
:if ([/system script find name=$message] != "") do={
:system script run $message ;
} else={
:tool fetch url=("https://api.telegram.org/".$botID."/sendmessage\?chat_id=".$chatId."&text=Wrong command.") keep-result=no ;
};
} else={
:tool fetch url=("https://api.telegram.org/".$botID."/sendmessage\?chat_id=".$chatId."&text=I can't talk with you.") keep-result=no ;
};
:set updateId ($updateId +1) ;
:tool fetch url=("https://api.telegram.org/".$botID."/getUpdates\?offset=$updateId") keep-result=no ;
};
За помощь с этими скриптами спасибо https://gist.github.com/l0ser140
Настраиваем автозапуск скриптов
telegram-vars-startup — выполняется единоразово при загрузке с задержкой 10 сек.
telegram-main-startup — выполняется при загрузке + запускается каждые 10 секунд.
Микротик не может обратиться к имени скрипта, только к его порядковому номеру. Чтобы узнать порядковый номер скрипта нужно открыть терминал и набрать команду /system script print