Страница 12 из 16
Re: оповещение в телегу
Добавлено: 13 сен 2023, 12:04
-13-
Sertik писал(а): ↑12 сен 2023, 20:02
Я не понял скрипты выше выдернуты из контекста ? ибо где у Вас объявление переменных ?
Вы по старой привычке переменные не объявляете ?
Как это работает. Я не смог запустить ...
Переменные объявляю только глобальные, коих у меня на данный момент всего три, более пока не требуется.
Локальные переменные делаю через ":set $name", мне так привычнее
Все скрипты у меня модульные, т.е. каждый отвечает за свой функционал, а далее уже обращаемся к тому или иному скрипту по надобности.
Re: оповещение в телегу
Добавлено: 13 сен 2023, 13:12
Sertik
Я не понимаю как работает :set $ISP [[$fnParse script="fnListISP"]], если fnListISP нигде не объявлена как переменная ... и никто не знает, что под fnListISP содержится и где его искать ... Да и код fnParse и tgSend Вы явно утаиваете ...
Re: оповещение в телегу
Добавлено: 13 сен 2023, 17:30
-13-
Sertik писал(а): ↑13 сен 2023, 13:12
Я не понимаю как работает :set $ISP [[$fnParse script="fnListISP"]], если fnListISP нигде не объявлена как переменная ... и никто не знает, что под fnListISP содержится и где его искать ... Да и код fnParse и tgSend Вы явно утаиваете ...
великой тайны нет, никто просил, я и не писал, ниже спрятал под спойлер три своих глобальные переменные
раз в минуту выполняется $fnExe script="-Check ISP"
:global fnExe
:if (!any $fnExe) do={
:global fnExe do={:execute [/system script get $script source]}
}
:global fnParse
:if (!any $fnParse) do={
:global fnParse do={:parse [/system script get $script source]}
}
:global tgSend
:if (!any $tgSend) do={
:global tgSend [:parse [/system script get "tgSend" source]]
}
Re: оповещение в телегу
Добавлено: 14 сен 2023, 08:40
Sertik
Вот, тогда другое дело.
Ещё скрипт с tgSend приложите
Re: оповещение в телегу
Добавлено: 14 сен 2023, 09:43
-13-
Sertik писал(а): ↑14 сен 2023, 08:40
Вот, тогда другое дело.
Ещё скрипт с tgSend приложите
тут совсем все просто
Код: Выделить всё
# Name: tgSend
# Description: Send message to botTelegram
:global fnParse
:set $dbCmd [[$fnParse script="dbCmd"]]
:set $apiTg ($dbCmd->"apiTg")
:set $botID ($dbCmd->"botID")
:set $apiSend ("/sendmessage?chat_id=" . $chatid . "&text=" . $text)
:set $apiSend ($apiTg . $botID . $apiSend)
/tool fetch ascii=yes url=$apiSend as-value output=none
# End script
Re: оповещение в телегу
Добавлено: 14 сен 2023, 10:04
Sertik
Всё очень круто и симпатично ! Мне кажется Вы подсмотрели логику модульности у Brook ну и свою лепту внесли.
Не могли бы Вы описать на примере логику построения Ваших модулей ? Думаю всем будет интересно и полезно.
Наверное лучше в отдельном топике.
Как я понял, каждый модуль у Вас представлен отдельным скриптом репозитория, который парсится в функцию, когда он нужен.
Re: оповещение в телегу
Добавлено: 14 сен 2023, 10:28
-13-
Sertik писал(а): ↑14 сен 2023, 10:04
Всё очень круто и симпатично ! Мне кажется Вы подсмотрели логику модульности у Brook ну и свою лепту внесли.
Не могли бы Вы описать на примере логику построения Ваших модулей ? Думаю всем будет интересно и полезно.
Наверное лучше в отдельном топике.
Как я понял, каждый модуль у Вас представлен отдельным скриптом репозитория, который парсится в функцию, когда он нужен.
Нет, у Brook, на мой взгляд (для меня) сложные коды, а на модульность заставил в свое время перейти знакомый программист.
Про модульность все просто, появляется какая либо необходимость, пишется скрипт только под эту необходимость, дальше читаем там где нам это нужно.
ниже пример
сбор данных об LTE c RBSXT Код: Выделить всё
# Name: fnStatusLTE
# Description: Get LTE-modem status
:set $infoCellular [/interface lte monitor lte1 once as-value]
:set $infoStatus [/interface get lte1]
:set $RSRQ ($infoCellular->"rsrq")
:set $RSRQ (($RSRQ/10) . "." . [:pick $RSRQ ([:len $RSRQ]-1) [:len $RSRQ]])
:set $StatusLTE ("Cellular info%0A\
Operator: $($infoCellular->"current-operator")%0A\
Access Technology: $($infoCellular->"access-technology")%0A\
EARFCN: $($infoCellular->"earfcn")%0A\
Session Uptime: $($infoCellular->"session-uptime")%0A\
RSRP: $($infoCellular->"rsrp") dBm%0A\
SINR: $($infoCellular->"sinr") dB%0A\
RSRQ: $RSRQ dB%0A\
CQI: $($infoCellular->"cqi")%0A\
%0A\
Status/Traffic info%0A\
Last Link Down: $($infoStatus->"last-link-down-time")%0A\
Last Link Up: $($infoStatus->"last-link-up-time")%0A\
Link Downs: $($infoStatus->"link-downs")%0A\
Tx/Rx: $(($infoStatus->"tx-byte")/1048576)MiB/$(($infoStatus->"rx-byte")/1048576)MiB%0A")
:return $StatusLTE
# End
его уже забираем куда нам надо,
а вот такой командой я получаю в одном из скриптов состояние провайдеров
Код: Выделить всё
:foreach ISP in=[[$fnParse script="fnListISP"]] do={
:set $listISP ($listISP . ($ISP->"name") . ": " . ($ISP->"status") . "%0A")
}
ну и все это делалось естественно под телегу
перевод на русский я утащил отсюда и тоже вынес его в отдельный модуль.
Код: Выделить всё
# Name: fnEngToRu
# Description: Function Converter of Russian characters for sending in Telegram
:set $string $1;
# table of the codes of Russian letters UTF8
:local rsimv [:toarray {"À"="D090"; "Á"="D091"; "Â"="D092"; "Ã"="D093"; "Ä"="D094"; "Å"="D095"; "Æ"="D096"; "Ç"="D097"; "È"="D098"; "É"="D099"; "Ê"="D09A"; "Ë"="D09B"; "Ì"="D09C"; "Í"="D09D"; "Î"="D09E"; "Ï"="D09F"; "Ð"="D0A0"; "Ñ"="D0A1"; "Ò"="D0A2"; "Ó"="D0A3"; "Ô"="D0A4"; "Õ"="D0A5"; "Ö"="D0A6"; "×"="D0A7"; "Ø"="D0A8"; "Ù"="D0A9"; "Ú"="D0AA"; "Û"="D0AB"; "Ü"="D0AC"; "Ý"="D0AD"; "Þ"="D0AE"; "ß"="D0AF"; "à"="D0B0"; "á"="D0B1"; "â"="D0B2"; "ã"="D0B3"; "ä"="D0B4"; "å"="D0B5"; "æ"="D0B6"; "ç"="D0B7"; "è"="D0B8"; "é"="D0B9"; "ê"="D0BA"; "ë"="D0BB"; "ì"="D0BC"; "í"="D0BD"; "î"="D0BE"; "ï"="D0BF"; "ð"="D180"; "ñ"="D181"; "ò"="D182"; "ó"="D183"; "ô"="D184"; "õ"="D185"; "ö"="D186"; "÷"="D187"; "ø"="D188"; "ù"="D189"; "ú"="D18A"; "û"="D18B"; "ü"="D18C"; "ý"="D18D"; "þ"="D18E"; "ÿ"="D18F"; "¨"="D001"; "¸"="D191"; "¹"="0023"; " "="0020"; "&"="0026"; "^"="005E"}]
# encoding of the symbols and àssembly line
:for i from=0 to=([:len $string]-1) do={
:local keys [:pick $string $i (1+$i)]
:local key ($rsimv->$keys)
:if ([:len $key]!=0) do={
:set $code ("%" . "$[:pick ($rsimv->$keys) 0 2]" . "%" . "$[:pick ($rsimv->$keys) 2 4]")
:if ([pick $code 0 3] = "%00") do={
:set $code [:pick $code 3 6]
}
} else={
:set $code $keys
}
:set $StrTele ($StrTele . $code)
}
:return $StrTele;
# End
Концепция такая, что сокращаем любой скрипт до минимально возможных размеров, и обращаемся по необходимости, проще писать, и искать ошибки
Re: оповещение в телегу
Добавлено: 14 сен 2023, 11:36
Sertik
Насчет fnStatusLTE - работать будет только если LTE-модем в роутере один и имя интерфейса никто не менял, т.к. жестко закреплено имя интерфейса lte1. Лучше как будет время сделайте универсально через [:find]. Также на роутере возможны "ppp-outX" интерфейсы модемов ...
Насчет перевода на русский - "утащили" у меня (не утащили, а взяли, нормально воспользовались), но лучше пользоваться вот этим перекодировщиком, он более правильный
https://forum.mikrotik.com/viewtopic.ph ... 1#p1012963 (автор Rextended):
Код: Выделить всё
:global ASCIItoCP1251toUTF8 do={
:local ascii "\00\01\02\03\04\05\06\07\08\09\0A\0B\0C\0D\0E\0F\
\10\11\12\13\14\15\16\17\18\19\1A\1B\1C\1D\1E\1F\
\20\21\22\23\24\25\26\27\28\29\2A\2B\2C\2D\2E\2F\
\30\31\32\33\34\35\36\37\38\39\3A\3B\3C\3D\3E\3F\
\40\41\42\43\44\45\46\47\48\49\4A\4B\4C\4D\4E\4F\
\50\51\52\53\54\55\56\57\58\59\5A\5B\5C\5D\5E\5F\
\60\61\62\63\64\65\66\67\68\69\6A\6B\6C\6D\6E\6F\
\70\71\72\73\74\75\76\77\78\79\7A\7B\7C\7D\7E\7F\
\80\81\82\83\84\85\86\87\88\89\8A\8B\8C\8D\8E\8F\
\90\91\92\93\94\95\96\97\98\99\9A\9B\9C\9D\9E\9F\
\A0\A1\A2\A3\A4\A5\A6\A7\A8\A9\AA\AB\AC\AD\AE\AF\
\B0\B1\B2\B3\B4\B5\B6\B7\B8\B9\BA\BB\BC\BD\BE\BF\
\C0\C1\C2\C3\C4\C5\C6\C7\C8\C9\CA\CB\CC\CD\CE\CF\
\D0\D1\D2\D3\D4\D5\D6\D7\D8\D9\DA\DB\DC\DD\DE\DF\
\E0\E1\E2\E3\E4\E5\E6\E7\E8\E9\EA\EB\EC\ED\EE\EF\
\F0\F1\F2\F3\F4\F5\F6\F7\F8\F9\FA\FB\FC\FD\FE\FF"
:local CP1251toUTF8 {"00";"01";"02";"03";"04";"05";"06";"07";"08";"09";"0A";"0B";"0C";"0D";"0E";"0F";
"10";"11";"12";"13";"14";"15";"16";"17";"18";"19";"1A";"1B";"1C";"1D";"1E";"1F";
"20";"21";"22";"23";"24";"25";"26";"27";"28";"29";"2A";"2B";"2C";"2D";"2E";"2F";
"30";"31";"32";"33";"34";"35";"36";"37";"38";"39";"3A";"3B";"3C";"3D";"3E";"3F";
"40";"41";"42";"43";"44";"45";"46";"47";"48";"49";"4A";"4B";"4C";"4D";"4E";"4F";
"50";"51";"52";"53";"54";"55";"56";"57";"58";"59";"5A";"5B";"5C";"5D";"5E";"5F";
"60";"61";"62";"63";"64";"65";"66";"67";"68";"69";"6A";"6B";"6C";"6D";"6E";"6F";
"70";"71";"72";"73";"74";"75";"76";"77";"78";"79";"7A";"7B";"7C";"7D";"7E";"7F";
"D082";"D083";"E2809A";"D193";"E2809E";"E280A6";"E280A0";"E280A1";"E282AC";"E280B0";"D089";"E280B9";"D08A";"D08C";"D08B";"D08F";
"D192";"E28098";"E28099";"E2809C";"E2809D";"E280A2";"E28093";"E28094";"EFBFBD";"E284A2";"D199";"E280BA";"D19A";"D19C";"D19B";"D19F";
"C2A0";"D08E";"D19E";"D088";"C2A4";"D290";"C2A6";"C2A7";"D081";"C2A9";"D084";"C2AB";"C2AC";"C2AD";"C2AE";"D087";
"C2B0";"C2B1";"D086";"D196";"D291";"C2B5";"C2B6";"C2B7";"D191";"E28496";"D194";"C2BB";"D198";"D085";"D195";"D197";
"D090";"D091";"D092";"D093";"D094";"D095";"D096";"D097";"D098";"D099";"D09A";"D09B";"D09C";"D09D";"D09E";"D09F";
"D0A0";"D0A1";"D0A2";"D0A3";"D0A4";"D0A5";"D0A6";"D0A7";"D0A8";"D0A9";"D0AA";"D0AB";"D0AC";"D0AD";"D0AE";"D0AF";
"D0B0";"D0B1";"D0B2";"D0B3";"D0B4";"D0B5";"D0B6";"D0B7";"D0B8";"D0B9";"D0BA";"D0BB";"D0BC";"D0BD";"D0BE";"D0BF";
"D180";"D181";"D182";"D183";"D184";"D185";"D186";"D187";"D188";"D189";"D18A";"D18B";"D18C";"D18D";"D18E";"D18F"
}
:local string $1
:if (([:typeof $string] != "str") or ($string = "")) do={ :return "" }
:local lenstr [:len $string]
:local constr ""
:for pos from=0 to=($lenstr - 1) do={
:local utf ($CP1251toUTF8->[:find $ascii [:pick $string $pos ($pos + 1)] -1])
:local sym ""
:if ([:len $utf] = 2) do={:set sym "%$[:pick $utf 0 2]" }
:if ([:len $utf] = 4) do={:set sym "%$[:pick $utf 0 2]%$[:pick $utf 2 4]" }
:if ([:len $utf] = 6) do={:set sym "%$[:pick $utf 0 2]%$[:pick $utf 2 4]%$[:pick $utf 4 6]" }
:set constr "$constr$sym"
}
:return $constr
}
:put [$ASCIItoCP1251toUTF8 ("\F2\E5\F1\F2")]
смотрите также его другие скрипты, у Rextended можно многому научиться, он очень крутой программист
https://forum.mikrotik.com/viewtopic.php?t=177551
Да, и не понял:
Код: Выделить всё
:foreach ISP in=[[$fnParse script="fnListISP"]] do={
:set $listISP ($listISP . ($ISP->"name") . ": " . ($ISP->"status") . "%0A")
}
зачем тут :foreach, если Вы в fnListISP уже обходите всех DHCP-клиентов ?
Re: оповещение в телегу
Добавлено: 14 сен 2023, 12:57
Sertik
Кстати, раз Вы это всё делаете для Телеги, то Вы практически создали свою собственную библиотеку скриптов, подобную моей SATELLITE
(
viewtopic.php?f=14&t=13648), только лучше !
Вы могли бы поделиться этим с сообществом, если хотите. Ну или сделайте это тогда, когда будете считать работу завершенной на каком-то этапе. Сделайте отдельный топик. Желаю успехов !
Вашу модульность возьму на заметку, может сам перейду на что-то подобное.
Re: оповещение в телегу
Добавлено: 14 сен 2023, 13:23
-13-
Да, и не понял:
Код: Выделить всё
:foreach ISP in=[[$fnParse script="fnListISP"]] do={
:set $listISP ($listISP . ($ISP->"name") . ": " . ($ISP->"status") . "%0A")
}
зачем тут :foreach, если Вы в fnListISP уже обходите всех DHCP-клиентов ?
[/quote]
script="fnListISP" тут просто массив, который можно использовать еще где-то
а здесь мы уже для телеги создали список, с именем и статусом, удобно когда больше одного провайдера
Код: Выделить всё
:foreach ISP in=[[$fnParse script="fnListISP"]] do={
:set $listISP ($listISP . ($ISP->"name") . ": " . ($ISP->"status") . "%0A")
}