• Кому интересно управление микротиками с помощью телеграмм, решил написать простенький мануальчик. Я и сам недавно только научился, протестировал, а теперь вот делюсь опытом, еще и телеграмм апиай официально разблокировали, так что вообще красота..
Управление сводится к отправке в группу телеграмм команды для определенного тика (в команде присутствует имя, необходимого для запуска скрипта), микрот в свою очередь по шедулеру выполняет чтение поступившей для него команды, и запускает заранее созданный скрипт.
Скриптов можно придумать сколько угодно на все случаи жизни, вот несколько примеров с описанием и содержимым:
telega_test - скрипт, который просто присылает в ответ сообщение и тем самым мы видим что микрот работает и на нем есть интернет
для активации отправляем: /mikrotik telega_test
где "mikrotik" имя роутера по Identity
telega_test
Код: Выделить всё
# script by Virtue
:local botID "bot1000099999:AAAAx0xXxxXXXXx_XXX0xXxX0XxxXxxXxxx"
:local chatID "-990009999"
:local name [/system identity get name]
:local a [/sys clock get date]
:local b [/sys clock get time]
/tool fetch keep-result=no url=("https://api.telegram.org/".$botID."/sendmessage?chat_id=".$chatID."&text= $a $b $name test")
ping - скрипт, пингующий заданный узел и возвращающий нам количество полученных ответов (можно указывать как айпи, так и хост адрес), 5 запросов-ответов считаю достаточным
для активации отправляем например: /mikrotik ping ya.ru
ping
Код: Выделить всё
# script by Virtue
:local botID "bot1000099999:AAAAx0xXxxXXXXx_XXX0xXxX0XxxXxxXxxx"
:local chatID "-990009999"
:local name [/system identity get name]
:global pingaddr
:local pingresult ("ping"." ".$pingaddr." ".[ping address=$pingaddr count=5]."/5")
:tool fetch keep-result=no url=("https://api.telegram.org/".$botID."/sendmessage?chat_id=".$chatID."&text=$name: $pingresult")
log_print - присылает логи, команду отправлять с числом, которое указывает, сколько строк из лога мы хотим увидеть (в телеграмме есть ограничения по количеству символов в 1 сообщении, по этому очень много строк отправить не получится) у меня на разных микротах максимальное число строк тоже разное, это может быть и 40, и 80, но обычно нужно посмотреть только самые последние логи, по этому хватает и 10ти. Если лимит будет превышен, то в ответ просто ничего не придет
для активации отправляем например: /mikrotik log_print 10
если нужно получить например 20, пропустив при этом 50 последних строк лога, команда будет: /mikrotik log_print 20 50
log_print
Код: Выделить всё
# script by Virtue
:local botID "bot1000099999:AAAAx0xXxxXXXXx_XXX0xXxX0XxxXxxXxxx"
:local chatID "-990009999"
:local name [/system identity get name]
:local LogsAll [/log print count-only]
:local LogsScan [/log find]
:local counter 0
:local log1
:global otstup
:global logs
:if ($otstup ~ "[a-z|A-Z|_-|+/|*?]") do={:set otstup 0}
:foreach i in=$LogsScan do={
:if (($counter >= ($LogsAll - $otstup - $logs)) and ($counter < ($LogsAll - $otstup))) do={
:local Log1Time [/log get $i time]
:local Log1Message [/log get $i message]
:if ([/log get $i message] ~ "[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]") do={
:foreach k in=[/ip dhcp-server lease find] do={
:local mac [/ip dhcp-server lease get $k value-name=mac-address]
:if ([/log get $i message] ~ "$mac") do={
:set Log1Message ($Log1Message . " / " . [/ip dhcp-server lease get $k value-name=comment])
}
}
}
:set log1 ($log1."|".$Log1Time." ".$Log1Message."%0A")
}
:set counter ($counter + 1)
}
:set otstup 0
/tool fetch keep-result=no url=("https://api.telegram.org/".$botID."/sendMessage?chat_id=".$chatID."&text= $name: $logs zapisey logov: %0A$log1")
wol_my_pc - включает комп, который подключен напрямую к данному микротику и мак адрес которого прописан в скрипте
для активации отправляем: /mikrotik wol_my_pc
wol_my_pc (поменяйте название интерфейса и мак адрес на свои)
Код: Выделить всё
# script by Virtue
/tool wol interface=bridge3-lan mac=00:11:22:22:11:00
telega_clean - скрипт очистки глобальной переменной content, часто помогает при отказе работы главного скрипта, в очищенном виде переменная content содержит {"ok":true,"result":[]}
данный скрипт запускается вручную, либо по шедулеру (например раз в час)
Код: Выделить всё
# script by Virtue
:global content
:if ([:len $content] > 23 ) do={
:local botID "bot1000099999:AAAAx0xXxxXXXXx_XXX0xXxX0XxxXxxXxxx"
:set content [/tool fetch url=("https://api.telegram.org/".$botID."/getUpdates") as-value output=user]
:set content ($content ->"data")
while ([:len $content] > 23 ) do={
:local startLoc [:find $content "update_id" -1 ]
:set startLoc ( $startLoc + 11 )
:local endLoc [:find $content "," $startLoc]
:local messageId ([:pick $content $startLoc $endLoc] + (1))
:tool fetch keep-result=no url=("https://api.telegram.org/".$botID."/getUpdates?offset=$messageId")
:delay 3
}
}
Можете использовать все эти скрипты, либо какие-то из них, либо написать еще. Мануальчик подразумевает что вы уже создали и активировали бота, через которого будете отправлять и получать команды, а также добавили его в отдельно созданную группу, как это сделать можете посмотреть тут:
https://1spla.ru/blog/telegram_bot_for_mikrotik/
Необходимо узнать токен бота и айди чата для использования скриптов.
Прошивка микротика
v6.46.3 или выше. Если у вас ниже, то гарантии нет что будет работать.
Для корректной работы не одного, а нескольких тиков в одной группе телеграмм, перед каждой командой пишется название тика (Identity) которому адресована команда либо "all", чтобы команда выполнилась на всех тиках. Чтобы не держать в голове все имена и команды, можно добавить шаблоны в свою группу телеграмм через бота BotFather, для этого пишем ему (БотФазеру) команду:
/setcommands
выбираете своего бота и пишите список команд по шаблону:
tik1_wol_my_pc - tik1 my pc on
tik1_telega_test - proverka svyazi tik1
tik1_log_print_10 - last logs
tik1_ping - ping addr or ip
tik2_log_print_10 - last logs
tik2_wol_my_pc - tik2 my pc on
tik3_log_print_10 - last logs
tik4_log_print_10 - last logs
all_log_print_10 - last logs
Буквы обязательно все латинские и маленькие, а также левая часть (сама команда) не содержит пробелов.
Теперь, нажав на кнопку "/" в своём чате с ботом, всегда можно посмотреть, какие команды (скрипты) и на каких устройствах нам доступны.
Бота создали, группу создали, добавили туда бота, токен бота записали, айди чата группы записали, скрипты подготовили, теперь создаем скрипт, например с именем -
Telegram
это будет основной скрипт для чтения телеграмм на наличие новых команд
Запихиваем в него содержимое (не забывая поменять айдишки в первых двух строках на свои):
Telegram
Код: Выделить всё
# script modified by Virtue
:local botID "bot1000099999:AAAAx0xXxxXXXXx_XXX0xXxX0XxxXxxXxxx"
:local chatID "-990009999"
:global content [/tool fetch url=("https://api.telegram.org/".$botID."/getUpdates") as-value output=user]
:set content ($content ->"data")
:if ([:len $content] > 23 ) do={
:local startLoc [:find $content "update_id" -1 ]
:set startLoc ( $startLoc + 11 )
:local endLoc [:find $content "," $startLoc]
:local messageId ([:pick $content $startLoc $endLoc] + (1))
:set startLoc [:find $content "text" -1 ]
:set startLoc ( $startLoc + 7 )
:set endLoc [:find $content "," ($startLoc)]
:set endLoc ( $endLoc - 1 )
:local message [:pick $content ($startLoc + 1) $endLoc]
:set startLoc [:find $content "chat" -1 ]
:set startLoc ( $startLoc + 12 )
:set endLoc [:find $content "," $startLoc]
:local chatID2 ([:pick $content $startLoc $endLoc])
:if ($chatID2 = $chatID) do={
:if (($message ~ [/system identity get name]) or ($message ~ "all")) do={
:local neponimat true
:foreach i in=[/system script find name~""] do={
if ($message ~ [/system script get $i name]) do={
:set neponimat false
:local ScriptName [/system script get $i name]
:if ($ScriptName = "log_print") do={
:local startLoc1 ([:find $message "log_print"] +10)
:local endLoc1 ([:find $message "log_print"] +12)
:global logs
:set logs [:pick $message $startLoc1 $endLoc1]
}
if ($ScriptName = "ping") do={
:local startLoc2 ([:find $message "ping"] +5)
:local endLoc2 ([:find $message "ping"] +20)
:global pingaddr
:set pingaddr [:pick $message $startLoc2 $endLoc2]
}
:log info message="Script $ScriptName zapus4en"
/system script run $ScriptName
if ($message ~ "all") do={
:delay 55
}
:tool fetch keep-result=no url=("https://api.telegram.org/".$botID."/getUpdates?offset=$messageId")
}
}
if ($neponimat = true) do={
:tool fetch keep-result=no url=("https://api.telegram.org/".$botID."/getUpdates?offset=$messageId")
:delay 3
:local name [/system identity get name]
:tool fetch keep-result=no url=("https://api.telegram.org/".$botID."/sendmessage?chat_id=".$chatID."&text=$name: Moya tvoya neponimat'")
}
} else={:delay 55; :tool fetch keep-result=no url=("https://api.telegram.org/".$botID."/getUpdates?offset=$messageId")}
}
}
Далее создаем шедулер с интервалом запуска например раз в минуту как у меня и содержимым:
Проверяем, если все сделали правильно, должно работать
примеры команд (где "mikrotik" имя роутера по Identity):
/mikrotik telega_test
/mikrotik ping mail.ru
/mikrotik log_print 15
/mikrotik wol_my_pc
/all ping 8.8.8.8
/all log_print 20