دفعني ألكسندر كوريوكين إلى هذا التنفيذ مع منشوره".
وتعليق في إحدى مجموعات VK بقلم كيريل كازاكوف:
نعم ، إنها ليست آمنة على الإطلاق. أفضل كتابة روبوت برقية لا يقبل إلا أوامر التنشيط من حسابي.
قررت أن أكتب مثل هذا الروبوت.
لذا ، فإن أول شيء يجب فعله هو إنشاء روبوت في Telegram.
- نجد في البحث حسابًا باسمbotfather
- انقر فوق الزر ابدأ في أسفل الشاشة
- ثم نكتب له الأمر / newbot
ثم نجيب على سؤالين بسيطين:
- السؤال الأول هو اسم الروبوت الذي سيتم إنشاؤه. MyMikrotikROuter
- السؤال الثاني هو اسم الروبوت الذي يتم إنشاؤه (يجب أن ينتهي بـ bot) MikrotikROuter_bot
رداً على ذلك ، سوف نتلقى رمز الروبوت الخاص بنا ، وفي حالتي هو:
استخدم هذا الرمز المميز للوصول إلى واجهة برمجة تطبيقات HTTP: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

بعد ذلك ، تحتاج إلى العثور على الروبوت الخاص بنا في البحث بالاسم تضمين التغريدةر واضغط على زر ابدأ.
بعد ذلك ، تحتاج إلى فتح المتصفح وإدخال السطر التالي:
https://api.telegram.org/botXXXXXXXXXXXXXXXXXX/getUpdates
حيث XXXXXXXXXXXXXXXXXX هو رمز الروبوت الخاص بك.
سيتم فتح صفحة مشابهة لما يلي:

نجد عليها النص التالي:
"الدردشة": {"المعرف":631290,
إذن ، لدينا جميع المعلومات اللازمة لكتابة البرامج النصية لـ Mikrotik وهي:
رمز بوت: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
معرف الدردشة حيث يجب أن يكتب: 631290
للتحقق ، يمكننا الذهاب من خلال المتصفح:
https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test
يجب الحصول على النتيجة:

من أجل راحتنا ، سنضيف على الفور أوامر للبوت:
إيجاد حساب باسم تضمين التغريدة
ثم نكتب له وصية / مجموعة أوامر
- سوف يسأل أي روبوت
نحن نكتب:
تضمين التغريدة
أضف الأوامر:
- 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.
يجب الحصول على النتيجة:

الآن دعنا ننتقل إلى البرامج النصية:
مرحبا بالعالم
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 ثانية.
ملاحظة جزيل الشكر لكيريل كازاكوف على الفكرة وصديقي ألكسندر للمساعدة في البرامج النصية.
مراجع
: البرمجة
محدث:
03:11:16
البرامج النصية المحسنة:
إضافة التحقق من chat_id
للتحقق من وجود أحمق ، إذا كتب شخص ما إلى الروبوت الخاص بنا ، فسوف يجيبه: "لا يمكنني التحدث معك. "، بالمثل يجيبنا إذا لم يتعرف على الأمر.
بعد تنفيذ الأمر ، يقوم الروبوت بإلغاء الاشتراك في الدردشة (انظر البرنامج النصي wolmypc)
UPD
وجدت مع أن الملف الذي يحتوي على ما يزيد عن 14 رسالة لم يعد تتم معالجته بواسطة الأمر find (قيود Mikrotik). لذلك ، في المستقبل ، سوف أقوم بتغيير السيناريو إلى lua ، شكرًا لهذا ، لم أكن أعرف شيئًا عن 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
