О функциях в скриптах

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

Ну по сути это функция, и довольно опасная для памяти. Если кто-то сообразит как её переделать для записи в конец без чтения и конканцинации, то вообще будет круто.


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

Новая версия функции FuncAS 1.7 от 10.02.2023 г.

Добавлено новое:
- подфункция [$FuncAS->"whatsap"] - для отправки сообщений в WhatsApp через сервис www.callmeBot.com
(сервис платный)
- подфункция [$FuncAS->"smsHW"] - отправка SMS через API модемов Huawey с поддержкой транслитерации
русского языка

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

#-------------------------------------------------------------------------------------------------------------
# FuncAS version 1.7 by Sertik (Serkov S.V.) 09/01/2022-09/02/2023
#-------------------------------------------------------------------------------------------------------------

# полностью корректно работает при отправке сообщений на английском языке и/или русском языке с опцией "translite" и с учётом ограничения длины сообщения
# поддерживает спец. символы \$@!#%'()*+,-./:;<=>?[]^_`{|}~
;
# для Телеграмм, API sms.ru и большинства почтовых клиентов (проверено для mail.ru, yandex.ru и gmail.com)
# есть поддержка национального (русского) текста 
# для Телеграмм (опционально $1="translite") и отправки SMS через модемы работает транслитерация русских символов в латинские
;
#  - на роутере должны быть сконфигурированы /tool sms и /tool e-mail
# - при использовании ключа "telegram" должны быть определены global Emoji (Emoji роутера, по желанию), botID и myChatID)
# - при использовании ключа "wathsapp" должны быть определены global Emoji (по желанию), WhatsAppPhone и WhatsAppApiKey сервиса www.callmeBot;
#  - при использовании ключа "smsAPI" должна быть определена global apikey (ключ аккаунта на sms.ru)
# - при использовании ключа "smsLT" должны быть определены global Ladr (адрес Laurent-5G в сети) и Lpass (пароль авторизации модуля)
#  - при использовании ключа "smsNP" должны быть определены global NPadr (адрес шлюза Netping в сети), NPuser (login), NPpass (пароль)
# - при использовании ключа "smsHW" параметры для доступа к API Huawey модемов задаются в $0, $1 и $2
#  !  выбор номера телефона получателя при всех вариантах отправок sms осуществляется в порядке $1 (из параметра функции) -> $ADMINPHONE (global var) -> 
#   ->  first [/tool sms get allowed-number] по алгоритму "если не указан, то следующий"
# ! номера телефонов указывать в международном формате (+7десятизначный номер) поддерживается отправка sms только по России (+7)
#   ! выбор почтового адреса получателя при отправке e-mail осуществляется аналогично в порядке $1 -> $ADMINMAIL (global var)
#
# ! обратить внимание:
# в отличие от обычных функций, которые в $0 хранят своё имя, первый параметр функции массива будет $0 !, второй $1 и т .д....
# вызов функции без ключа [$FuncAS "you mesage"] вызывает последовательную работу всех элементов функции и равноценен [($FuncAS->"all") "you mesage"] 
#
# Usage: [($FuncAS->"telegram") "you mesage"]
#                [($FuncAS->"whatsap") "you mesage"]
#                [($FuncAS->"sms") "you mesage" "phone number"]
#                [($FuncAS->"sms") "you mesage" (phone number get from ADMINPHONE or first [/tool sms get allowed-number];
#                [($FuncAS->"smsAPI") "you mesage" "phonenumber"]
#                [($FuncAS->"smsAPI") "you mesage" (phone number get from ADMINPHONE or or first [/tool sms get allowed-number];
#                [($FuncAS->"smsNP") ("привет text H"."\\"."\$"." @!#%'()*+,-./:;<=>?[]^_`{|}~") "+79104797703"]
#                [($FuncAS->"smsLT") ("good by world") 2]
#                [($FuncAS->"smsHW") address WEB modem API, phone number, "you message"]
#                [($FuncAS->"email") "you mesage" "e-mail"]
#                [($FuncAS->"email") "you mesage"] (e-mail get from $ADMINMAIL)
#                [($FuncAS->"all") "you mesage"]  (e-mail get from $ADMINMAIL)

