Telegram v 2.0 нұсқасынан Mikrotik сценарийлерін қашықтан қосу

Баршаңызға кешіккен мереке құтты болсын. Бұл тақырып жақсырақ 2016 жылы жазғандарымның нұсқасы осында.

Тұтастай алғанда, жұмыс принципі өзгерген жоқ, жалғыз айырмашылығы - қазір ол кідіріссіз бірден жұмыс істейді.

Сценарийді Микротикке жүктейміз, BotID және ChatID кодтарын өзімізге өзгертеміз және оған кесте жасаймыз. Іске қосу үшін «Бастау уақыты» параметрін орнатыңыз (Іске қосу кезінде сценарийді іске қосыңыз.)
«Интервал»: 00:00:00
Әйтпесе бәрі бұрынғыдай.

Telegram-v2

:delay 10
:global mtIdentity [/system identity get name];
:global botID "botXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXX" ;
:global myChatID "YYYYYY" ;
:local chatId 0;
:local messageId 0;


:local parse do={
  :local startLoc ([:find $content $variable -1] + [:len $variable] + 2);
  :local commaLoc ([:find $content "," $startLoc] - 1 + 1);
  :local braceLoc ([:find $content "}" $startLoc] - 1 + 1);
  :local endLoc $commaLoc;
  :local 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);
  };
  :local message [:pick $content $startLoc $endLoc]
  #:log info $message;
  :return $message;
}


:while ( true ) do={
  :do {
    #:log info "https://api.telegram.org/$botID/getUpdates?offset=$messageId&limit=1&allowed_updates=message&timeout=60";
    :tool fetch url=("https://api.telegram.org/$botID/getUpdates?offset=$messageId&limit=1&allowed_updates=message&timeout=60") dst-path="getUpdates";
    :local content [/file get [/file find name=getUpdates] contents] ;
    #:log info $content;
    :if ([:len $content] > 30) do={
      :set messageId ([$parse content=$content variable="update_id"] + 1)
      :local message [$parse content=$content variable="text" quotas=true]
      :local chat [$parse content=$content variable="chat"]
      :local chatId [$parse content=$chat variable="id"]      
      
      :if (($chatId = $myChatID) and ([/system script find name=$message] != "")) do={
        :system script run $message;
      } else={
        :tool fetch url=("https://api.telegram.org/$botID/sendmessage?chat_id=$chatId&text=$mtIdentity: Unknown command: $message") keep-result=no
      }
    }
  } on-error={}
};

Бір-екі жыл пайдаланғаннан кейін қате анықталды: белгісіз себептермен әлсіз Mikrotik сценарийді тоқтатады, бірақ одан да күштілерде ол тоқтаусыз жұмыс істейді.

Осы мақсаттар үшін мен WatchDog балдағын лақтырдым. Мұнда біз сценарийдің атын жоғарыда көрсетілгенге өзгертеміз. және қайта қосу аралығын 5 минутқа орнатыңыз. Әрбір 5 минут сайын біздің «смотрящий» сценарийді тексереді, егер ол жұмыс істемесе, оны іске қосады.

WatchDogT.me

:global scriptname "t.me"
:if ([:len [/system script job find script=$"scriptname"]] > 0) do={
:log info "$scriptname Already Running - killing old script before continuing"
:foreach counter in=[/system script job find script=$"scriptname"] do={
/system script job remove $counter
}
}
/system script run $scriptname

Ал, десертке сценарий Микротик форумынан алынды.
Журналдағы маңызды тақырыптарды арбамызға жібереді.

Біз сценарийді жоспарлау үшін қосамыз және әр 5 минут сайын қайта іске қосу аралығын көрсетеміз, BotID және ChatID идентификаторын өзімізге өзгертеміз.

Хабарландыру журналы

:global lastTime
:global output
:global mtIdentity [/system identity get name];
:global botID "botXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXX" ;
:global myChatID "YYYYYY" ;

:local LogGet [ :toarray [ /log find topics~"critical" || message~"login failure" || message~"[Ff]ailure" ] ] ;
:local LogtLineCount [ :len $LogGet ] ;
if ($LogtLineCount > 0) do={
   :local currentTime "$[ /log get [ :pick $LogGet ($LogtLineCount -1) ] time ]";
   :if ([:len $currentTime] = 10 ) do={
      :set currentTime [ :pick $currentTime 0 10 ];
   }
   :set output "$currentTime - $[/log get [ :pick $LogGet ($LogtLineCount-1) ] message ]";
   :if (([:len $lastTime] < 1) || (([:len $lastTime] > 0) && ($lastTime != $currentTime))) do={
      :set lastTime $currentTime ;
         :tool fetch url=("https://api.telegram.org/$botID/sendmessage?chat_id=$myChatID&text="$mtIdentity" :  $output") keep-result=no
   }
}

Біз нәтиже аламыз:

Telegram v 2.0 нұсқасынан Mikrotik сценарийлерін қашықтан қосу

Ақпарат көзі: www.habr.com

пікір қалдыру