Добрый день писал вам на почту.Virtue писал(а): ↑07 июл 2020, 02:58 • Кому интересно управление микротиками с помощью телеграмм, решил написать простенький мануальчик. Я и сам недавно только научился, протестировал, а теперь вот делюсь опытом, еще и телеграмм апиай официально разблокировали, так что вообще красота..
Управление сводится к отправке в группу телеграмм команды для определенного тика (в команде присутствует имя, необходимого для запуска скрипта), микрот в свою очередь по шедулеру выполняет чтение поступившей для него команды, и запускает заранее созданный скрипт.
Скриптов можно придумать сколько угодно на все случаи жизни, вот несколько примеров с описанием и содержимым:
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
pinglog_print - возвращает нам последние логи, команду отправлять с числом, сколько строк из лога мы хотим увидеть (в телеграмме есть ограничения по количеству символов в 1 сообщении, по этому очень много строк отправить не получится) у меня на разных микротах максимальное число строк тоже разное, это может быть и 40, и 80, но обычно нужно посмотреть только самые последние логи, по этому хватает и 10ти. Если лимит будет превышен, то в ответ просто ничего не придетКод: Выделить всё
# 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")
для активации отправляем например: /mikrotik log_print 10
log_printwol_my_pc - включает комп, который подключен напрямую к данному микротику и мак адрес которого прописан в скриптеКод: Выделить всё
# 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 logs :foreach i in=$LogsScan do={ :if ($counter >= ($LogsAll - $logs)) 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) } /tool fetch keep-result=no url=("https://api.telegram.org/".$botID."/sendMessage?chat_id=".$chatID."&text= $name: $logs poslednih logov: %0A$log1")
для активации отправляем: /mikrotik wol_my_pc
wol_my_pc (поменяйте название интерфейса и мак адрес на свои)Можете использовать все эти скрипты, либо какие-то из них, либо написать еще. Мануальчик подразумевает что вы уже создали и активировали бота, через которого будете отправлять и получать команды, а также добавили его в отдельно созданную группу, как это сделать можете посмотреть тут: https://1spla.ru/blog/telegram_bot_for_mikrotik/Код: Выделить всё
# script by Virtue /tool wol interface=bridge3-lan mac=00:11:22:22:11:00
Необходимо узнать токен бота и айди чата для использования скриптов.
Прошивка микротика 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")} } }
Проверяем, если все сделали правильно, должно работатьКод: Выделить всё
/system script run Telegram
примеры команд (где "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
Попросили написать сюда.
Возникли сложность с внедрением вашего скрипта.
Именно из группы в телеграмм при отправке приходит ошибка Неизвестная команда.
При этом если отправить самого микротик все приходит нормально.