Afstandaktivering van Mikrotik-skrifte vanaf Telegram

Alexander Koryukin het my tot hierdie implementering gedryf GeXoGeN met sy publikasieAfstand skakel die rekenaar gratis aan, sonder SMS en sonder wolke, met behulp van MikrotikΒ«.

En 'n opmerking in een van die VK-groepe deur Kirill Kazakov:

Ja, dit is glad nie veilig nie. Ek sal eerder 'n telegram-bot skryf wat slegs aktiveringsopdragte vanaf my rekening aanvaar.

Ek het besluit om so 'n bot te skryf.

Dus, die eerste ding om te doen is om 'n bot in telegram te skep.

  • Ons vind in die soektog 'n rekening met die naam @botfather
  • Klik op die Start-knoppie onderaan die skerm
  • Dan skryf ons vir hom die opdrag / newbot

Dan beantwoord ons 2 eenvoudige vrae:

  • Die eerste vraag is die naam van die bot wat geskep moet word. MyMikrotikROuter
  • Die tweede vraag is die bynaam van die bot wat geskep word (moet eindig met bot) MikrotikROuter_bot

In reaksie sal ons die teken van ons bot ontvang, in my geval is dit:

Gebruik hierdie teken om toegang tot die HTTP API te verkry: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Afstandaktivering van Mikrotik-skrifte vanaf Telegram
Dan moet jy ons bot in die soektog op naam vind @MikrotikROuter_bot en druk die Start-knoppie.

Daarna moet u die blaaier oopmaak en die volgende reΓ«l invoer:

 https://api.telegram.org/botXXXXXXXXXXXXXXXXXX/getUpdates

Waar XXXXXXXXXXXXXXXXXX jou bot se teken is.

'n Bladsy soortgelyk aan die volgende sal oopmaak:

Afstandaktivering van Mikrotik-skrifte vanaf Telegram

Ons vind die volgende teks daarop:

