Дастрасӣ ба сервери Linux бо истифода аз боти Telegram дар Python

Аксар вақт ҳолатҳое ҳастанд, ки дастрасӣ ба сервер дар ин ҷо ва ҳоло лозим аст. Бо вуҷуди ин, пайвастшавӣ тавассути SSH на ҳамеша усули қулай аст, зеро шумо метавонед муштарии SSH, суроғаи сервер ё комбинатсияи корбар/паролро дар даст надоред. Албатта доранд Вебмин, ки маъмуриятро осон мекунад, аммо он дастрасии фаврӣ низ фароҳам намеорад.

Аз ин рӯ, ман қарор додам, ки як ҳалли оддӣ, вале ҷолибро амалӣ кунам. Махз, як боти Telegram нависед, ки ҳангоми ба кор даровардани худи сервер фармонҳои ба он фиристодашударо иҷро мекунад ва натиҷаро бармегардонад. Тахсил карда якчанд мақолаҳо дар ин мавзӯъ, ман фаҳмидам, ки ҳеҷ кас ҳеҷ гоҳ чунин амалҳоро тавсиф накардааст.

Ман ин лоиҳаро дар Ubuntu 16.04 амалӣ кардам, аммо барои оғози бе мушкилот дар дистрибюторҳои дигар ман кӯшиш кардам, ки ҳама чизро ба таври умумӣ иҷро кунам.

Бақайдгирии бот

Бақайдгирии боти нав бо @BotFather. Мо онро ба ӯ мефиристем /newbot ва минбаъд дар матн. Ба мо нишона барои боти нав ва ID-и шумо лозим аст (шумо метавонед онро, масалан, аз @userinfobot).

Омодасозии Python

Барои оғоз кардани бот, мо китобхонаро истифода мебарем telebot (pip install pytelegrambotapi). Истифодаи китобхона subprocess Мо фармонҳоро дар сервер иҷро мекунем.

Иҷрои бот

Дар сервер мо файли bot.py-ро эҷод мекунем:
nano bot.py

Ва кодро ба он часбонед:

from subprocess import check_output
import telebot
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#токен бота
user_id = 0 #id вашего аккаунта
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): #проверяем, что пишет именно владелец
      comand = message.text  #текст сообщения
      try: #если команда невыполняемая - check_output выдаст exception
         bot.send_message(message.chat.id, check_output(comand, shell = True))
      except:
         bot.send_message(message.chat.id, "Invalid input") #если команда некорректна
if __name__ == '__main__':
    while True:
        try:#добавляем try для бесперебойной работы
            bot.polling(none_stop=True)#запуск бота
        except:
            time.sleep(10)#в случае падения

Мо аломати ботро дар он бо нишони аз ҷониби @BotFather баровардашуда ва user_id -ро бо арзиши ID-и ҳисоби шумо иваз мекунем. Тасдиқи ID-и корбар зарур аст, то бот дастрасӣ ба сервери шуморо танҳо ба шумо таъмин кунад. Функсия check_output() фармони додашударо иҷро мекунад ва натиҷаро бармегардонад.

Ҳама чизи боқимонда оғоз кардани бот аст. Барои иҷро кардани равандҳо дар сервер ман истифода бурданро афзалтар мешуморам screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(дар он ҷо "ServerBot" ID-и раванд аст)

Раванд ба таври худкор дар замина оғоз мешавад. Биёед бо бот ба муколама равем ва санҷед, ки ҳама чиз тавре ки лозим аст кор мекунад:

Дастрасӣ ба сервери Linux бо истифода аз боти Telegram дар Python

Табрик мекунем! Бот фармонҳои ба он фиристодашударо иҷро мекунад. Ҳоло, барои дастрасӣ ба сервер, шумо танҳо бояд муколамаро бо бот кушоед.

Фармонҳои такрорӣ

Аксар вақт, барои назорат кардани ҳолати сервер, шумо бояд ҳамон фармонҳоро иҷро кунед. Аз ин рӯ, иҷрои фармонҳои такрорӣ бе фиристодани онҳо хеле мувофиқ мебуд.

Мо онро бо истифода аз тугмаҳои дохилӣ дар зери паёмҳо амалӣ хоҳем кард:

from subprocess import check_output
import telebot
from telebot import types #Добавляем импорт кнопок
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#Токен бота
user_id = 0 #id вашего аккаунта
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): #проверяем, что пишет именно владелец
      comand = message.text  #текст сообщения
      markup = types.InlineKeyboardMarkup() #создаем клавиатуру
      button = types.InlineKeyboardButton(text="Повторить", callback_data=comand) #создаем кнопку
      markup.add(button) #добавляем кнопку в клавиатуру
      try: #если команда невыполняемая - check_output выдаст exception
         bot.send_message(user_id, check_output(comand, shell = True,  reply_markup = markup)) #вызываем команду и отправляем сообщение с результатом
      except:
         bot.send_message(user_id, "Invalid input") #если команда некорректна

@bot.callback_query_handler(func=lambda call: True)
def callback(call):
  comand = call.data #считываем команду из поля кнопки data
  try:#если команда не выполняемая - check_output выдаст exception
     markup = types.InlineKeyboardMarkup() #создаем клавиатуру
     button = types.InlineKeyboardButton(text="Повторить", callback_data=comand) #создаем кнопку и в data передаём команду
     markup.add(button) #добавляем кнопку в клавиатуру
     bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) #вызываем команду и отправляем сообщение с результатом
  except:
     bot.send_message(user_id, "Invalid input") #если команда некорректна

if __name__ == '__main__':
    while True:
        try:#добавляем try для бесперебойной работы
            bot.polling(none_stop=True)#запуск бота
        except:
            time.sleep(10)#в случае падения

Ботро аз нав оғоз кунед:

killall python3
screen -dmS ServerBot python3 bot.py

Биёед бори дигар тафтиш кунем, ки ҳама чиз дуруст кор мекунад:

Дастрасӣ ба сервери Linux бо истифода аз боти Telegram дар Python

Вақте ки шумо тугмаи зери паёмро пахш мекунед, бот бояд фармонеро, ки аз он паём фиристода шудааст, такрор кунад.

Ба ҷои хулоса

Албатта, ин усул худро ивазкунандаи усулҳои пайвасти классикӣ вонамуд намекунад, аммо он ба шумо имкон медиҳад, ки ҳолати серверро зуд фаҳмед ва ба он фармонҳое фиристед, ки баромади мураккабро талаб намекунанд.

Манбаъ: will.com

Илова Эзоҳ