На днях сдружил свои железки с телеграм, научился запускать скрипты и получать вывод..
Подскажите, есть ли возможность отправлять именно команды (как в терминале) и получать ответ например в переменную? ну а дальше думаю смогу уже прикрутить и к телеге
управление с телеги
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
- hulitolku
- Сообщения: 34
- Зарегистрирован: 07 окт 2018, 11:59
Я реализовал управление с андройд-смарфтона виджетами termux. Но работает только в пределах локальной сети, так как нет белого айпи.
- Virtue
- Сообщения: 148
- Зарегистрирован: 07 мар 2014, 10:17
• Кому интересно управление микротиками с помощью телеграмм, решил написать простенький мануальчик. Я и сам недавно только научился, протестировал, а теперь вот делюсь опытом, еще и телеграмм апиай официально разблокировали, так что вообще красота..
Управление сводится к отправке в группу телеграмм команды для определенного тика (в команде присутствует имя, необходимого для запуска скрипта), микрот в свою очередь по шедулеру выполняет чтение поступившей для него команды, и запускает заранее созданный скрипт.
Скриптов можно придумать сколько угодно на все случаи жизни, вот несколько примеров с описанием и содержимым:
telega_test - скрипт, который просто присылает в ответ сообщение и тем самым мы видим что микрот работает и на нем есть интернет
для активации отправляем: /mikrotik telega_test
где "mikrotik" имя роутера по Identity
telega_test
ping - скрипт, пингующий заданный узел и возвращающий нам количество полученных ответов (можно указывать как айпи, так и хост адрес), 5 запросов-ответов считаю достаточным
для активации отправляем например: /mikrotik ping ya.ru
ping
log_print - присылает логи, команду отправлять с числом, которое указывает, сколько строк из лога мы хотим увидеть (в телеграмме есть ограничения по количеству символов в 1 сообщении, по этому очень много строк отправить не получится) у меня на разных микротах максимальное число строк тоже разное, это может быть и 40, и 80, но обычно нужно посмотреть только самые последние логи, по этому хватает и 10ти. Если лимит будет превышен, то в ответ просто ничего не придет
для активации отправляем например: /mikrotik log_print 10
если нужно получить например 20, пропустив при этом 50 последних строк лога, команда будет: /mikrotik log_print 20 50
log_print
wol_my_pc - включает комп, который подключен напрямую к данному микротику и мак адрес которого прописан в скрипте
для активации отправляем: /mikrotik wol_my_pc
wol_my_pc (поменяйте название интерфейса и мак адрес на свои)
telega_clean - скрипт очистки глобальной переменной content, часто помогает при отказе работы главного скрипта, в очищенном виде переменная content содержит {"ok":true,"result":[]}
данный скрипт запускается вручную, либо по шедулеру (например раз в час)
Можете использовать все эти скрипты, либо какие-то из них, либо написать еще. Мануальчик подразумевает что вы уже создали и активировали бота, через которого будете отправлять и получать команды, а также добавили его в отдельно созданную группу, как это сделать можете посмотреть тут: https://1spla.ru/blog/telegram_bot_for_mikrotik/
Необходимо узнать токен бота и айди чата для использования скриптов.
Прошивка микротика v6.46.3 или выше. Если у вас ниже, то гарантии нет что будет работать.
Для корректной работы не одного, а нескольких тиков в одной группе телеграмм, перед каждой командой пишется название тика (Identity) которому адресована команда либо "all", чтобы команда выполнилась на всех тиках. Чтобы не держать в голове все имена и команды, можно добавить шаблоны в свою группу телеграмм через бота BotFather, для этого пишем ему (БотФазеру) команду:
Теперь, нажав на кнопку "/" в своём чате с ботом, всегда можно посмотреть, какие команды (скрипты) и на каких устройствах нам доступны.
Бота создали, группу создали, добавили туда бота, токен бота записали, айди чата группы записали, скрипты подготовили, теперь создаем скрипт, например с именем - Telegram
это будет основной скрипт для чтения телеграмм на наличие новых команд
Запихиваем в него содержимое (не забывая поменять айдишки в первых двух строках на свои):
Telegram
Далее создаем шедулер с интервалом запуска например раз в минуту как у меня и содержимым:
Проверяем, если все сделали правильно, должно работать
примеры команд (где "mikrotik" имя роутера по Identity):
Управление сводится к отправке в группу телеграмм команды для определенного тика (в команде присутствует имя, необходимого для запуска скрипта), микрот в свою очередь по шедулеру выполняет чтение поступившей для него команды, и запускает заранее созданный скрипт.
Скриптов можно придумать сколько угодно на все случаи жизни, вот несколько примеров с описанием и содержимым:
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")
для активации отправляем например: /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")
для активации отправляем: /mikrotik wol_my_pc
wol_my_pc (поменяйте название интерфейса и мак адрес на свои)
Код: Выделить всё
# script by Virtue
/tool wol interface=bridge3-lan mac=00:11:22:22:11:00
данный скрипт запускается вручную, либо по шедулеру (например раз в час)
Код: Выделить всё
# 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
}
}
Необходимо узнать токен бота и айди чата для использования скриптов.
Прошивка микротика 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
Последний раз редактировалось Virtue 26 окт 2021, 02:27, всего редактировалось 19 раз.
-
- Сообщения: 1657
- Зарегистрирован: 15 сен 2017, 09:03
: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
Не понял, простите, этих строк, выделенных жирным шрифтом ... Это что же там идет проверка на имена команд ? То есть, главный Ваш скрипт надо каждый раз дополнять - имя каждого выполняемого скрипта туда вписывать с проверками на условие ? Или почему такая избирательность для запуска этих скриптов ? А остальные, получается просто запускаются и всё ?
: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
Не понял, простите, этих строк, выделенных жирным шрифтом ... Это что же там идет проверка на имена команд ? То есть, главный Ваш скрипт надо каждый раз дополнять - имя каждого выполняемого скрипта туда вписывать с проверками на условие ? Или почему такая избирательность для запуска этих скриптов ? А остальные, получается просто запускаются и всё ?
фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
viewtopic.php?f=14&t=13947
- Virtue
- Сообщения: 148
- Зарегистрирован: 07 мар 2014, 10:17
для данных скриптов прописаны дополнительные строки в основном скрипте, они нужны для получения дополнительных параметров (для пинга нужен адрес что пинговать, а для логов задается количество строк из лога)
если же вы создаете свой скрипт и для него не нужны доп. параметры, а нужно просто запустить скрипт, то ничего дописывать в основной скрипт не нужно
-
- Сообщения: 1657
- Зарегистрирован: 15 сен 2017, 09:03
Понятно, но как то не очень универсально ... А доработать можно ?
А это человек сделал давно уже ... https://habr.com/ru/post/482802/ как Вам ?
А это человек сделал давно уже ... https://habr.com/ru/post/482802/ как Вам ?
фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
viewtopic.php?f=14&t=13947
- Virtue
- Сообщения: 148
- Зарегистрирован: 07 мар 2014, 10:17
при желании всё можно доработать, смотря что вам нужно..
Бегло просмотрел, и что могу сказать..Sertik писал(а): ↑07 июл 2020, 09:48 А это человек сделал давно уже ... https://habr.com/ru/post/482802/ как Вам ?
Скрипт того человека по сути также просто запускает скрипты по названию (без всяких там доп параметров и заморочек) соответственно с помощью данного скрипта не выполнить например пинг определенного хоста..
А еще минус того скрипта перед моим, что он написан для одного микротика и с помощью него не запустить например какой-то скрипт сразу на нескольких роутерах
-
- Сообщения: 22
- Зарегистрирован: 29 окт 2014, 21:31
Не работает этот скрипт...Sertik писал(а): ↑07 июл 2020, 09:48 Понятно, но как то не очень универсально ... А доработать можно ?
А это человек сделал давно уже ... https://habr.com/ru/post/482802/ как Вам ?
- Virtue
- Сообщения: 148
- Зарегистрирован: 07 мар 2014, 10:17
У меня ксате тоже появились вопросы по его работоспособности..ReadMe писал(а): ↑07 июл 2020, 10:16Не работает этот скрипт...Sertik писал(а): ↑07 июл 2020, 09:48 Понятно, но как то не очень универсально ... А доработать можно ?
А это человек сделал давно уже ... https://habr.com/ru/post/482802/ как Вам ?
Например я не понял где объявляется переменная $quotas
-
- Сообщения: 22
- Зарегистрирован: 29 окт 2014, 21:31
там не в этом прикол viewtopic.php?f=14&t=11797Virtue писал(а): ↑07 июл 2020, 10:22У меня ксате тоже появились вопросы по его работоспособности..ReadMe писал(а): ↑07 июл 2020, 10:16Не работает этот скрипт...Sertik писал(а): ↑07 июл 2020, 09:48 Понятно, но как то не очень универсально ... А доработать можно ?
А это человек сделал давно уже ... https://habr.com/ru/post/482802/ как Вам ?
Например я не понял где объявляется переменная $quotas