#   !!!         [$FuncAS "you mesage"] = [($FuncAS->"all") "you mesage"]   (execute last key - all functions !)

# see also the examples at the end of the function code !

# defining global users variables:

:global Emoji;                         # :global Emoji "%E2%9B%BA"
:global botID;                        # :global botID "botXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
:global myChatID;                 #:global myChatID "XXXXXXXXX";
:global ADMINPHONE;        #:global ADMINPHONE "+7910777777"
:global ADMINMAIL;            # :global ADMINMAIL user@mail.ru
:global Ladr;                          # :global Ladr 192.168.0.10
:global Lpass;                       # :global Lpass Laurent5G password
:global NPadr;                      # :global NPadr 192.168.0.10:8080
:global NPuser;                     # :global NPuser Sertik
:global NPpass;                    # :global NPpass NPpassword
:global apikey;                      # :global apikey ХХХХХХХХ-ХХХХ-ХХХХ-ХХХХ-ХХХХХХХХХХХХ
:global WhatsAppPhone;     # :global WhatsAppPhone user phone number 
:global WhatsAppApiKey;     # :global WhatsApp callmeBot ApiKey

:global FuncAS [:toarray ""]


# function transliteration
# string for transliteration is set in the parametr name "string"

:set ($FuncAS->"translite") do={

#  table of the codes of Russian letters Translite
:local rsimv [:toarray {"А"="A"; "Б"="B"; "В"="V"; "Г"="G"; "Д"="D"; "Е"="E"; "Ж"="ZH"; "З"="Z"; "И"="I"; "Й"="J"; "К"="K"; "Л"="L"; "М"="M"; "Н"="N"; "О"="O"; "П"="P"; "Р"="R"; "С"="S"; "Т"="T"; "У"="U"; "Ф"="F"; "Х"="KH"; "Ц"="C"; "Ч"="CH"; "Ш"="SH"; "Щ"="SCH"; "Ъ"="``"; "Ы"="Y`"; "Ь"="`"; "Э"="E`"; "Ю"="JU"; "Я"="YA"; "а"="a"; "б"="b"; "в"="v"; "г"="g"; "д"="d"; "е"="e"; "ж"="zh"; "з"="z"; "и"="i"; "й"="j"; "к"="k"; "л"="l"; "м"="m"; "н"="n"; "о"="o"; "п"="p"; "р"="r"; "с"="s"; "т"="t"; "у"="u"; "ф"="f"; "х"="kh"; "ц"="c"; "ч"="ch"; "ш"="sh"; "щ"="sch"; "ъ"="``"; "ы"="y`"; "ь"="`"; "э"="e`"; "ю"="ju"; "я"="ya"; "Ё"="Yo"; "ё"="yo"; "№"="#"}]

# encoding of the symbols and аssembly line
:local StrTele ""; :local code "";
: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 ($rsimv->$keys);} else={:set $code $keys};

:if (($keys="Ь")  and ([:pick $string ($i+1) (2+$i)]="Е")) do={:set $code "I"; :set $i ($i+1)}
:if (($keys="ь")  and ([:pick $string ($i+1) (2+$i)]="е")) do={:set $code "i"; :set $i ($i+1)}
:if (($keys="Ь")  and ([:pick $string ($i+1) (2+$i)]="е")) do={:set $code "I"; :set $i ($i+1)}
:if (($keys="ь")  and ([:pick $string ($i+1) (2+$i)]="Е")) do={:set $code "i"; :set $i ($i+1)}
:if (($keys="Ы")  and ([:pick $string ($i+1) (2+$i)]="Й")) do={:set $code "I"; :set $i ($i+1)}
:if (($keys="ы")  and ([:pick $string ($i+1) (2+$i)]="й")) do={:set $code "i"; :set $i ($i+1)}
:if (($keys="ы")  and ([:pick $string ($i+1) (2+$i)]="Й")) do={:set $code "i"; :set $i ($i+1)}
:if (($keys="Ы")  and ([:pick $string ($i+1) (2+$i)]="й")) do={:set $code "I"; :set $i ($i+1)}
 :set $StrTele ("$StrTele"."$code")}
:return $StrTele
}

