Telegram からの Mikrotik スクリプトのリモートアクティベーション

Alexander Ko Ryukin が私にこの実装を勧めてくれました ゲソゲン 彼の出版物とともにMikrotik を使用して、SMS やクラウドを使用せずに、リモートでコンピュータを無料で起動します"

そして、キリル・カザコフによる VK グループの XNUMX つでのコメント:

はい、全然安全ではありません。 むしろ、自分のアカウントからのアクティブ化コマンドのみを受け入れる電報ボットを作成したいと考えています。

そんなbotを書いてみることにしました。

したがって、最初に行うことは、Telegram でボットを作成することです。

  • 検索で @botfather という名前のアカウントが見つかりました
  • 画面下部の「スタート」ボタンをクリックします
  • 次に、コマンド / newbot を彼に書きます。

次に、2 つの簡単な質問に答えます。

  • 最初の質問は、作成するボットの名前です。 MyMikrotikRアウター
  • XNUMX 番目の質問は、作成されるボットのニックネームです (ボットで終わる必要があります)。 MikrotikROuter_bot

応答として、ボットのトークンを受け取ります。私の場合、それは次のとおりです。

このトークンを使用して HTTP API にアクセスします。 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Telegram からの Mikrotik スクリプトのリモートアクティベーション
次に、名前による検索でボットを見つける必要があります。 @MikrotikROuter_botを選択してスタートボタンを押します。

その後、ブラウザを開いて次の行を入力する必要があります。

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

XXXXXXXXXXXXXXXXXX はボットのトークンです。

次のようなページが開きます。

Telegram からの Mikrotik スクリプトのリモートアクティベーション

そこには次のような文章が見つかります。

"チャット":{"id":631290,

したがって、Mikrotik のスクリプトを作成するために必要な情報はすべて揃っています。

ボットトークン: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

チャット ID を記入する場所: 631290

確認するには、ブラウザを使用します。

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

結果が得られるはずです:

Telegram からの Mikrotik スクリプトのリモートアクティベーション

便宜上、ボットのコマンドをすぐに追加します。

名前の付いたアカウントを探す @ボットファーザー
それから私たちは彼に命令を書きます / setcommands

  • 彼はどのボットかを尋ねます

私たちは書く:
@MikrotikROuter_bot

コマンドを追加します。

  • helloworld< — チャット 1 のテスト メッセージ
  • itsworking-チャット 2 のテスト メッセージ
  • wolmypc - PC を起動します

ここで、チャットに「/」を入力すると、次の結果が得られます。

Telegram からの Mikrotik スクリプトのリモートアクティベーション

さて、MikroTikの話に移りましょう。

RouterOS には、ftp または http / https 経由でファイルをコピーするためのコンソール ユーティリティがあり、このユーティリティは fetch と呼ばれ、これを使用します。

開く ターミナル そして次のように入力します:

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

MikroTik には「」が必要であることに注意してください。» 標識から逃れるために «?URL に ' が含まれています。

結果が得られるはずです:

Telegram からの Mikrotik スクリプトのリモートアクティベーション

次に、スクリプトに移りましょう。

こんにちは世界

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}

それは働いています

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}

ウォルミーパソコン

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"

正しい Mac 名とインターフェイス名、さらに bot-token と chat_id を指定することを忘れないでください。

ここで、それらが何をするのか少し説明します。

「helloworld」スクリプトは、「Hello, world!」というメッセージを送信します。 ボットとのチャットに。
「itsworking」スクリプトは、「テストは正常に動作しています!」というメッセージを送信します。 ボットとのチャットに。
これらのスクリプトはデモンストレーションを目的としています。
可能な実装の XNUMX つとして「wolmypc」スクリプトを追加しました。
スクリプトを実行すると、ボットはチャットに「wol OK」を書き込みます。
実際、どんなスクリプトでも実行できます。

タスクを作成します。

テレグラム.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

読み取り可能なビュー理由は明らかではありませんが、作業中のスクリプトからはグローバル データが開示されておらず、システムの起動時にスクリプトが追加されました。
テレグラムの起動

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

これはどう動かすのですか

「getUpdates」メッセージを 30 秒ごとにダウンロードし、解析して調べます。 更新ID (メッセージ番号) と 클라우드 기반 AI/ML및 고성능 컴퓨팅을 통한 디지털 트윈의 기초 – Edward Hsu, Rescale CPO 많은 엔지니어링 중심 기업에게 클라우드는 R&D디지털 전환의 첫 단계일 뿐입니다. 클라우드 자원을 활용해 엔지니어링 팀의 제약을 해결하는 단계를 넘어, 시뮬레이션 운영을 통합하고 최적화하며, 궁극적으로는 모델 기반의 협업과 의사 결정을 지원하여 신제품을 결정할 때 데이터 기반 엔지니어링을 적용하고자 합니다. Rescale은 이러한 혁신을 돕기 위해 컴퓨팅 추천 엔진, 통합 데이터 패브릭, 메타데이터 관리 등을 개발하고 있습니다. 이번 자리를 빌려 비즈니스 경쟁력 제고를 위한 디지털 트윈 및 디지털 스레드 전략 개발 방법에 대한 인사이트를 나누고자 합니다. (私たちのチーム)そして チャットID 。 デフォルトでは、getUpdates は 1 ~ 100 のメッセージを表示しますが、便宜上、コマンドを読み取った後、メッセージを削除します。 Telegram API は、メッセージを読むにはメッセージ番号 + 1 が必要であると言っています

/getUpdates?offset=update_id + 1

すべて Mikrotik rb915 RouterOS 6.37.1 でテスト済み
一度に多くのコマンドを送信すると、それらはすべて 30 秒間隔で順番に実行されます。

PS アイデアをくれた Kirill Kazakov と、スクリプトを手伝ってくれた友人の Alexander に感謝します。

リファレンス

habrahabr.ru/post/313794
1spla.ru/index.php/blog/telegram_bot_for_mikrotik
core.telegram.org/bots/api
wiki.mikrotik.com/wiki/マニュアル:スクリプト

更新日:

03:11:16

改善されたスクリプト:

chat_id のチェックを追加しました
愚か者かどうか確認して、もし誰かが私たちのボットに手紙を書いたら、彼はこう答えるでしょう、「あなたとは話せません。 」とコマンドを認識しない場合も同様に応答します。
コマンドの実行後、ボットはチャットの購読を解除します (wolmypc スクリプトを参照)

UPD

で見つかりました 7スタントマン7 最大 14 個を超えるメッセージを含むファイルは find コマンドで処理されなくなりました (Mikrotik の制限)。 したがって、今後はスクリプトを lua に変更します。ありがとう 7スタントマン7 そのため、私は lua について知りませんでした。

UPD 08.12.2016

Telegram では、どうやら getUpdate の「排気」をわずかに変更したようです。 ここで、メイン スクリプトでメッセージ オフセットを 2 から 1 に修正する必要があります。

変更

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

заменить на :

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

出所: habr.com