Техподдержка: База знаний

Управление mikrotik из Telegram

ID статьи: 10
Последнее обновление: 29 июн, 2022

Принцип действия

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

  • Создается бот, у него есть уникальный 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

ID статьи: 10
Последнее обновление: 29 июн, 2022
Ревизия: 29
Просмотры: 0
Комментарии: 0