ٹیلیگرام سے میکروٹک اسکرپٹس کی ریموٹ ایکٹیویشن

الیگزینڈر کوریوکن نے مجھے اس عمل کی طرف دھکیل دیا۔ GeXoGeN اس کی اشاعت کے ساتھMikrotik کا استعمال کرتے ہوئے، بغیر SMS کے اور بادلوں کے بغیر کمپیوٹر کو ریموٹ سے آن کرنا".

اور VK گروپوں میں سے ایک میں کیرل کازاکوف کا تبصرہ:

ہاں، یہ بالکل بھی محفوظ نہیں ہے۔ میں اس کے بجائے ایک ٹیلیگرام بوٹ لکھوں گا جو صرف میرے اکاؤنٹ سے ایکٹیویشن کمانڈز کو قبول کرتا ہے۔

میں نے ایسا بوٹ لکھنے کا فیصلہ کیا۔

لہذا، سب سے پہلے ٹیلیگرام میں بوٹ بنانا ہے۔

  • ہمیں تلاش میں @botfather کے نام سے ایک اکاؤنٹ ملتا ہے۔
  • اسکرین کے نیچے اسٹارٹ بٹن پر کلک کریں۔
  • پھر ہم اسے کمانڈ / نیو بوٹ لکھتے ہیں۔

پھر ہم 2 آسان سوالات کے جواب دیتے ہیں:

  • پہلا سوال اس بوٹ کا نام ہے جسے بنایا جائے گا۔ MyMikrotikROuter
  • دوسرا سوال بوٹ کی تخلیق کا عرفی نام ہے (بوٹ کے ساتھ ختم ہونا چاہئے) MikrotikROuter_bot

جواب میں، ہمیں اپنے بوٹ کا ٹوکن ملے گا، میرے معاملے میں یہ ہے:

HTTP API تک رسائی کے لیے یہ ٹوکن استعمال کریں: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

ٹیلیگرام سے میکروٹک اسکرپٹس کی ریموٹ ایکٹیویشن
اس کے بعد، آپ کو نام کے ذریعہ تلاش میں ہمارے بوٹ کو تلاش کرنے کی ضرورت ہے۔ @MikrotikROuter_bot اور اسٹارٹ بٹن دبائیں۔

اس کے بعد، آپ کو براؤزر کھولنے اور درج ذیل لائن کو داخل کرنے کی ضرورت ہے:

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

جہاں XXXXXXXXXXXXXXXXXX آپ کے بوٹ کا ٹوکن ہے۔

مندرجہ ذیل کی طرح ایک صفحہ کھلے گا:

ٹیلیگرام سے میکروٹک اسکرپٹس کی ریموٹ ایکٹیویشن

ہمیں اس پر درج ذیل عبارت ملتی ہے:

"chat":{"id":631290,

لہذا، ہمارے پاس Mikrotik کے لیے اسکرپٹ لکھنے کے لیے تمام ضروری معلومات ہیں، یعنی:

بوٹ ٹوکن: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

چیٹ آئی ڈی جہاں اسے لکھنا چاہیے: 631290

چیک کرنے کے لیے، ہم براؤزر کے ذریعے جا سکتے ہیں:

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

نتیجہ حاصل کرنا چاہئے:

ٹیلیگرام سے میکروٹک اسکرپٹس کی ریموٹ ایکٹیویشن

ہماری سہولت کے لیے، ہم فوری طور پر بوٹ کے لیے کمانڈز شامل کریں گے:

نام کے ساتھ اکاؤنٹ تلاش کرنا @botfather
پھر ہم اسے ایک حکم لکھتے ہیں۔ / سیٹ کامانڈز

  • وہ پوچھے گا کہ کون سا بوٹ ہے۔

ہم لکھتے ہیں:
@MikrotikROuter_bot

کمانڈز شامل کریں:

  • helloworld< — چیٹ 1 پر ٹیسٹ پیغام
  • چیٹ 2 پر اس کا ورکنگ ٹیسٹ پیغام
  • wolmypc - میرے پی سی کو جگا دو

اب اگر آپ چیٹ میں "/" ٹائپ کرتے ہیں، تو آپ کو ملنا چاہیے:

ٹیلیگرام سے میکروٹک اسکرپٹس کی ریموٹ ایکٹیویشن

اب آئیے 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 میں۔

نتیجہ حاصل کرنا چاہئے:

ٹیلیگرام سے میکروٹک اسکرپٹس کی ریموٹ ایکٹیویشن

اب اسکرپٹس کی طرف چلتے ہیں:

helloworld

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}

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"

