Atzitu linux zerbitzarirako Telegram bot erabiliz Python-en

Askotan gertatzen dira zerbitzarirako sarbidea hemen eta orain beharrezkoa den egoerak. Hala ere, SSH bidez konektatzea ez da beti modurik erosoena, baliteke SSH bezero, zerbitzari helbidea edo erabiltzaile/pasahitz konbinaziorik eskura ez izatea. Noski Webmin, administrazioa errazten duena, baina ez du berehalako sarbidea ematen.

Beraz, irtenbide sinple baina interesgarri bat ezartzea erabaki nuen. Alegia, Telegram bot bat idaztea, zerbitzarian bertan abiarazitakoan, bidalitako komandoak exekutatuko dituena eta emaitza itzuliko duena. Ikasketak eginda hainbat artikulu gai honi buruz, konturatu naiz oraindik inork ez dituela horrelako ezarpenak deskribatu.

Proiektu hau Ubuntu 16.04-n inplementatu nuen, baina beste banaketa batzuetan arazorik gabe exekutatzeko, dena modu orokorrean egiten saiatu nintzen.

Bot erregistroa

Erregistratu bot berri bat @BotFather-rekin. Bidaltzen dugu /newbot eta testuan aurrerago. Bot token berri bat eta zure id-a beharko ditugu (adibidez, hemendik lor dezakezu @userinfobot).

Python prestaketa

Bota exekutatzeko, liburutegia erabiliko dugu telebot (pip install pytelegrambotapi). Liburutegia erabiliz subprocess komandoak zerbitzarian exekutatuko ditugu.

Bot abian jartzea

Sortu bot.py fitxategi bat zerbitzarian:
nano bot.py

Eta itsatsi kodea bertan:

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)#Π² случаС падСния

Bertan dagoen bot tokena @BotFather-ek emandakoarekin ordezkatzen dugu eta user_id zure kontuaren id balioarekin. Erabiltzailearen IDa egiaztatzea beharrezkoa da bot-ak zure zerbitzarirako sarbidea zuri bakarrik eman dezan. Funtzioa check_output() emandako komandoa exekutatzen du eta emaitza itzultzen du.

Botea abiaraztea baino ez da geratzen. Zerbitzarian prozesuak exekutatzeko, nahiago dut erabili screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(non "ServerBot" prozesuaren IDa den)

Prozesua automatikoki atzeko planoan exekutatzen da. Goazen botarekin elkarrizketara eta egiaztatu dena behar bezala funtzionatzen duela:

Atzitu linux zerbitzarirako Telegram bot erabiliz Python-en

Zorionak! Botak bidalitako komandoak exekutatzen ditu. Orain, zerbitzarian sartzeko, bot-arekin elkarrizketa bat ireki besterik ez duzu behar.

Agindu errepikapena

Sarritan, zerbitzariaren egoera kontrolatzeko, komando berdinak exekutatu behar dituzu. Hori dela eta, berriro bidali gabe komandoak errepikatzea oso lekuz kanpo egongo da.

Mezuen azpian dauden lerroko botoiak erabiliz ezarriko dugu:

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)#Π² случаС падСния

Bota berrabiarazi:

killall python3
screen -dmS ServerBot python3 bot.py

Egiazta dezagun berriro dena ondo funtzionatzen duela:

Atzitu linux zerbitzarirako Telegram bot erabiliz Python-en

Mezuaren azpiko botoia sakatuz, bot-ak mezu hau bidali den komandoa errepikatu behar du.

Horren ordez Ondorio baten

Jakina, metodo honek ez du konexio metodo klasikoen ordezkoa denik, hala ere, zerbitzariaren egoera azkar ezagutzeko eta irteera konplexurik behar ez duten komandoak bidaltzeko aukera ematen du.

Iturria: www.habr.com

Gehitu iruzkin berria