التنشيط عن بعد لنصوص Mikrotik من Telegram

دفعني ألكسندر كوريوكين إلى هذا التنفيذ جيكسوجين مع منشورهتشغيل الكمبيوتر عن بعد مجانًا ، بدون رسائل SMS وبدون سحاب ، باستخدام Mikrotik".

وتعليق في إحدى مجموعات VK بقلم كيريل كازاكوف:

نعم ، إنها ليست آمنة على الإطلاق. أفضل كتابة روبوت برقية لا يقبل إلا أوامر التنشيط من حسابي.

قررت أن أكتب مثل هذا الروبوت.

لذا ، فإن أول شيء يجب فعله هو إنشاء روبوت في Telegram.

  • نجد في البحث حسابًا باسمbotfather
  • انقر فوق الزر ابدأ في أسفل الشاشة
  • ثم نكتب له الأمر / newbot

ثم نجيب على سؤالين بسيطين:

  • السؤال الأول هو اسم الروبوت الذي سيتم إنشاؤه. MyMikrotikROuter
  • السؤال الثاني هو اسم الروبوت الذي يتم إنشاؤه (يجب أن ينتهي بـ bot) MikrotikROuter_bot

رداً على ذلك ، سوف نتلقى رمز الروبوت الخاص بنا ، وفي حالتي هو:

استخدم هذا الرمز المميز للوصول إلى واجهة برمجة تطبيقات HTTP: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

التنشيط عن بعد لنصوص Mikrotik من Telegram
بعد ذلك ، تحتاج إلى العثور على الروبوت الخاص بنا في البحث بالاسم تضمين التغريدةر واضغط على زر ابدأ.

بعد ذلك ، تحتاج إلى فتح المتصفح وإدخال السطر التالي:

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

حيث XXXXXXXXXXXXXXXXXX هو رمز الروبوت الخاص بك.

سيتم فتح صفحة مشابهة لما يلي:

التنشيط عن بعد لنصوص Mikrotik من Telegram

نجد عليها النص التالي:

"الدردشة": {"المعرف":631290,

إذن ، لدينا جميع المعلومات اللازمة لكتابة البرامج النصية لـ Mikrotik وهي:

رمز بوت: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

معرف الدردشة حيث يجب أن يكتب: 631290

للتحقق ، يمكننا الذهاب من خلال المتصفح:

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

يجب الحصول على النتيجة:

التنشيط عن بعد لنصوص Mikrotik من Telegram

من أجل راحتنا ، سنضيف على الفور أوامر للبوت:

إيجاد حساب باسم تضمين التغريدة
ثم نكتب له وصية / مجموعة أوامر

  • سوف يسأل أي روبوت

نحن نكتب:
تضمين التغريدة

أضف الأوامر:

  • helloworld <- اختبار الرسالة على الدردشة 1
  • رسالة اختبار العمل على الدردشة 2
  • wolmypc-استيقظ جهاز الكمبيوتر الخاص بي

الآن إذا كتبت "/" في الدردشة ، يجب أن تحصل على:

التنشيط عن بعد لنصوص Mikrotik من Telegram

الآن دعنا ننتقل إلى 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.

يجب الحصول على النتيجة:

التنشيط عن بعد لنصوص Mikrotik من Telegram

الآن دعنا ننتقل إلى البرامج النصية:

مرحبا بالعالم

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}

com.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"

لا تنس تحديد اسم mac واسم الواجهة الصحيحين ، بالإضافة إلى bot-token و chat_id.

الآن سأشرح قليلاً ما يفعلونه:

يرسل البرنامج النصي "helloworld" رسالة: "Hello، world!" لدردشتنا مع الروبوت.
يرسل البرنامج النصي "itsworking" رسالة: "اختبار جيد ، إنه يعمل!" لدردشتنا مع الروبوت.
هذه البرامج النصية هي لأغراض العرض.
لقد أضفت البرنامج النصي "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

عرض مقروءليس من الواضح سبب ذلك ، ولكن من البرنامج النصي الذي يعمل لا يكشف عن البيانات العالمية ، تمت إضافة البرنامج النصي عندما يقوم النظام بالتمهيد.
بدء تشغيل Telegram

: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 (رقم الرسالة) و نص (فرقنا) و معرف الدردشة . بشكل افتراضي ، يعرض getUpdates من 1 إلى 100 رسالة ، للراحة ، بعد قراءة الأمر ، نحذف الرسالة. يقول Telegram api لقراءة رسالة تحتاج إلى رقم الرسالة + 1

/getUpdates?offset=update_id + 1

تم اختبارها جميعها على Mikrotik rb915 RouterOS 6.37.1
إذا قمت بإرسال العديد من الأوامر في وقت واحد ، فسيتم تنفيذها جميعًا في وقت واحد بفاصل زمني قدره 30 ثانية.

ملاحظة جزيل الشكر لكيريل كازاكوف على الفكرة وصديقي ألكسندر للمساعدة في البرامج النصية.

مراجع

habrahabr.ru/post/313794
1spla.ru/index.php/blog/telegram_bot_for_mikrotik
core.telegram.org/bots/api
wiki.mikrotik.com/wiki/Manual: البرمجة

محدث:

03:11:16

البرامج النصية المحسنة:

إضافة التحقق من chat_id
للتحقق من وجود أحمق ، إذا كتب شخص ما إلى الروبوت الخاص بنا ، فسوف يجيبه: "لا يمكنني التحدث معك. "، بالمثل يجيبنا إذا لم يتعرف على الأمر.
بعد تنفيذ الأمر ، يقوم الروبوت بإلغاء الاشتراك في الدردشة (انظر البرنامج النصي wolmypc)

UPD

وجدت مع 7 بطل 7 أن الملف الذي يحتوي على ما يزيد عن 14 رسالة لم يعد تتم معالجته بواسطة الأمر find (قيود Mikrotik). لذلك ، في المستقبل ، سوف أقوم بتغيير السيناريو إلى lua ، شكرًا 7 بطل 7 لهذا ، لم أكن أعرف شيئًا عن lua.

محدث 08.12.2016

في Telegram ، على ما يبدو ، قاموا بتغيير طفيف في "عادم" getUpdate. الآن في البرنامج النصي الرئيسي ، تحتاج إلى تصحيح إزاحة الرسالة من 2 إلى 1

التغييرات

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

заменить на :

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

المصدر: www.habr.com