Страница 1 из 1
перезагрузка RB через telegram
Добавлено: 21 окт 2022, 15:55
-13-
помогите осилить
после запуска такой строки через telegram
роутер уходит в цикличный ребут
Re: перезагрузка RB через telegram
Добавлено: 23 окт 2022, 13:56
Brook
-13- писал(а): ↑21 окт 2022, 15:55
помогите осилить
после запуска такой строки через telegram
роутер уходит в цикличный ребут
Мало информации. Покажите как команда вызывается в коде.
Возможно Ваш бот не увеличивает
update_id до перезагрузки и получает это сообщение заново, поэтому система опять перезагружается.
Re: перезагрузка RB через telegram
Добавлено: 25 окт 2022, 10:07
-13-
скрипт проверяющий telegram Код: Выделить всё
# Name: Check botChat
# Description: Check message to botTelegram
:global fnExe
:global fnParse
:global fnSend
:set $dbCmd [[$fnParse script="dbCmd"]]
:set $botID ($dbCmd->"botID")
:set $myChat ($dbCmd->"myChat")
:set $apiTg ($dbCmd->"apiTg")
:set $parse do={
:set $startLoc ([:find $content $variable -1] + [:len $variable] + 2)
:set $commaLoc ([:find $content "," $startLoc] - 1 + 1)
:set $braceLoc ([:find $content "}" $startLoc] - 1 + 1)
:set $endLoc $commaLoc
:set $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 + 1)
:set $endLoc ($endLoc - 1)
}
:if ($endLoc < $startLoc) do={
:set $endLoc ($startLoc + 1)
}
:set $message [:pick $content $startLoc $endLoc]
:if ($message ~"@") do={
:set $message [:pick $message 0 [:find $message "@"]]
}
:return $message
}
:while ( true ) do={
:do {
:set $fetchCheck ("/getUpdates\?offset=$messageId&limit=1&allowed_updates=message&timeout=60")
:set $fetchCheck ($apiTg . $botID . $fetchCheck)
:set $content ([/tool fetch url=$fetchCheck as-value output=user]-> "data")
:if ([:len $content] > 30) do={
:set $messageId ([$parse content=$content variable="update_id"] + 1)
:set $message [$parse content=$content variable="text" quotas=true]
:set $chat [$parse content=$content variable="chat"]
:set $chatid [$parse content=$chat variable="id"]
## Chat authentication.
:if ($chatid = $myChat) do={
:set $script [[$fnParse script="fnChat"] message=$message]
:if (any $script) do={
[$fnParse script=$script] message=$message chatid=$chatid
} else={
:set $text "unknow cmd - $message"
$fnSend chatid=$chatid text=$text
}
} else={
:set $text "No one's home."
:set $fetchLeave ("/leaveChat\?chat_id=" . $chatid)
:set $fetchLeave ($apiTg . $botID . $fetchLeave)
$fnSend chatid=$chatid text=$text
/tool fetch url=$fetchLeave as-value output=none
}
}
} on-error={}
}
# End script
Код: Выделить всё
# Name: -Reboot RB
# Description: Reboot RB
:global fnExe
:global fnParse
:global fnSend
:set $dbCmd [[$fnParse script="dbCmd"]]
:set $myChat ($dbCmd->"myChat")
:set $syName ($dbCmd->"syName")
:set $cuDate ($dbCmd->"cuDate")
:set $text ("$syName:%0A\
$cuDate%0A\
%0A\
system will be rebooted")
$fnSend chatid=$myChat text=$text
:delay 30
/system reboot
# End
update_id счетчик отрабатывает при посыле команды, после перезагрузки приходит повторно сообщение о перезагрузке, скрипт естественно отрабатывает, но update_id счетчик стоит на месте
Re: перезагрузка RB через telegram
Добавлено: 25 окт 2022, 22:13
Brook
-13- писал(а): ↑25 окт 2022, 10:07
скрипт проверяющий telegram Код: Выделить всё
# Name: Check botChat
# Description: Check message to botTelegram
:global fnExe
:global fnParse
:global fnSend
:set $dbCmd [[$fnParse script="dbCmd"]]
:set $botID ($dbCmd->"botID")
:set $myChat ($dbCmd->"myChat")
:set $apiTg ($dbCmd->"apiTg")
:set $parse do={
:set $startLoc ([:find $content $variable -1] + [:len $variable] + 2)
:set $commaLoc ([:find $content "," $startLoc] - 1 + 1)
:set $braceLoc ([:find $content "}" $startLoc] - 1 + 1)
:set $endLoc $commaLoc
:set $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 + 1)
:set $endLoc ($endLoc - 1)
}
:if ($endLoc < $startLoc) do={
:set $endLoc ($startLoc + 1)
}
:set $message [:pick $content $startLoc $endLoc]
:if ($message ~"@") do={
:set $message [:pick $message 0 [:find $message "@"]]
}
:return $message
}
:while ( true ) do={
:do {
:set $fetchCheck ("/getUpdates\?offset=$messageId&limit=1&allowed_updates=message&timeout=60")
:set $fetchCheck ($apiTg . $botID . $fetchCheck)
:set $content ([/tool fetch url=$fetchCheck as-value output=user]-> "data")
:if ([:len $content] > 30) do={
:set $messageId ([$parse content=$content variable="update_id"] + 1)
:set $message [$parse content=$content variable="text" quotas=true]
:set $chat [$parse content=$content variable="chat"]
:set $chatid [$parse content=$chat variable="id"]
## Chat authentication.
:if ($chatid = $myChat) do={
:set $script [[$fnParse script="fnChat"] message=$message]
:if (any $script) do={
[$fnParse script=$script] message=$message chatid=$chatid
} else={
:set $text "unknow cmd - $message"
$fnSend chatid=$chatid text=$text
}
} else={
:set $text "No one's home."
:set $fetchLeave ("/leaveChat\?chat_id=" . $chatid)
:set $fetchLeave ($apiTg . $botID . $fetchLeave)
$fnSend chatid=$chatid text=$text
/tool fetch url=$fetchLeave as-value output=none
}
}
} on-error={}
}
# End script
Код: Выделить всё
# Name: -Reboot RB
# Description: Reboot RB
:global fnExe
:global fnParse
:global fnSend
:set $dbCmd [[$fnParse script="dbCmd"]]
:set $myChat ($dbCmd->"myChat")
:set $syName ($dbCmd->"syName")
:set $cuDate ($dbCmd->"cuDate")
:set $text ("$syName:%0A\
$cuDate%0A\
%0A\
system will be rebooted")
$fnSend chatid=$myChat text=$text
:delay 30
/system reboot
# End
update_id счетчик отрабатывает при посыле команды, после перезагрузки приходит повторно сообщение о перезагрузке, скрипт естественно отрабатывает, но update_id счетчик стоит на месте
update_id попадает на сервер Телеги при выполнении fetch.
Когда приходит команда перезагрузки, то до следующего fetch уже дело не доходит, потому что роуетер в ребуте.
Телеграм думает, что это сообщение еще не забрали и микротик благополучно его опять загружает. И так по кругу.
Перед перезагрузкой выполняйте свой код с увеличенным на 1 update_id, это должно помочь.
Код: Выделить всё
:set $fetchCheck ("/getUpdates\?offset=$messageId&limit=1&allowed_updates=message&timeout=60")
:set $fetchCheck ($apiTg . $botID . $fetchCheck)
:set $content ([/tool fetch url=$fetchCheck as-value output=user]-> "data")
Re: перезагрузка RB через telegram
Добавлено: 26 окт 2022, 09:59
Sertik
Или используете парсер-уведомитель TLGRM
viewtopic.php?f=14&t=12659&start=80.
Там проблемы такой (цикличного ребута) нет, проверено.
Re: перезагрузка RB через telegram
Добавлено: 05 ноя 2022, 21:39
Apollo22
Всем привет,
Тоже задался целью перезагружать mikrotik через телегу,
и вот что получилось
Первый скрипт:
Название скрипта - /reboot
Сам скрипт - /system scheduler enable reboot-ON
Скрипт включает задание (reboot-ON) в планировщике
/system script run reboot
Задача настроена на выполнение раз в минуту
После перезагрузки срабатывает другое задание (Reboot-OFF)
:delay 30
/system scheduler disable reboot-ON
Данное задание выключает (reboot-ON)
В итоге роутер перезагружается и скрипт телеграмма корректно отрабатывает
Понимаю что топорно зато работает отлично.