Александар Корјукин ме турна на оваа имплементација
И коментар во една од VK групите на Кирил Казаков:
Да, воопшто не е безбедно. Повеќе би сакал да напишам бот за телеграма што прифаќа само команди за активирање од мојот профил.
Решив да напишам таков бот.
Значи, првото нешто што треба да направите е да креирате бот во телеграма.
- Во пребарувањето наоѓаме сметка со име @botfather
- Кликнете на копчето Start на дното на екранот
- Потоа му ја пишуваме командата / newbot
Потоа одговараме на 2 едноставни прашања:
- Првото прашање е името на ботот што треба да се креира. MyMikrotikROuter
- Второто прашање е прекарот на ботот што се создава (треба да завршува со бот) MikrotikROuter_bot
Како одговор, ќе го добиеме токенот на нашиот бот, во мојот случај тоа е:
Користете го овој токен за пристап до HTTP API: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
Потоа, треба да го пронајдете нашиот бот во пребарувањето по име @MikrotikROuter_bot и притиснете го копчето Start.
После тоа, треба да го отворите прелистувачот и да ја внесете следната линија:
https://api.telegram.org/botXXXXXXXXXXXXXXXXXX/getUpdates
Каде што XXXXXXXXXXXXXXXXXX е токенот на вашиот бот.
Ќе се отвори страница слична на следната:
На него го наоѓаме следниот текст:
"chat":{"id":631290,
Значи, ги имаме сите потребни информации за пишување скрипти за Микротик, имено:
Бот токен: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
ИД за разговор каде треба да напише: 631290
За да провериме, можеме да одиме низ прелистувачот:
https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test
Треба да го добиете резултатот:
За наша погодност, веднаш ќе додадеме команди за ботот:
Наоѓање сметка со име @botfather
Потоа му пишуваме команда / setcommands
- Ќе праша кој бот
Ние пишуваме:
@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-то.
Треба да го добиете резултатот:
Сега да преминеме на скрипти:
Здраво свету
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"
Не заборавајте да го наведете точното име на Mac и интерфејс, како и бот-токен и chat_id.
Сега ќе објаснам малку што прават:
Сценариото "helloworld" испраќа порака: "Здраво, свет!" на нашиот разговор со ботот.
Скриптата „itsworking“ испраќа порака: „Test OK, it's Working!“ на нашиот разговор со ботот.
Овие скрипти се за демонстративни цели.
Ја додадов скриптата „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 пораки, за погодност, откако ќе ја прочитаме командата, ја бришеме пораката. Telegram api вели за да прочитате порака, потребен ви е бројот на пораката + 1
/getUpdates?offset=update_id + 1
Сите тестирани на Mikrotik rb915 RouterOS 6.37.1
Ако испратите многу команди одеднаш, сите тие ќе бидат извршени за возврат со интервал од 30 секунди.
П.С Голема благодарност до Кирил Казаков за идејата и мојот пријател Александар за помошта околу сценаријата.
референци
ажурирање:
03:11:16
Подобрени скрипти:
Додадена е проверка за chat_id
Проверувајќи будала, ако некој ни пише на бот, ќе му одговори: „Не можам да разговарам со тебе. “, слично ќе ни одговори доколку не ја препознае командата.
По извршувањето на командата, ботот се отпишува на разговорот (види скрипта wolmypc)
ДУП
Пронајден со
ОПД 08.12.2016
во Telegram, очигледно, тие малку го сменија „издувот“ на getUpdate. сега во главната скрипта треба да го поправите поместувањето на пораката од 2 на 1
промени
:local message [:pick $content ($startLoc + 2) $endLoc] ;
заменить на :
:local message [:pick $content ($startLoc + 1) $endLoc] ;
Извор: www.habr.com