Telegram වෙතින් Mikrotik ස්ක්‍රිප්ට් දුරස්ථව සක්‍රිය කිරීම

ඇලෙක්සැන්ඩර් කොරියුකින් මාව මෙම ක්‍රියාවට තල්ලු කළේය GeXoGeN ඔහුගේ ප්රකාශනය සමඟMikrotik භාවිතයෙන් SMS සහ වලාකුළු නොමැතිව පරිගණකය නොමිලේ සක්රිය කිරීම දුරස්ථව«.

කිරිල් කසකොව් විසින් VK කණ්ඩායම් වලින් එකක අදහස් දැක්වීමක්:

ඔව්, එය කිසිසේත්ම ආරක්ෂිත නොවේ. මම මගේ ගිණුමෙන් සක්‍රිය කිරීමේ විධාන පමණක් පිළිගන්නා ටෙලිග්‍රාම් බොට් එකක් ලිවීමට කැමැත්තෙමි.

මම එවැනි බොට් එකක් ලිවීමට තීරණය කළා.

ඉතින්, මුලින්ම කළ යුත්තේ ටෙලිග්‍රාම් හි බොට් එකක් නිර්මාණය කිරීමයි.

  • අපි සෙවීමේදී @botfather නමින් ගිණුමක් සොයා ගනිමු
  • තිරයේ පතුලේ ඇති ආරම්භක බොත්තම ක්ලික් කරන්න
  • එවිට අපි ඔහුට විධානය / newbot ලියන්නෙමු

එවිට අපි සරල ප්රශ්න 2 කට පිළිතුරු දෙන්නෙමු:

  • පළමු ප්‍රශ්නය වන්නේ නිර්මාණය කිරීමට නියමිත බොට් එකේ නමයි. MyMikrotikROuter
  • දෙවන ප්‍රශ්නය වන්නේ නිර්මාණය කරන ලද බොට්ගේ අන්වර්ථ නාමයයි (බොට් වලින් අවසන් විය යුතුය) MikrotikROouter_bot

ප්‍රතිචාර වශයෙන්, අපගේ බොට් එකේ ටෝකනය අපට ලැබෙනු ඇත, මගේ නඩුවේ එය:

HTTP API වෙත ප්‍රවේශ වීමට මෙම ටෝකනය භාවිතා කරන්න: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Telegram වෙතින් Mikrotik ස්ක්‍රිප්ට් දුරස්ථව සක්‍රිය කිරීම
ඉන්පසුව, ඔබ නම අනුව සෙවුමේ අපගේ බොට් සොයා ගත යුතුය @MikrotikROuter_bot සහ ආරම්භක බොත්තම ඔබන්න.

ඊට පසු, ඔබ බ්‍රව්සරය විවෘත කර පහත පේළිය ඇතුළත් කළ යුතුය:

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

XXXXXXXXXXXXXXXXXX යනු ඔබේ බොට්ගේ ටෝකනය වේ.

පහත දැක්වෙන පිටුවට සමාන පිටුවක් විවෘත වනු ඇත:

Telegram වෙතින් Mikrotik ස්ක්‍රිප්ට් දුරස්ථව සක්‍රිය කිරීම

එහි පහත පෙළ අපට හමු වේ:

"chat":{"id":631290,

එබැවින්, Mikrotik සඳහා ස්ක්‍රිප්ට් ලිවීම සඳහා අවශ්‍ය සියලුම තොරතුරු අප සතුව ඇත, එනම්:

බොට් ටෝකනය: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

ඔහු ලිවිය යුතු තැන කතාබස් හැඳුනුම්පත: 631290

පරීක්ෂා කිරීමට, අපට බ්‍රව්සරය හරහා යා හැකිය:

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

ප්රතිඵලය ලබා ගත යුතුය:

Telegram වෙතින් Mikrotik ස්ක්‍රිප්ට් දුරස්ථව සක්‍රිය කිරීම

අපගේ පහසුව සඳහා, අපි වහාම bot සඳහා විධාන එකතු කරන්නෙමු:

නමක් සහිත ගිණුමක් සොයා ගැනීම @botfather
එවිට අපි ඔහුට විධානයක් ලියන්නෙමු / setcommands

  • ඔහු අසනු ඇත කුමන බොට්ද කියා

අපි ලියනවා:
@MikrotikROouter_bot

විධාන එකතු කරන්න:

  • helloworld< — චැට් 1 හි පරීක්ෂණ පණිවිඩය
  • එහි වැඩ-පරීක්ෂණ පණිවිඩය කතාබස් 2
  • wolmypc-මගේ පරිගණකය අවදි කරන්න

දැන් ඔබ චැට් එකේ "/" ටයිප් කළහොත්, ඔබට ලැබිය යුත්තේ:

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}

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 සඳහන් කිරීමට අමතක නොකරන්න.