"chat":{"id":631290,

Dus, ons het al die nodige inligting om skrifte vir Mikrotik te skryf, naamlik:

Bot token: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Chat ID waar hy moet skryf: 631290

Om na te gaan, kan ons deur die blaaier gaan:

https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test

Behoort die resultaat te kry:

Afstandaktivering van Mikrotik-skrifte vanaf Telegram

Vir ons gerief sal ons onmiddellik opdragte vir die bot byvoeg:

Soek 'n rekening met 'n naam @botpa
Dan skryf ons vir hom 'n opdrag / setcommands

  • Hy sal vra watter bot

Ons skryf:
@MikrotikROuter_bot

Voeg opdragte by:

  • helloworld< β€” Toetsboodskap op klets 1
  • itsworking-toetsboodskap op klets 2
  • wolmypc-maak my rekenaar wakker

As jy nou "/" in die klets tik, behoort jy te kry:

Afstandaktivering van Mikrotik-skrifte vanaf Telegram

Kom ons gaan nou aan na MikroTik.

RouterOS het 'n konsole-hulpmiddel vir die kopiΓ«ring van lΓͺers via ftp of http / https, die hulpprogram word haal genoem, en dit is wat ons sal gebruik.

Maak oop terminale en voer in:

/tool fetch url="https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test " keep-result=no

Neem asseblief kennis dat MikroTik ""om die teken te ontsnap"?' in die URL.

Behoort die resultaat te kry:

Afstandaktivering van Mikrotik-skrifte vanaf Telegram

Kom ons gaan nou aan na skrifte:

Hello WΓͺreld

system script add name="helloworld" policy=read source={/tool fetch url="https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=Hello,world! " keep-result=no}

dit werk

system script add name="itsworking" policy=read source={/tool fetch url="https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=Test OK, it's Working " keep-result=no}

wolmypc

system script add name="wolmypc" policy=read source="/tool wol mac=XX:XX:XX:XX:XX:XX interface=ifnamer
    n/tool fetch url="https://api.telegram.org/boXXXXXXXXXXXXXXXXXXX?chat_id=631290&text=wol OK" keep-resul
    t=no"

Moenie vergeet om die korrekte Mac- en koppelvlaknaam, sowel as bot-token en chat_id, te spesifiseer nie.

Nou sal ek 'n bietjie verduidelik wat hulle doen:

Die "helloworld"-skrif stuur 'n boodskap: "Hallo, wΓͺreld!" na ons geselsie met die bot.
Die "itsworking"-skrif stuur 'n boodskap: "Toets OK, dit werk!" na ons geselsie met die bot.
Hierdie skrifte is vir demonstrasiedoeleindes.
Ek het die "wolmypc" skrif bygevoeg as een van die moontlike implementerings.
By die uitvoering van die skrif, sal die bot "wol OK" vir die klets skryf.
Trouens, jy kan absoluut enige skrif uitvoer.

Skep 'n taak:

Telegram.src

/system scheduler
add interval=30s name=Telegram on-event=":tool fetch url=("https://api.telegr
    am.org/".$botID."/getUpdates") ;r
    n:global content [/file get [/file find name=getUpdates] contents] ;r
    n:global startLoc 0;r
    n:global endLoc 0;r
    nr
    n:if ( [/file get [/file find name=getUpdates] size] > 50 ) do={r
    nr
    n:set startLoc  [:find $content "update_id" $lastEnd ] ;r
    n:set startLoc ( $startLoc + 11 ) ;r
    n:local endLoc [:find $content "," $startLoc] ;r
    n:local messageId ([:pick $content $startLoc $endLoc] + (1));r
    n:put [$messageId] ;r
    n:#log info message="updateID $messageId" ;r
    nr
    n:set startLoc  [:find $content "text" $lastEnd ] ;r
    n:set startLoc ( $startLoc  + 7 ) ;r
    n:local endLoc [:find $content "," ($startLoc)] ;r
    n:set endLoc ( $endLoc - 1 ) ;r
    n:local message [:pick $content ($startLoc + 2) $endLoc] ;r
    n:put [$message] ;r
    n:#log info message="message $message ";r
    nr
    n:set startLoc  [:find $content "chat" $lastEnd ] ;r
    n:set startLoc ( $startLoc + 12 ) ;r
    n:local endLoc [:find $content "," $startLoc] ;r
    n:local chatId ([:pick $content $startLoc $endLoc]);r
    n:put [$chatId] ;r
    n:#log info message="chatID $chatId ";r
    nr
    n:if (($chatId = $myChatID) and (:put [/system script find name=$messa
    ge] != "")) do={r
    n:system script run $message} else={:tool fetch url=("https://api.teleg
    ram.org/".$botID."/sendmessage?chat_id=".$chatId."&text=I can't t
    alk with you. ") keep-result=no} ;r
    n:tool fetch url=("https://api.telegram.org/".$botID."/getUpdates?
    offset=$messageId") keep-result=no; r
    n} r
    n" policy=
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon 
    start-date=nov/02/2010 start-time=00:00:00
	
add name=Telegram-startup on-event=":delay 5r
    n:global botID "botXXXXXXXXXXXXXXXXXX" ;r
    n:global myChatID "631290" ;r
    n:global startLoc 0;r
    n:global endLoc 0;r
    n:tool fetch url=("https://api.telegram.org/".$botID."/getUpdates") 
    ;" policy=
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon 
    start-time=startup

Leesbare aansigdit is nie duidelik hoekom nie, maar uit die werkende skrif maak dit nie globale data bekend nie, het die skrif bygevoeg wanneer die stelsel begin.
Telegram begin

:delay 5
:global botID "botXXXXXXXXXXXXXXXXXX" ;   token bot
:global myChatID "xxxxxx" ;                               chat_id
:global startLoc 0;
:global endLoc 0;
:tool fetch url=("https://api.telegram.org/".$botID."/getUpdates") ;

telegram

:tool fetch url=("https://api.telegram.org/".$botID."/getUpdates") ;
:global content [/file get [/file find name=getUpdates] contents] ;
:global startLoc 0;
:global endLoc 0;

:if ( [/file get [/file find name=getUpdates] size] > 50 ) do={

:set startLoc  [:find $content "update_id" $lastEnd ] ;
:set startLoc ( $startLoc + 11 ) ;
:local endLoc [:find $content "," $startLoc] ;
:local messageId ([:pick $content $startLoc $endLoc] + (1));
:put [$messageId] ;
#:log info message="updateID $messageId" ;

:set startLoc  [:find $content "text" $lastEnd ] ;
:set startLoc ( $startLoc  + 7 ) ;
:local endLoc [:find $content "," ($startLoc)] ;
:set endLoc ( $endLoc - 1 ) ;
:local message [:pick $content ($startLoc + 2) $endLoc] ;
:put [$message] ;
#:log info message="message $message ";

:set startLoc  [:find $content "chat" $lastEnd ] ;
:set startLoc ( $startLoc + 12 ) ;
:local endLoc [:find $content "," $startLoc] ;
:local chatId ([:pick $content $startLoc $endLoc]);
:put [$chatId] ;
#:log info message="chatID $chatId ";

:if (($chatId = $myChatID) and (:put [/system script find name=$message] != "")) do={
:system script run $message} else={:tool fetch url=("https://api.telegram.org/".$botID."/sendmessage?chat_id=".$chatId."&text=I can't talk with you. ") keep-result=no} ;
:tool fetch url=("https://api.telegram.org/".$botID."/getUpdates?offset=$messageId") keep-result=no; 
} 

Hoe werk dit

Laai ons "getUpdates"-boodskappe elke 30 sekondes af en ontleed dan om uit te vind update_id (boodskapnommer) en teks (ons spanne) en chat_id . By verstek vertoon getUpdates van 1 tot 100 boodskappe, vir gerief, nadat ons die opdrag gelees het, vee ons die boodskap uit. Telegram api sΓͺ om 'n boodskap te lees, benodig jy die boodskapnommer + 1

/getUpdates?offset=update_id + 1

Alles getoets op Mikrotik rb915 RouterOS 6.37.1
As jy baie opdragte gelyktydig stuur, sal hulle almal om die beurt met 'n interval van 30 sekondes uitgevoer word.

NS Baie dankie aan Kirill Kazakov vir die idee en my vriend Alexander vir hulp met die draaiboeke.

verwysings

habrahabr.ru/post/313794
1spla.ru/index.php/blog/telegram_bot_for_mikrotik
core.telegram.org/bots/api
wiki.mikrotik.com/wiki/Manual: Skripsie

upd:

03:11:16

Verbeterde skrifte:

Bygevoeg tjek vir chat_id
Kyk vir 'n dwaas, as iemand aan ons bot skryf, sal hy hom antwoord: "Ek kan nie met jou praat nie. β€œ, sal ons insgelyks antwoord as dit nie die opdrag herken nie.
Nadat die opdrag uitgevoer is, teken die bot uit by die klets (sien wolmypc-skrif)

DUP

Gevind met 7 Stuntman7 dat 'n lΓͺer met bogenoemde ~14 boodskappe nie meer deur die vind-opdrag verwerk word nie (Mikrotik-beperkings). Daarom sal ek in die toekoms die draaiboek na lua verander, dankie 7 Stuntman7 hiervoor het ek nie geweet van lua nie.

UPD 08.12.2016/XNUMX/XNUMX

in Telegram het hulle blykbaar die "uitlaat" van getUpdate effens verander. nou in die hoofskrif moet jy die boodskapverskuiwing van 2 na 1 regstel

veranderinge

:local message [:pick $content ($startLoc + 2) $endLoc] ;

Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π° :

:local message [:pick $content ($startLoc + 1) $endLoc] ;

Bron: will.com