Diese Implementierung wurde von Alexander Korjukin angeregt. seiner Veröffentlichung „«.
Und ein Kommentar in einer der VK-Gruppen von Kirill Kazakov:
Naja, das ist wirklich nicht sicher. Ich würde lieber einen Telegram-Bot schreiben, der nur von meinem Account Befehle zum Einschalten annimmt.
Ich habe beschlossen, so einen Bot zu schreiben.
Also, das erste, was zu tun ist, ist, einen Bot in Telegram zu erstellen.
- Wir suchen im Verzeichnis nach dem Account mit dem Namen @botfather
- Wir drücken auf die Schaltfläche Start am unteren Bildschirmrand
- Daraufhin schreiben wir ihm den Befehl /newbot
Dann beantworten wir 2 einfache Fragen:
- Die erste Frage – der Name des zu erstellenden Bots MyMikrotikROuter
- Die zweite Frage – der Nickname des zu erstellenden Bots (muss mit _bot enden) MikrotikROuter_bot
Daraufhin erhalten wir das Token unseres Bots, in meinem Fall ist das:
Verwenden Sie dieses Token, um auf die HTTP-API zuzugreifen: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Danach müssen wir unseren Bot im Verzeichnis nach dem Namen suchen @MikrotikROuter_bot und auf die Schaltfläche Start klicken.
Damit müssen wir den Browser öffnen und die folgende Zeile eingeben:
https://api.telegram.org/botXXXXXXXXXXXXXXXXXX/getUpdates
Wo XXXXXXXXXXXXXXXXXX – das Token Ihres Bots ist.
Es öffnet sich eine Seite in etwa folgendem Aussehen:

Wir suchen auf dieser Seite nach folgendem Text:
„chat“:{„id“:631290,
Also, wir haben alle notwendigen Informationen für das Schreiben von Skripten für Mikrotik, nämlich:
Bot-Token: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
Chat-ID, an die er schreiben soll: 631290
Zur Überprüfung können wir über den Browser darauf zugreifen:
https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test
Wir sollten das Ergebnis erhalten:

Für unseren Komfort fügen wir sofort Befehle für den Bot hinzu:
Wir suchen nach dem Account mit dem Namen @botfather
Daraufhin schreiben wir ihm den Befehl /setcommands
- Er wird fragen, zu welchem Bot
Wir schreiben:
@MikrotikROuter_bot
Wir fügen die Befehle hinzu:
- helloworld< — Testnachricht im Chat 1
- itsworking — Testnachricht im Chat 2
- wolmypc — Wecke meinen PC auf
Jetzt sollten wir, wenn wir im Chat „/“ eingeben, folgendes erhalten:

Jetzt gehen wir zu MikroTik.
In RouterOS gibt es ein Konsolenwerkzeug zum Kopieren von Dateien über ftp oder http/https, das Tool heißt fetch, genau das werden wir verwenden.
Wir öffnen terminal und geben ein:
/tool fetch url="https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test " keep-result=no
Bitte beachten Sie, dass in MikroTik ein " nötig ist, um das Zeichen " im URL zu maskieren.Jetzt gehen wir zu den Skripten:?helloworld
Wir sollten das Ergebnis erhalten:

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}
itsworking
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
Systemskript hinzufügen name="itsworking" richtlinie=lesen quelle={/tool fetch url="https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=Test OK, es funktioniert " 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"
Vergessen Sie nicht, die richtige MAC-Adresse und den Namen des Interfaces sowie das Bot-Token und die chat_id anzugeben.
Nun erkläre ich kurz, was sie tun:
Das Skript „helloworld“ sendet die Nachricht: „Hello, world!“ in unseren Chat mit dem Bot.
Das Skript „itsworking“ sendet die Nachricht: „Test OK, es funktioniert!“ in unseren Chat mit dem Bot.
Diese Skripte zur Demonstration der Funktionalität.
Ich habe das Skript „wolmypc“ als eine der möglichen Implementierungen hinzugefügt.
Nach der Ausführung des Skripts wird der Bot im Chat „wol OK“ schreiben.
In der Tat kann man absolut jedes Skript ausführen.
Wir erstellen eine Aufgabe:
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
Lesbare AnsichtEs ist unklar, warum das funktionierende Skript keine globalen Daten meldet, ich habe das Skript beim Systemstart hinzugefügt.
Telegram-startup
: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=Ich kann nicht mit dir reden. ") keep-result=no} ;
:tool fetch url=("https://api.telegram.org/".$botID."/getUpdates?offset=$messageId") keep-result=no;
}
Die DANE-Spezifikation ist in
Wir laden unsere Nachrichten „getUpdates“ alle 30 Sekunden herunter und analysieren sie, um zu erfahren update_id (die Nachrichtenummer) und text (unsere Befehle) und chat_id . Standardmäßig gibt getUpdates zwischen 1 und 100 Nachrichten aus, zur Vereinfachung löschen wir die Nachricht nach dem Lesen des Befehls. In der Telegram-API steht, um eine Nachricht zu lesen, benötigt man die Nachrichtenummer + 1
/getUpdates?offset=update_id + 1
Alles wurde auf Mikrotik RB915 RouterOS 6.37.1 überprüft
Wenn man viele Befehle sofort sendet, werden sie nacheinander mit einem Intervall von 30 Sekunden ausgeführt.
P.S. Vielen Dank an Kirill Kazakov für die Idee und an meinen Freund Alexander für die Hilfe mit den Skripten.
Links
:Scripting
upd:
03:11:16
Ich habe die Skripte überarbeitet:
Eine Überprüfung auf chat_id hinzugefügt
Eine Überprüfung auf Fehler, falls jemand unserem Bot schreibt, wird er antworten: » Ich kann nicht mit Ihnen sprechen. «, und wird uns ähnlich antworten, wenn er den Befehl nicht erkennt.
Nach Ausführung des Befehls berichtet der Bot im Chat (siehe Skript wolmypc)
UPD
Wir fanden heraus, dass dass die Datei mit mehr als ~ 14 Nachrichten aufhört, vom Befehl find verarbeitet zu werden (Mikrotik-Einschränkungen). Deshalb werde ich das Skript in Zukunft auf Lua umschreiben, danke dafür, ich wusste nichts über Lua.
UPD 08.12.2016
offensichtlich haben sie im Telegram etwas am „Ausgang“ von getUpdate geändert. Jetzt muss im Hauptskript die Nachrichtenverschiebung von 2 auf 1 geändert werden
Änderungen
:local message [:pick $content ($startLoc + 2) $endLoc] ;
ersetzen durch:
:local message [:pick $content ($startLoc + 1) $endLoc] ;
Quelle: habr.com