දැන් මම ඔවුන් කරන දේ ටිකක් පැහැදිලි කරන්නම්:

"helloworld" පිටපත පණිවිඩයක් යවයි: "Hello, world!" බොට් සමඟ අපගේ කතාබහට.
"එහි වැඩ කරන" ස්ක්‍රිප්ට් පණිවිඩයක් යවයි: "පරීක්ෂා කරන්න හරි, එය ක්‍රියාත්මකයි!" බොට් සමඟ අපගේ කතාබහට.
මෙම ස්ක්‍රිප්ට් නිරූපණ අරමුණු සඳහාය.
හැකි ක්‍රියාත්මක කිරීම් වලින් එකක් ලෙස මම "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; 
} 

කොහොමද මේ වැඩ කරන්නේ

සෑම තත්පර 30කට වරක් අපගේ "getUpdates" පණිවිඩ බාගන්න, පසුව සොයා ගැනීමට විග්‍රහ කරන්න update_id (පණිවිඩ අංකය) සහ පෙළ (අපගේ කණ්ඩායම්) සහ chat_id . පෙරනිමියෙන්, getUpdates පණිවිඩ 1 සිට 100 දක්වා දර්ශණය වේ, පහසුව සඳහා, විධානය කියවීමෙන් පසු, අපි පණිවිඩය මකා දමමු. Telegram api පවසන්නේ පණිවිඩයක් කියවීමට ඔබට පණිවිඩ අංකය + 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: පිටපත් කිරීම

යාවත්කාලීන:

03:11:16

වැඩිදියුණු කළ ස්ක්‍රිප්ට්:

chat_id සඳහා චෙක්පත එක් කරන ලදී
මෝඩයෙකු දැයි පරීක්ෂා කර, යමෙකු අපගේ බොට් වෙත ලිව්වහොත්, ඔහු ඔහුට පිළිතුරු දෙනු ඇත: "මට ඔබ සමඟ කතා කළ නොහැක. “, එය විධානය හඳුනා නොගන්නේ නම් ඒ හා සමානව අපට පිළිතුරු දෙනු ඇත.
විධානය ක්‍රියාත්මක කිරීමෙන් පසු, බොට් චැට් වෙත දායකත්වයෙන් ඉවත් වේ (wolmypc script බලන්න)

DUP

සමඟ හමු විය 7 Stuntman7 ඉහත ~14 පණිවිඩ සහිත ගොනුවක් තවදුරටත් find විධානය (Mikrotik සීමාවන්) මගින් සකසන්නේ නැත. ඒ නිසා ඉදිරියේදී මම පිටපත lua ලෙස වෙනස් කරනවා ස්තුතියි 7 Stuntman7 මේ සඳහා, මම lua ගැන දැන සිටියේ නැත.

UPD 08.12.2016/XNUMX/XNUMX

Telegram හි, පෙනෙන විදිහට, ඔවුන් getUpdate හි "exhaust" තරමක් වෙනස් කර ඇත. දැන් ප්‍රධාන ස්ක්‍රිප්ට් එකෙහි ඔබට පණිවිඩ ඕෆ්සෙට් 2 සිට 1 දක්වා නිවැරදි කළ යුතුය

වෙනස්

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

заменить на :

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

මූලාශ්රය: www.habr.com