оповещение в телегу

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
-13-
Сообщения: 125
Зарегистрирован: 18 мар 2021, 12:45

Sertik писал(а): 12 сен 2023, 20:02 Я не понял скрипты выше выдернуты из контекста ? ибо где у Вас объявление переменных ?
Вы по старой привычке переменные не объявляете ?
Как это работает. Я не смог запустить ...
Переменные объявляю только глобальные, коих у меня на данный момент всего три, более пока не требуется.
Локальные переменные делаю через ":set $name", мне так привычнее
Все скрипты у меня модульные, т.е. каждый отвечает за свой функционал, а далее уже обращаемся к тому или иному скрипту по надобности.


Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Я не понимаю как работает :set $ISP [[$fnParse script="fnListISP"]], если fnListISP нигде не объявлена как переменная ... и никто не знает, что под fnListISP содержится и где его искать ... Да и код fnParse и tgSend Вы явно утаиваете ...


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
-13-
Сообщения: 125
Зарегистрирован: 18 мар 2021, 12:45

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]]
}


Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Вот, тогда другое дело.
Ещё скрипт с tgSend приложите


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
-13-
Сообщения: 125
Зарегистрирован: 18 мар 2021, 12:45

Sertik писал(а): 14 сен 2023, 08:40 Вот, тогда другое дело.
Ещё скрипт с tgSend приложите
тут совсем все просто
 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


Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Всё очень круто и симпатично ! Мне кажется Вы подсмотрели логику модульности у Brook ну и свою лепту внесли.
Не могли бы Вы описать на примере логику построения Ваших модулей ? Думаю всем будет интересно и полезно.
Наверное лучше в отдельном топике.

Как я понял, каждый модуль у Вас представлен отдельным скриптом репозитория, который парсится в функцию, когда он нужен.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
-13-
Сообщения: 125
Зарегистрирован: 18 мар 2021, 12:45

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
Концепция такая, что сокращаем любой скрипт до минимально возможных размеров, и обращаемся по необходимости, проще писать, и искать ошибки


Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Насчет 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-клиентов ?


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Кстати, раз Вы это всё делаете для Телеги, то Вы практически создали свою собственную библиотеку скриптов, подобную моей SATELLITE
(viewtopic.php?f=14&t=13648), только лучше !
Вы могли бы поделиться этим с сообществом, если хотите. Ну или сделайте это тогда, когда будете считать работу завершенной на каком-то этапе. Сделайте отдельный топик. Желаю успехов !
Вашу модульность возьму на заметку, может сам перейду на что-то подобное.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
-13-
Сообщения: 125
Зарегистрирован: 18 мар 2021, 12:45

Да, и не понял:

Код: Выделить всё

 :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")
}


Ответить