Pythonдо Telegram ботун колдонуу менен Linux серверине кирүү

Бул жерде жана азыр серверге кирүү керек болгон учурлар көп кездешет. Бирок, SSH аркылуу туташуу дайыма эле эң ыңгайлуу жол эмес, анткени сизде SSH кардары, сервердин дареги же колдонуучу/сырсөз айкалышы жок болушу мүмкүн. Албетте бар Вебмин, бул башкарууну жөнөкөйлөтөт, бирок ал ошондой эле заматта жетүү мүмкүнчүлүгүн бербейт.

Ошентип, мен жөнөкөй, бирок кызыктуу чечимди ишке ашырууну чечтим. Тактап айтканда, серверде ишке киргизилгенде ага жөнөтүлгөн буйруктарды аткарып, натыйжаны кайтара турган Telegram ботун жазуу. Окуп бир топ макалалар Бул тема боюнча, мен эч ким мындай ишке ашырууну сүрөттөгөн эмес экенин түшүндүм.

Мен бул долбоорду Ubuntu 16.04 боюнча ишке ашырдым, бирок башка дистрибьюторлордо көйгөйсүз иштөө үчүн мен бардыгын жалпы жол менен жасоого аракет кылдым.

Бот каттоо

@BotFather менен жаңы ботту каттаңыз. Биз аны жөнөтөбүз /newbot жана андан ары текстте. Бизге жаңы бот белгиси жана сиздин идентификаторуңуз керек болот (мисалы, сиз аны ала аласыз @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 маанисине алмаштырабыз. Колдонуучунун идентификаторун текшерүү бот сиздин сервериңизге сизге гана мүмкүнчүлүк бериши үчүн керек. Функция check_output() берилген команданы аткарат жана натыйжаны кайтарат.

Ботту баштоо үчүн гана калды. Серверде иштеп жаткан процесстер үчүн мен колдонууну туура көрөм screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(мында "ServerBot" процесс ID болуп саналат)

Процесс автоматтык түрдө фондо иштейт. Келгиле, бот менен диалогго баралы жана бардыгы талаптагыдай иштеп жатканын текшерели:

Pythonдо Telegram ботун колдонуу менен Linux серверине кирүү

Куттуктайбыз! Бот ага жөнөтүлгөн буйруктарды аткарат. Эми серверге кирүү үчүн сиз жөн гана бот менен диалогду ачышыңыз керек.

Буйруктун кайталанышы

Көп учурда, сервердин абалын көзөмөлдөө үчүн, ошол эле буйруктарды аткаруу керек. Ошондуктан, аларды кайра жөнөтпөстөн, кайталанган буйруктарды ишке ашыруу абдан орунсуз болот.

Биз аны билдирүүлөрдүн астындагы сап баскычтары аркылуу ишке ашырабыз:

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

Баары туура иштеп жатканын дагы бир жолу текшерип көрөлү:

Pythonдо Telegram ботун колдонуу менен Linux серверине кирүү

Билдирүүнүн астындагы баскычты басуу менен бот бул билдирүү жөнөтүлгөн буйрукту кайталашы керек.

Ордуна корутундусу

Албетте, бул ыкма классикалык туташуу ыкмаларын алмаштыргандай көрүнбөйт, бирок ал сервердин абалын тез билүүгө жана ага татаал чыгарууну талап кылбаган буйруктарды жөнөтүүгө мүмкүндүк берет.

Source: www.habr.com

Комментарий кошуу