درست میک اور انٹرفیس نام کے ساتھ ساتھ بوٹ ٹوکن اور chat_id بتانا نہ بھولیں۔

اب میں تھوڑی وضاحت کروں گا کہ وہ کیا کرتے ہیں:

"ہیلو ورلڈ" اسکرپٹ ایک پیغام بھیجتا ہے: "ہیلو، دنیا!" بوٹ کے ساتھ ہماری بات چیت کے لیے۔
"اس کا کام کرنے والا" اسکرپٹ ایک پیغام بھیجتا ہے: "ٹیسٹ ٹھیک ہے، یہ کام کر رہا ہے!" بوٹ کے ساتھ ہماری بات چیت کے لیے۔
یہ اسکرپٹ مظاہرے کے مقاصد کے لیے ہیں۔
میں نے "wolmypc" اسکرپٹ کو ممکنہ نفاذ میں سے ایک کے طور پر شامل کیا۔
اسکرپٹ پر عمل درآمد پر، بوٹ چیٹ پر "wol OK" لکھے گا۔
درحقیقت، آپ بالکل کسی بھی اسکرپٹ کو چلا سکتے ہیں۔

ایک کام بنائیں:

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

پڑھنے کے قابل منظریہ واضح نہیں ہے کہ کیوں، لیکن ورکنگ اسکرپٹ سے یہ عالمی ڈیٹا کو ظاہر نہیں کرتا، جب سسٹم بوٹ ہوتا ہے تو اسکرپٹ کو شامل کیا جاتا ہے۔
ٹیلیگرام اسٹارٹ اپ

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

تار

: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 سیکنڈ میں ڈاؤن لوڈ کریں، پھر تلاش کرنے کے لیے تجزیہ کریں۔ update_id (پیغام نمبر) اور متن (ہماری ٹیمیں) اور chat_id . پہلے سے طے شدہ طور پر، getUpdates 1 سے 100 پیغامات دکھاتا ہے، سہولت کے لیے، کمانڈ کو پڑھنے کے بعد، ہم پیغام کو حذف کر دیتے ہیں۔ ٹیلیگرام اے پی آئی کہتا ہے کہ کوئی پیغام پڑھنے کے لیے آپ کو میسج نمبر + 1 کی ضرورت ہے۔

/getUpdates?offset=update_id + 1

Mikrotik rb915 RouterOS 6.37.1 پر تمام ٹیسٹ کیے گئے۔
اگر آپ ایک ساتھ کئی کمانڈز بھیجتے ہیں، تو ان سب کو 30 سیکنڈ کے وقفے کے ساتھ بدل دیا جائے گا۔

PS اس آئیڈیا کے لیے کرل کازاکوف اور اسکرپٹ میں مدد کے لیے میرے دوست الیگزینڈر کا بہت شکریہ۔

حوالہ جات

habrahabr.ru/post/313794
1spla.ru/index.php/blog/telegram_bot_for_mikrotik
core.telegram.org/bots/api
wiki.mikrotik.com/wiki/Manual: اسکرپٹنگ

upd:

03:11:16

بہتر اسکرپٹس:

chat_id کے لیے چیک شامل کر دیا گیا۔
بیوقوف کی جانچ پڑتال کرتے ہوئے، اگر کوئی ہمارے بوٹ کو لکھتا ہے، تو وہ اسے جواب دے گا: "میں آپ سے بات نہیں کر سکتا۔ "، اسی طرح ہمیں جواب دے گا اگر یہ کمانڈ کو نہیں پہچانتا ہے۔
کمانڈ پر عمل کرنے کے بعد، بوٹ چیٹ کی رکنیت ختم کر دیتا ہے (وولمی پی سی اسکرپٹ دیکھیں)

یو پی ڈی

کے ساتھ ملا 7 اسٹنٹ مین7 کہ اوپر ~ 14 پیغامات والی فائل پر فائنڈ کمانڈ (Mikrotik حدود) کے ذریعے مزید کارروائی نہیں کی جاتی ہے۔ لہذا، مستقبل میں، میں سکرپٹ کو lua میں تبدیل کروں گا، شکریہ 7 اسٹنٹ مین7 اس کے لیے میں لوا کے بارے میں نہیں جانتا تھا۔

UPD 08.12.2016۔

ٹیلیگرام میں، بظاہر، انہوں نے getUpdate کے "ایگزاسٹ" کو قدرے تبدیل کر دیا۔ اب مین اسکرپٹ میں آپ کو میسج آفسیٹ کو 2 سے 1 تک درست کرنے کی ضرورت ہے۔

تبدیلیاں

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

заменить на :

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

ماخذ: www.habr.com