Ji Telegramê ji dûr ve çalakkirina nivîsarên Mikrotik

Alexander Koryukin ez ji bo vê pêkanînê dehf kir GeXoGeN bi weşana xwe"Bi karanîna Mikrotik ji dûr ve komputera xwe belaş, bê SMS û bê ewr vekin".

Û şîroveyek di yek ji komên VK de ji hêla Kirill Kazakov ve:

Erê, ew qet ne ewle ye. Ez tercîh dikim botek telegramê binivîsim ku tenê fermanên çalakkirinê ji hesabê min qebûl dike.

Min biryar da ku botek weha binivîsim.

Ji ber vê yekê, yekem tiştê ku divê hûn bikin ev e ku di telegramê de botek çêbikin.

  • Em di lêgerînê de hesabek bi navê @botfather dibînin
  • Bişkojka Destpêkê ya li binê ekranê bikirtînin
  • Dûv re em fermana /newbot jê re dinivîsin

Paşê em bersiva 2 pirsên hêsan didin:

  • Pirsa yekem navê bota ku tê çêkirin e MyMikrotikROuter
  • Pirsa duyemîn paşnavê bota ku tê afirandin e (divê bi botê biqede) MikrotikROuter_bot

Di bersivê de, em ê nîşana bota xwe bistînin, di doza min de ev e:

Vê nîşanê bikar bînin ku hûn bigihîjin HTTP API: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Ji Telegramê ji dûr ve çalakkirina nivîsarên Mikrotik
Dûv re, hûn hewce ne ku di nav lêgerînê de bota me bibînin @MikrotikROuter_bot û bişkojka Destpêkê bikirtînin.

Piştî vê yekê, hûn hewce ne ku geroka xwe vekin û rêza jêrîn têkevin:

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

Li ku derê XXXXXXXXXXXXXXXXXXX nîşana bota we ye.

Rûpelek mîna ya jêrîn dê vebe:

Ji Telegramê ji dûr ve çalakkirina nivîsarên Mikrotik

Em li ser wê nivîsa jêrîn dibînin:

"chat":{"id":631290,

Ji ber vê yekê, me hemî agahdariya pêwîst ji bo nivîsandina nivîsarên ji bo Mikrotik heye, bi navê:

Nîşana botê: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Nasnameya Chat ku divê ew binivîsîne: 631290

Ji bo kontrolkirinê, em dikarin bi gerokê re biçin:

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

Divê hûn encamê bistînin:

Ji Telegramê ji dûr ve çalakkirina nivîsarên Mikrotik

Ji bo rehetiya me, em tavilê fermanan ji bo botê zêde bikin:

Dîtina hesabek bi navê @botfather
Paşê em jê re fermanek dinivîsin / setcommands

  • Ew ê bipirse kîjan bot

Em dinivîsin:
@MikrotikROuter_bot

Zêdekirina fermanan:

  • helloworld< — Peyama ceribandinê li ser chat 1
  • dixebite - Peyama Testê li ser chat 2
  • wolmypc - PC-ya min hişyar bike

Naha heke hûn di chatê de "/" binivîsin, divê hûn bistînin:

Ji Telegramê ji dûr ve çalakkirina nivîsarên Mikrotik

Naha em werin ser MikroTik.

RouterOS ji bo kopîkirina pelan bi ftp an http/https ve amûrek konsolê heye, jê re fetch tê gotin, ya ku em ê bikar bînin ev e.

Vekirî termînal û têkevin:

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

Ji kerema xwe not bikin ku MikroTik hewce dike ""ji nîşanê revîn"?" di URL-ê de.

Divê hûn encamê bistînin:

Ji Telegramê ji dûr ve çalakkirina nivîsarên Mikrotik

Naha em biçin ser senaryoyan:

silav dinyayê

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}

karê xwe dike

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"

Ji bîr nekin ku navê mac û navrûyê rast, û hem jî bot-token û chat_id diyar bikin.

Niha ez ê hinekî rave bikim ka ew çi dikin:

Nivîsara "helloworld" peyamê dişîne: "Silav, cîhan!" sohbeta me ya bi botê re.
Skrîpta "itsworking" peyamê dişîne: "Têk test bike, ew dixebite!" sohbeta me ya bi botê re.
Ev senaryo ji bo nîşandana xebatê ne.
Min skrîpta "wolmypc" wekî yek ji pêkanînên gengaz lê zêde kir.
Dema ku senaryo qediya, bot dê li ser chatê "wol OK" binivîse.
Bi rastî, hûn dikarin bi tevahî her skrîptê bimeşînin.

Karûbarek çêbikin:

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

Dîtina xwendinêNe diyar e çima, lê ew daneyên gerdûnî ji skrîpta xebatê ranagihîne, dema ku pergalê dest pê dike skrîpt hate zêdekirin.
Telegram-destpêk

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

Têlxiram

: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; 
} 

Çawa ev karê

Em her 30 saniyeyan carekê peyamên xwe yên "getUpdates" dakêşin, dûv re wan parsek dikin da ku fêr bibin update_id (hejmara peyamê) û nivîstok (tîmên me) û chat_id . Ji hêla xwerû, getUpdates ji bo rehetiyê ji 1 heta 100 peyaman nîşan dide, piştî xwendina fermanê, peyam tê jêbirin. api ya Telegram dibêje ku ji bo xwendina peyamekê hûn hewceyê jimareya peyamê + 1 in

/getUpdates?offset=update_id + 1

Her tişt li ser Mikrotik rb915 RouterOS 6.37.1 ceribandin
Ger hûn di yek carê de gelek fermanan bişînin, ew ê hemî yek bi yek bi navberek 30 saniyeyî bêne darve kirin.

PS Gelek spas ji Kirill Kazakov re ji bo ramanê û ji hevalê min Alexander re ji bo alîkariya wî ya bi senaryoyan.

references

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

nûkirin:

03:11:16

Nivîsarên çêtir:

Ji bo chat_id kontrol zêde kirin
Bêaqil kontrol bikin, ger kesek ji bota me re binivîsîne, ew ê bersivê bide wî: "Ez nikarim bi te re biaxivim." “, ger fermanê nas neke dê bi heman awayî bersiva me bide.
Piştî pêkanîna fermanê, bot ji sohbetê vediqete (li skrîpta wolmypc binêre)

DUP

Bi dîtin 7 Stuntman7 ku pelek bi jorîn ~ 14 peyaman êdî bi fermana lêgerînê (sînorkirinên Mikrotik) nayê pêvajo kirin. Ji ber vê yekê, di pêşerojê de ez ê senaryoyê li lua ji nû ve bikim, spas 7 Stuntman7 ji bo vê, min li ser lua nizanibû.

UPD 08.12.2016/XNUMX/XNUMX

Telegram xuya ye ku getUpdate "exhaust" hinekî guhert. Naha di skrîpta bingehîn de hûn hewce ne ku ji 2 ber 1 veqetandina peyamê rast bikin

guhertin

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

заменить на :

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

Source: www.habr.com