:set ($FuncAS->"cp1251toutf8") do={
        :local cp1251 [:toarray {
            "\20";"\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";\
            "\21";"\22";"\23";"\24";"\25";"\26";"\27";"\28";"\29";"\2A";"\2B";"\2C";"\2D";"\2E";"\2F";"\3A";\
            "\3B";"\3C";"\3D";"\3E";"\3F";"\40";"\5B";"\5C";"\5D";"\5E";"\5F";"\60";"\7B";"\7C";"\7D";"\7E";\
            "\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";\
            "\A8";"\B8";"\B9"}];
        :local utf8 [:toarray {
            "0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"000A";"0020";"0020";"000D";"0020";"0020";\
            "0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";\
            "0021";"0022";"0023";"0024";"0025";"0026";"0027";"0028";"0029";"002A";"002B";"002C";"002D";"002E";"002F";"003A";\
            "003B";"003C";"003D";"003E";"003F";"0040";"005B";"005C";"005D";"005E";"005F";"0060";"007B";"007C";"007D";"007E";\
            "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";"2116"}];
        :local convStr ""; 
        :local code "";
        :for i from=0 to=([:len $0]-1) do={
            :local symb [:pick $0 $i ($i+1)]; 
            :local idx [:find $cp1251 $symb];
            :local key ($utf8->$idx);
            :if ([:len $key]!=0) do={
                :set $code ("%$[:pick ($key) 0 2]%$[:pick ($key) 2 4]");
                :if ([pick $code 0 3]="%00") do={:set $code ([:pick $code 3 6])};
            } else={:set code ($symb)}; 
            :set $convStr ($convStr.$code);
        }
        :return ($convStr);
    }


# part to Telegram
:set ($FuncAS->"telegram") do={
         :if ([:len $0]!=0) do={
         :global Emoji
         :global botID;
         :global myChatID;
         :global FuncAS
         :if (([:len $botID]=0) or ([:len $myChatID]=0)) do={:log error "ERROR FuncAs telegram chatbotID not found"; :return "ERROR telegram"}

         :if ((any $1) && ($1="translite")) do={:set $0 [($FuncAS->"translite") string=$0]}

         :set $0 [($FuncAS->"cp1251toutf8") $0]
         :log info ""; :log warning "FuncAs start telegram sending ...";
              :do {
                 [/tool fetch url="https://api.telegram.org/$botID/sendmessage\?chat_id=$myChatID&text=$Emoji $0" keep-result=no;]
                } on-error={:log error "ERROR FuncAs telegram send"; :return "ERROR telegram"}
          :log warning "FuncAs message to telegram send"; :log info "";
          :return "done telegram"
    } else={:log error "ERROR FuncAs telegram send but no message text"; :return "ERROR telegram" }
}

# part to sms from modem
:set ($FuncAS->"sms") do={
         :if ([:len $0]!=0) do={
         :local SMSdevice [/tool sms get port];
         :local NumPhone
         :global ADMINPHONE;
         :if ([:len $1]!=0) do={:set NumPhone $1} \
              else={
                     :if ([:len $ADMINPHONE]!=0) do={:set NumPhone $ADMINPHONE} \
                            else={
                                :local NumSMS [/tool sms get allowed-number];
                                     :if ([:len $NumSMS]!=0) do={:set NumPhone ($NumSMS->0)} \
                                             else={:log error "ERROR FuncAs sms phone number not found"; :return "ERROR sms"}
}}

# must be performed translite
:global FuncAS
:set $0 [($FuncAS->"translite") string=$0]


         :log info ""; :log warning "FuncAS start sms sending to $NumPhone";
             :do {
                [/tool sms send  $SMSdevice phone=$NumPhone message=$0];
                } on-error={:log error "ERROR FuncAs sms send"; :return "ERROR sms"}
          :log warning "FuncAs sms sent via modem"; :log info "";
          :return "done sms"
    } else={:log error "ERROR FuncAs sms send but no message text"; :return "ERROR sms" }
}


# part to sms from API sms.ru
# must be configured global variable $apikey for sms.ru user
;
:set ($FuncAS->"smsAPI") do={
         :if ([:len $0]!=0) do={
:local SMSanswer;
:global apikey;
:if ([:len $apikey]!=0) do={
       :local NumPhone
         :global ADMINPHONE;
         :if ([:len $1]!=0) do={:set NumPhone $1} \
              else={
                     :if ([:len $ADMINPHONE]!=0) do={:set NumPhone $ADMINPHONE} \
                            else={
                                :local NumSMS [/tool sms get allowed-number];
                                     :if ([:len $NumSMS]!=0) do={:set NumPhone ($NumSMS->0)} \
                                             else={:log error "ERROR FuncAs smsAPI phone number not found"; :return "ERROR smsAPI"}
}}

         :log info ""; :log warning "FuncAS start smsAPI sending to $NumPhone";
         :do {
         :set SMSanswer [/tool fetch url=("https://sms.ru/sms/send\?api_id="."$apikey") mode=https http-method=post http-data=("&to="."$NumPhone"."&msg="."$0"."&json=1") as-value output=user];
               } on-error={:log error "ERROR FuncAs smsAPI fetch send"; :return "ERROR smsAPI"}
          :if (($SMSanswer->"status")="finished") do={
          :local ans;
          :if ([find ($SMSanswer->"data") "ERROR"]>0) do={:set ans "ERROR smsAPI"; :log error "ERROR FuncAs smsAPI send"; :log info "";} else={:set ans "done smsAPI"; :log warning "FuncAs sms sent via API sms.ru"; :log info "";}
          :return $ans;
      } else={:log error "ERROR FuncAs smsAPI fetch to sms.ru"; :return "ERROR smsAPI"} 
    } else={:log error "ERROR FuncAs smsAPI apikey not defined"; :return "ERROR smsAPI"} 
  } else={:log error "ERROR FuncAs smsAPI send but no message text"; :return "ERROR smsAPI" }
}



# part to sms from Laurent-5G module
# must be configured Ladr, Lpass

:set ($FuncAS->"smsLT") do={
:if ([:len $0]!=0) do={
                 :local Lanswer;
                 :global Ladr
                 :global Lport
                 :global Lpass
                 :local Sport
:if (([:len $Ladr]!=0) && ([:len $Lpass]!=0)) do={
:if ([:len $0]!=0) do={
  :if ([:len $1]=0) do={:set $1 "1"}
                 :if ([:len $Lport]=0) do={:set Sport "80";} else={:set Sport $Lport;}

# must be performed translite
     :global FuncAS
     :set $0 [($FuncAS->"translite") string=$0]

# replacing a space in a line with a sign "+"
# for normal space sending
   :local string $0
   :local StrTele
   :for i from=0 to=([:len $string]-1) do={:local keys [:pick $string $i (1+$i)];
# \2B="+" or you can use \5F ("_")
         :if ($keys=" ") do={:set $code "\2B";} else={:set $code $keys};
   :set $StrTele ("$StrTele"."$code")}
   :set $0 $StrTele;

         :log info ""; :log warning "FuncAS start sms from Laurent getway sending to $1 database cell";
                                    :local StrFetchLaurent; :set StrFetchLaurent ("http://"."$Ladr".":"."$Sport"."/cmd.cgi?psw=$Lpass&cmd=SMS,"."SND".","."$1,"."C,"."$0");
                                              do {
                                      :set Lanswer ([/tool fetch url=$StrFetchLaurent mode=http as-value output=user]->"data"); 
                                                                } on-error={: log info ""; :log error ("Call ERROR function <$0> ERROR fetch command"); 
                                                                                      :local Lanswer "ERROR $0 command ROS <fetch>"; : log info ""; :return $Lanswer}
                                                     :if ($Lanswer="#SMS,SND,OK\0D\0A") do={:log warning "FuncAs sms sent via Laurent getway"; :log info ""; :return "done smsLT";} else={
                                    :if ($Lanswer="#ERR,NO_FREE_PLACE\0D\0A") do={:log info ""; :log error ("ERROR function FuncAS smsLT but no free place");
                                   :log info ""; :return "ERROR FuncAS smsLT no free place"}
                                    :if ($Lanswer="#ERR,BAD_PHN\0D\0A") do={:log info ""; :log error ("ERROR function FuncAS smsLT but invalid phone number");
                                   :log info ""; return "ERROR FuncAS smsLT bad phone number"}
    :return "ERROR smsLT unknown"}

        } else={:log info ""; :log error "ERROR FuncAs smsLT parametrs no defined"; :return "ERROR smsLT"}
   } else={:log info ""; :log error  "ERROR FuncAS smsLT Ladr or Lpass not defined"; :return "ERROR smsLT"}
 }
}





# part to sms from Netping device modem (as getway)

# [$FuncNPsendSMS "you text in utf8" "+7phonenumber"]
# должны быть определены NPadr, NPuser, NPpass

:set ($FuncAS->"smsNP") do={
:if ([:len $0]!=0) do={
:global NPadr; :global NPuser; :global NPpass;
:if (([:len $NPadr]!=0) && ([:len $NPuser]!=0) && ([:len $NPpass]!=0)) do={
:local NPanswer;
       :local NumPhone
         :global ADMINPHONE;
         :if ([:len $1]!=0) do={:set NumPhone $1} \
              else={
                     :if ([:len $ADMINPHONE]!=0) do={:set NumPhone $ADMINPHONE} \
                            else={
                                :local NumSMS [/tool sms get allowed-number];
                                     :if ([:len $NumSMS]!=0) do={:set NumPhone ($NumSMS->0)} \
                                             else={:log error "ERROR FuncAs smsNP phone number not found"; :return "ERROR smsAPI"}
}}
:if ([:pick $NumPhone 0 2]="+7") do={

# must be performed translite
:global FuncAS
:set $0 [($FuncAS->"translite") string=$0]

         :log info ""; :log warning "FuncAS start sms from Netping getway sending to $NumPhone";
:do {
:set NPanswer [/tool fetch url=("http://"."$NPadr"."/sendsms.cgi\?utf8") mode=http http-method=post http-data=("["."$NumPhone"."]"." "."$0") user=$NPuser password=$NPpass as-value output=user];
} on-error={:log error "ERROR FuncAs smsNP fetch send"; :return "ERROR smsNP"}
:if (($NPanswer->"status")="finished") do={:log warning "FuncAs sms sent via Netping getway"; :log info "";
        :set NPanswer ($NPanswer->"data"); 
:if ([:find $NPanswer "ok"]) do={:return "done smsNP"} else={:return "ERROR smsNP"}
            } else={ :return "ERROR smsNP"}
      } else={:log error "ERROR FuncAs smsNP invalid phone number format"; :return "ERROR smsNP"} 
     } else={:log error "ERROR FuncAs smsNP NPadr or NPuser or NPpass not defined"; :return "ERROR smsNP"} 
   } else={:log error "ERROR FuncAs smsNP send but no message text"; :return "ERROR smsNP" }
}


# part to e-mail
:set ($FuncAS->"email") do={
            :if ([:len $0]!=0) do={
             :global ADMINMAIL;
         :if (([:len $1]=0) && ([:len $ADMINMAIL]=0)) do={:log error "ERROR FuncAs email send E-mail address not found"; :return "ERROR email"}
              :if ([:len $1]!=0) do={} else={:set $1 $ADMINMAIL}
              :local smtpserv
              :do {
              :set smtpserv [:resolve [/tool e-mail get address]];} on-error={:log error "ERROR FuncAs email no resolve email server"; :return "ERROR email"}
              :local Eaccount [/tool e-mail get user];
              :local pass [/tool e-mail get password];
              :local Eport [/tool e-mail get port];
              :local Etls "yes"; # если не используется установить в "no";
              :log info " "; :log warning ("FuncAS start mail sending ... to e-mail: $1");
              :do {
#                   [/tool e-mail send from="<$Eaccount>" to=$1 server=$smtpserv \
#                   port=$Eport user=$Eaccount password=$pass start-tls=$Etls subject=("from FuncAS Router $[/system identity get name]\r\nMIME-Version: 1.0\r\nContent-Type: text/plain; charset=utf-8") body=$0;];
                   [/tool e-mail send from="<$Eaccount>" to=$1 server=$smtpserv \
                   port=$Eport user=$Eaccount password=$pass start-tls=$Etls subject=("from FuncAS Router $[/system identity get name]") body=$0;];
               } on-error={:log error "ERROR FuncAs email send"; :return "ERROR email"}
                   :local sendit 60
                    :while ($sendit > 0) do={:delay 1s; :set $sendit ($sendit - 1)
                    :if (([tool e-mail get last-status] = "succeeded") or ([tool e-mail get last-status] = "failed")) do={:set $sendit 0}}
                    :if ([tool e-mail get last-status] = "succeeded") do={:log warning "FuncAs message to email send"; :log info ""; :return "done email"} \
                    else={:log error "ERROR FuncAs email send"; :return "ERROR email"}
    } else={:log error "ERROR FuncAs email send but no message text"; :return "ERROR email" }
 }


# part to sms Huawey modems web API
:set ($FuncAS->"smsHW") do={
             :global ADMINPHONE;
         :if (([:len $0]>0) and ([:len $1]=0)) do={:set $1 $ADMINPHONE; :set $2 $0; :set $0 "192.168.8.1"}
         :if ([:len $2]=0) do={:set $2 "test sms via lte api"}
         :if (([:len $1]=0) && ([:len $ADMINPHONE]=0)) do={:log error "ERROR FuncAs smsHW send phone number not found"; :return "ERROR smsHW"}
         :if ([:len $1]=0) do={:set $1 $ADMINPHONE}
         :if ([:len $0]=0) do={:set $0 "192.168.8.1"}

:global FuncAS
:set $2 [($FuncAS->"translite") string=$2]

	# 	$0 - lte modem ip address
	# 	$1 - sms destination phone number
	#	$2 - sms text message

	:local getBetween do={
		# "CuriousKiwi - mikrotik forum" 
		# This is a basic parser, can be used for XML
		# It takes three parameters:
		# inputString - The main string
		# betweenStart - Text AFTER this point will be returned
		# betweenEnd - Text BEFORE this point will be returned
		:local posStart 0;
		:if ([:len $betweenStart] > 0) do={
		:set posStart [:find $inputString $betweenStart]
			:if ([:len $posStart] = 0) do={
				:set posStart 0
			} else={
				:set posStart ($posStart + [:len $betweenStart])
			}
		}

		:local posEnd 9999;
		:if ([:len $betweenEnd] > 0) do={
		:set posEnd [:find $inputString $betweenEnd];
		:if ([:len $posEnd] = 0) do={ :set posEnd 9999 }
		}

		:local result [:pick $inputString $posStart $posEnd];
		:return $result;
	}

	# get SessionID and Token via LTE modem API
	:local urlSesTokInfo "http://$0/api/webserver/SesTokInfo";
	:local api [/tool fetch $urlSesTokInfo output=user as-value]; 
	:local apiData  ($api->"data");

	# pars SessionID and Token from API session data 
	:local apiSessionID [$getBetween inputString=$apiData betweenStart="<SesInfo>" betweenEnd="</SesInfo>"];
	:local apiToken [$getBetween inputString=$apiData betweenStart="<TokInfo>" betweenEnd="</TokInfo>"];

	# header and data config
	:local apiHead "Content-Type:application/x-www-form-urlencoded,Cookie: $apiSessionID,__RequestVerificationToken:$apiToken";
	:local sendData "<?xml version=\"1.0\" encoding=\"UTF-8\"?><request><Index>-1</Index><Phones><Phone>$1</Phone></Phones><Sca></Sca><Content>$2</Content><Length>-1</Length><Reserved>1</Reserved><Date>-1</Date></request>";

	# send SMS via LTE modem API with fetch
	/tool fetch  http-method=post output=user  \
	http-header-field=$apiHead \
	url="http://$0/api/sms/send-sms" \
	http-data=$sendData;
               :return "done smsHw"
 }


# part WathsApp from Calmebot
:set ($FuncAS->"whatsap") do={
  :if ([:len $0]!=0) do={
    :global Emoji
    :global WhatsAppPhone; :if ([:len $WhatsAppPhone]=0) do={:log error "ERROR FuncAs whatsapp send phone number not found"; :return "ERROR whatsapp"}
    :global WhatsAppApiKey; :if ([:len $WhatsAppApiKey]=0) do={:log error "ERROR FuncAs whatsapp send WhatsAppApiKey not found"; :return "ERROR whatsapp"}
    :global FuncAS
   :local StrWS [($FuncAS->"cp1251toutf8") $0]
   :set StrWS ("$Emoji"."%20"."$[/system identity get name]"."%0A"."$StrWS")
   do {/tool fetch url="https://api.callmebot.com/whatsapp.php\?phone=$WhatsAppPhone&text=$StrWS&apikey=$WhatsAppApiKey" keep-result=no; :return "done whatsapp"
    } on-error={:log info; :log error "Error function $0 fetch"; :log info ""; :return "Error fetch"}
     } else={:log info; log error "Parametrs function $0 mismatch"; :log info ""; :return "Error parametrs mismatch"}    
 }


# to all channels (a psevdo recursive call is used !)
# must be the last to bypass the $0 <-->$1 effect

:set ($FuncAS->"all") do={
         :if ([:len $0]!=0) do={
        :global FuncAS;
        :global ADMINMAIL;
        :local T
        :local W
        :local E
        :local MDsms
        :local APIsms
        :local LTsms
        :local NPsms
        :local HWsms

# bypass when calling a function without keys !
        
        :if ([:typeof $0]="lookup") do={:set $0 $1; :if ((any $2) && ($2="translite")) do={:set $1 $2}}

        :set T [($FuncAS->"telegram") $0 $1]
        :set W [($FuncAS->"whatsap") $0]
        :set E [($FuncAS->"email") $0 $ADMINMAIL]
        :set MDsms [($FuncAS->"sms") $0]
        :set APIsms [($FuncAS->"smsAPI") $0]
        :set LTsms [($FuncAS->"smsLT") $0]
        :set NPsms [($FuncAS->"smsNP") $0]
        :set HWsms [($FuncAS->"smsHW") $0]
        :return [:toarray {$T;$W;$E;$MDsms;$APIsms;$LTsms;$NPsms;$HWsms}]
    } else={:log error "ERROR FuncAs all but no message text"; :return "ERROR common sending" }
}


# -------------------------------------------------------------------
# examples call:
# -------------------------------------------------------------------

# :log info "ok"

# :global FuncAS
# :log info [($FuncAS->"telegram") ("Router "."$[/system identity get name]"." test function FuncAS to Telegram Hello тест функции FuncAS для Телеграмм")]
# :log info [($FuncAS->"telegram") ("Router "."$[/system identity get name]"." test function FuncAS to Telegram Hello тест функции FuncAS для Телеграмм") "translite"]
# :log info [($FuncAS->"email") ("Router "."$[/system identity get name]"." test FuncAS to e-mail проверка") "user@gmail.com"]
# :log info [($FuncAS->"email") ("Router "."$[/system identity get name]"." test FuncAS to e-mail")]
# :log info [($FuncAS->"sms") ("Router "."$[/system identity get name]"." test function FuncAS test to SMS Привет !")]
# :log info [($FuncAS->"all") ("Router "."$[/system identity get name]"." test function FuncAS all channels")]

# exception support for Telegram
# :log info [($FuncAS->"telegram") ("text H"."\\"."\$"." @!#%'()*+,-./:;<=>?[]^_`{|}~")]

# :log info [($FuncAS->"smsAPI") "Verify for Sertik" "+79107777777"]
# :log info [($FuncAS->"smsAPI")]
# :log info [($FuncAS->"smsAPI") "смс от Микротик to you" "+79657777777"]

# exception transliteration for Telegram and send SMS modem
# :log info [($FuncAS->"smsNP") ("привет text H"."\\"."\$"." @!#%'()*+,-./:;<=>?[]^_`{|}~") "+79657777777"]

# :log info [($FuncAS->"telegram") ("Router "."$[/system identity get name]"." Привет админ ! С новым годом тебя ...") "translite"]
# :log info [$FuncAS "С новым годом !"]
# :log info [$FuncAS "С новым годом !" "translite"]

# :log info [($FuncAS->"smsLT") ("good by world") 2]
# :log info [($FuncAS->"smsLT") ("привет text H"."\\"."\$"." @!#%'()*+,-./:;<=>?[]^_`{|}~") 2]

# :log info [$FuncAS "good by world" sv_user@mail.ru]

# new ! --------------------------------------------------------------------------------------------------------------
# :log info [($FuncAS->"smsHW") 192.168.8.1 "+79104770000" "good by мама"]
# :log info [($FuncAS->"whatsap") "Hello world"]
# ----------------------------------------------------------------------------------------------------------------------

# :log info [($FuncAS->"all") ("good by world до свидания мир") "translite"]


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
_MIG_
Сообщения: 1
Зарегистрирован: 08 авг 2023, 12:53

Приветствую! на некоторых модемах huawei не работает конструкция <Date>-1</Date>

у меня заработало так

для прошивок RouterOS v7.10+

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

:global sendSMS do={
	# Example:	
	# :put [$sendSMS lteIP="192.168.8.1" phone="+34XXXXXXXXX" sms="test sms via lte api"]

    :local lteIP "192.168.8.1"

    :global tokenParser

    # get SessionID and Token via LTE modem API
    :local urlSesTokInfo "http://$lteIP/api/webserver/SesTokInfo"
    :local api [/tool fetch $urlSesTokInfo output=user as-value]
    :local apiData  ($api->"data")
      
    # parse SessionID and Token from API session data 
    :local apiSessionID [($tokenParser->"getTag") source=$apiData tag="SesInfo"]
    :local apiToken [($tokenParser->"getTag") source=$apiData tag="TokInfo"]
	
	
	 :local time;
:set time [/system clock get time];
:local date [/system clock get date];



	# header and data config
	:local apiHead "Content-Type:text/xml,Cookie: $apiSessionID,__RequestVerificationToken:$apiToken"
	:global sendData "<?xml version=\"1.0\" encoding=\"UTF-8\"?><request><Index>-1</Index><Phones><Phone>$phone</Phone></Phones><Sca></Sca><Content>$sms</Content><Length>-1</Length><Reserved>1</Reserved><Date>$date $time</Date></request>"

	# send SMS via LTE modem API with fetch
    :return [/tool fetch http-method=post http-header-field=$apiHead url="http://$lteIP/api/sms/send-sms" http-data=$sendData output=user as-value]
}
для прошивок младше RouterOS v7.10

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

:global sendSMS do={
	# Example:	
	# :put [$sendSMS lteIP="192.168.8.1" phone="+34XXXXXXXXX" sms="test sms via lte api"]

    :local lteIP "192.168.8.1"

    :global tokenParser

    # get SessionID and Token via LTE modem API
    :local urlSesTokInfo "http://$lteIP/api/webserver/SesTokInfo"
    :local api [/tool fetch $urlSesTokInfo output=user as-value]
    :local apiData  ($api->"data")
      
    # parse SessionID and Token from API session data 
    :local apiSessionID [($tokenParser->"getTag") source=$apiData tag="SesInfo"]
    :local apiToken [($tokenParser->"getTag") source=$apiData tag="TokInfo"]
	
	
	 :local time;
:set time [/system clock get time];
:local date [/system clock get date];
:local months {"jan"="01";"feb"="02";"mar"="03";"apr"="04";"may"="05";"jun"="06";"jul"="07";"aug"="08";"sep"="09";"oct"=10;"nov"=11;"dec"=12};
:local day [:pick $date 4 6];:local year [:tonum [:pick $date 7 11]];:local month [:pick $date 0 3];:local mm (:$months->$month);
:local newdate "$year-$mm-$day";


	# header and data config
	:local apiHead "Content-Type:text/xml,Cookie: $apiSessionID,__RequestVerificationToken:$apiToken"
	:global sendData "<?xml version=\"1.0\" encoding=\"UTF-8\"?><request><Index>-1</Index><Phones><Phone>$phone</Phone></Phones><Sca></Sca><Content>$sms</Content><Length>-1</Length><Reserved>1</Reserved><Date>$newdate $time</Date></request>"

	# send SMS via LTE modem API with fetch
    :return [/tool fetch http-method=post http-header-field=$apiHead url="http://$lteIP/api/sms/send-sms" http-data=$sendData output=user as-value]
}


martiniman
Сообщения: 4
Зарегистрирован: 27 ноя 2017, 19:09

Привет, если при запуске скрипта в лог вываливает код самого скрипта - значит ошибка в скрипте?


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

Никогда такого не видел. Лог в студию !


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Ответить