Телеграм бот для управления Hotspot

How can we help?

Навигация

Находим в поиске @botFather, пишем команду: /newbot

@botFather просит ввести name бота, задаем например HotspotBot.

@botFather просит ввести username бота, задаем например HotspotBot.

Далее бот отвечает следующим сообщением, нас интересует токен выделенный красным цветом:

Done! Congratulations on your new bot. You will find it at <a href="http://t.me/HotspotBot">t.me/HotspotBot</a>. 
You can now add a description, about section and profile picture for your bot, see /help for a list of commands. 
By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. 
Just make sure the bot is fully operational before you do this.
Use this token to access the HTTP API: <strong><span class="has-inline-color has-vivid-red-color">xxxxx:yyyyyyyyyyyyyyy</span></strong>
Keep your token secure and store it safely, it can be used by anyone to control your bot.
For a description of the Bot API, see this page: <a href="https://core.telegram.org/bots/api">https://core.telegram.org/bots/api</a>

Затем, находим бота в поиске по имени @HotspotBot и нажимаем на кнопку Start, чтобы его запустить.

Далее создаем групповой чат, называем его например HotspotGroup, добавляем в него нашего бота.

Далее открываем браузер и вводим в него вот такую строку, где xxxxx:yyyyyyyyyyyyyyy — токен нашего бота:

https://api.telegram.org/botxxxxx:yyyyyyyyyyyyyyy/getUpdates

Откроется страница примерно такого содержания:


{"ok":true,"result":[{"update_id":436525341,"message":
{"message_id":4,"from": <strong><span class="has-inline-color has-vivid-red-color">"id":210801772</span></strong>,"is_bot":false,
"first_name":"xxxxxxx","last_name":"xxxxxxx",
"language_code":"ru"},"chat":{"id":210801772,
"first_name":"xxxxxxx","last_name":"xxxxxx",
"type":"private"},"date":1552152487,"text":"/start",
"entities":[{"offset":0,"length":6,"type":"bot_command"}]}},
"update_id":436525342,"message":{"message_id":5,
"from":"id":210801772,"is_bot":false,"first_name":"xxxxxxxx",
"last_name":"xxxxx","language_code":"ru"},"chat":<strong><span class="has-inline-color has-vivid-red-color">"id":-390666473</span></strong>,
"title":"xxxxxxxxxx","type":"group",
"all_members_are_administrators":true},"date":1552152512,
"text":"/join xxxxxxxxxxxxx",
"entities":{"offset":0,"length":5,"type":"bot_command"},
{"offset":6,"length":19,"type":"mention"}]}}]}

id групповых чатов начинаются со знака «-» в данном случае нас интересует «id»:-390666473.

Далее нам нужно добавить команды которые будет выполнять наш бот. Для этого возвращаемся к @botFather и пишем ему /setcommands, он спросит какому боту, пишем @HotspotBot и добавляем команды:

hsp-disable — отключает хотспот
hsp-enable — активирует хотспот

Далее переходим к микротику.

Создаем скрипт telegram-bot-start, который будет задавать переменные. Скрипт с правами write следующего содержания:

:global botID "botxxxxx:yyyyyyyyyyyyyyy" ;
:global myChatID "-390666473" ;

Создаем скрипт telegram-bot-check, который будет читать сообщения в групповом чате и в случае появления команды запускать ее. Скрипт с правами write следующего содержания:

:global botID;
:global myChatID;

:local parse do={
  :local startLoc ([:find $content $variable -1] + [:len $variable] + 2);
  :local commaLoc ([:find $content "," $startLoc] - 1 + 1);
  :local braceLoc ([:find $content "}" $startLoc] - 1 + 1);
  :local endLoc $commaLoc;
  :local startSymbol [:pick $content $startLoc]
  :if ($braceLoc != 0 and ($commaLoc = 0 or $braceLoc < $commaLoc)) do={
    :set endLoc $braceLoc;
  };
  :if ($startSymbol = "{") do={
    :set endLoc ($braceLoc + 1);
  };
  :if ($quotas = true) do={
    :set startLoc ($startLoc + 2);
    :set endLoc ($endLoc - 1);
  }
  :if ($endLoc < $startLoc) do={
    :set endLoc ($startLoc + 1);
  };
  :local value [:pick $content $startLoc $endLoc]
  :log debug message="Telegram: parsed $variable : $value";
  :return $value;
}

:local content [/tool fetch url=("https://api.telegram.org/".$botID."/getUpdates?limit=1&allowed_updates=message") as-value output=user];
:set content ($content ->"data");
:if ([:len $content] > 23 ) do={
    :local updateId [$parse content=$content variable="update_id"]
    :local chat [$parse content=$content variable="chat"]
    :local chatId [$parse content=$chat variable="id"]  
    
    :if ($chatId = $myChatID) do={
        :local message [$parse content=$content variable="text" quotas=true] ;
        :log warn message="Command $message received" ;
            
        :if ([/system script find name=$message] != "") do={
            :system script run $message ;
        } else={
            :tool fetch url=("https://api.telegram.org/".$botID."/sendmessage\?chat_id=".$chatId."&text=Wrong command.") keep-result=no ;
        };
    } else={
        :tool fetch url=("https://api.telegram.org/".$botID."/sendmessage\?chat_id=".$chatId."&text=I can't talk with you.") keep-result=no ;
    };

    :set updateId ($updateId +1) ;
    :tool fetch url=("https://api.telegram.org/".$botID."/getUpdates\?offset=$updateId") keep-result=no ;
};

Создаем скрипт hsp-enable, который будет включать Hotspot. Скрипт с правами write следующего содержания:

/ip hotspot enable 0
:global botID;
:global myChatID;
/tool fetch url="https://api.telegram.org/bot$botID/sendmessage\?chat_id=$myChatID&amp;text=HotSpot-up" keep-result=no

Создаем скрипт hsp-disable, который будет выключать Hotspot. Скрипт с правами write следующего содержания:

/ip hotspot disable 0
:global botID;
:global myChatID;
/tool fetch url="https://api.telegram.org/bot$botID/sendmessage\?chat_id=$myChatID&amp;text=HotSpot-down" keep-result=no

Далее создаем 2 шедулера, первый выполняется при старте системы: /system script run telegram-bot-start, второй выполняется каждые 30 секунд: /system script run telegram-bot-check.