рдкрд╛рдЗрдердирдорд╛ рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо рдмреЛрдЯ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд▓рд┐рдирдХреНрд╕ рд╕рд░реНрднрд░рдорд╛ рдкрд╣реБрдБрдЪ

рдкреНрд░рд╛рдпрдГ рддреНрдпрд╣рд╛рдБ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рд╣рд░реВ рдЫрдиреН рдЬрдм рд╕рд░реНрднрд░рдорд╛ рдкрд╣реБрдБрдЪ рдпрд╣рд╛рдБ рд░ рдЕрд╣рд┐рд▓реЗ рдЖрд╡рд╢реНрдпрдХ рдЫред рдпрджреНрдпрдкрд┐, SSH рдорд╛рд░реНрдлрдд рдЬрдбрд╛рди рд╕рдзреИрдВ рд╕рдмреИрднрдиреНрджрд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡рд┐рдзрд┐ рд╣реЛрдЗрди, рдХрд┐рдирднрдиреЗ рддрдкрд╛рдИрдВрд╕рдБрдЧ SSH рдЧреНрд░рд╛рд╣рдХ, рд╕рд░реНрднрд░ рдареЗрдЧрд╛рдирд╛ рд╡рд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛/рдкрд╛рд╕рд╡рд░реНрдб рд╕рдВрдпреЛрдЬрди рд╣рд╛рддрдорд╛ рдирд╣реБрди рд╕рдХреНрдЫред рдЕрд╡рд╢реНрдп рдкрдирд┐ рдЫ рд╡реЗрдмрдорд┐рди, рдЬрд╕рд▓реЗ рдкреНрд░рд╢рд╛рд╕рдирд▓рд╛рдИ рд╕рд░рд▓ рдмрдирд╛рдЙрдБрдЫ, рддрд░ рдпрд╕рд▓реЗ рддрддреНрдХрд╛рд▓ рдкрд╣реБрдБрдЪ рдкрдирд┐ рдкреНрд░рджрд╛рди рдЧрд░реНрджреИрдиред

рддреНрдпрд╕реИрд▓реЗ рдореИрд▓реЗ рдПрдХ рд╕рд░рд▓ рддрд░ рд░реЛрдЪрдХ рд╕рдорд╛рдзрд╛рди рд▓рд╛рдЧреВ рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗред рдЕрд░реНрдерд╛рддреН, рдПрдЙрдЯрд╛ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдмреЛрдЯ рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реН рдЬреБрди рд╕рд░реНрднрд░рдорд╛ рдиреИ рд╕реБрд░реВ рдЧрд░реНрджрд╛, рдпрд╕рдорд╛ рдкрдард╛рдЗрдПрдХрд╛ рдЖрджреЗрд╢рд╣рд░реВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдиреЗрдЫ рд░ рдкрд░рд┐рдгрд╛рдо рдлрд░реНрдХрд╛рдЙрдБрдЫред рдЕрдзреНрдпрдпрди рдЧрд░реЗрдХрд╛ рдерд┐рдП рдзреЗрд░реИ рд▓реЗрдЦрд╣рд░реВ рдпрд╕ рд╡рд┐рд╖рдпрдорд╛, рдореИрд▓реЗ рдорд╣рд╕реБрд╕ рдЧрд░реЗрдВ рдХрд┐ рдХрд╕реИрд▓реЗ рдкрдирд┐ рддреНрдпрд╕реНрддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирд╣рд░реВ рд╡рд░реНрдгрди рдЧрд░реЗрдХреЛ рдЫреИрдиред

рдореИрд▓реЗ рдпреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ Ubuntu 16.04 рдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реЗрдВ, рддрд░ рдЕрдиреНрдп рд╡рд┐рддрд░рдгрд╣рд░реВрдорд╛ рд╕рдорд╕реНрдпрд╛-рд░рд╣рд┐рдд рд╕реБрд░реБрд╡рд╛рддрдХреЛ рд▓рд╛рдЧрд┐ рдореИрд▓реЗ рд╕рдмреИ рдХреБрд░рд╛ рд╕рд╛рдорд╛рдиреНрдп рддрд░рд┐рдХрд╛рдорд╛ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реЗрдВред

рдмреЛрдЯ рджрд░реНрддрд╛

@BotFather рд╕рдБрдЧ рдирдпрд╛рдБ рдмрдЯ рджрд░реНрддрд╛ рдЧрд░реНрджреИред рд╣рд╛рдореА рдЙрд╣рд╛рдБрд▓рд╛рдИ рдкрдард╛рдЙрдБрдЫреМрдВ /newbot рд░ рдердк рдкрд╛рдардорд╛ред рд╣рд╛рдореАрд▓рд╛рдИ рдирдпрд╛рдБ рдмреЛрдЯ рд░ рддрдкрд╛рдИрдВрдХреЛ рдЖрдИрдбреАрдХреЛ рд▓рд╛рдЧрд┐ рдЯреЛрдХрди рдЪрд╛рд╣рд┐рдиреНрдЫ (рддрдкрд╛рдИрдВ рдпрд╕рд▓рд╛рдИ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдмрд╛рдЯ @userinfobot).

рдкрд╛рдЗрдерди рддрдпрд╛рд░реА

рдмреЛрдЯ рд╕реБрд░реБ рдЧрд░реНрди рд╣рд╛рдореА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ 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

(рдЬрд╣рд╛рдБ "рд╕рд░реНрднрд░рдмреЛрдЯ" рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдИрдбреА рд╣реЛ)

рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдкреГрд╖реНрдарднреВрдорд┐рдорд╛ рд╕реБрд░реБ рд╣реБрдиреЗрдЫред рдмрдЯрд╕рдБрдЧ рд╕рдВрд╡рд╛рджрдорд╛ рдЬрд╛рдФрдВ рд░ рдЬрд╛рдБрдЪ рдЧрд░реМрдВ рдХрд┐ рд╕рдмреИ рдХреБрд░рд╛рд▓реЗ рдЬрд╕реНрддреИ рдХрд╛рдо рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдЫ:

рдкрд╛рдЗрдердирдорд╛ рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо рдмреЛрдЯ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд▓рд┐рдирдХреНрд╕ рд╕рд░реНрднрд░рдорд╛ рдкрд╣реБрдБрдЪ

рдмрдзрд╛рдИ рдЫ! рдмреЛрдЯрд▓реЗ рдпрд╕рдорд╛ рдкрдард╛рдЗрдПрдХрд╛ рдЖрджреЗрд╢рд╣рд░реВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрджрдЫред рдЕрдм, рд╕рд░реНрднрд░ рдкрд╣реБрдБрдЪ рдЧрд░реНрди, рддрдкрд╛рдИрдВрд▓реЗ рдмреЛрдЯрд╕рдБрдЧ рд╕рдВрд╡рд╛рдж рдЦреЛрд▓реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

рдЖрджреЗрд╢рд╣рд░реВ рджреЛрд╣реЛрд░реНрдпрд╛рдЙрдБрджреИ

рдкреНрд░рд╛рдпрдГ, рд╕рд░реНрднрд░рдХреЛ рдЕрд╡рд╕реНрдерд╛ рдЕрдиреБрдЧрдорди рдЧрд░реНрди, рддрдкрд╛рдИрдВрд▓реЗ рдЙрд╣реА рдЖрджреЗрд╢рд╣рд░реВ рдЪрд▓рд╛рдЙрдиреБ рдкрд░реНрдЫред рддрд╕рд░реНрде, рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдлреЗрд░рд┐ рдирдкрдард╛рдИ рджреЛрд╣реЛрд░реНрдпрд╛рдЗрдПрдХреЛ рдЖрджреЗрд╢рд╣рд░реВрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдзреЗрд░реИ рдЙрдкрдпреБрдХреНрдд рд╣реБрдиреЗрдЫред

рд╣рд╛рдореА рд╕рдиреНрджреЗрд╢рд╣рд░реВ рдЕрдиреНрддрд░реНрдЧрдд рдЗрдирд▓рд╛рдЗрди рдмрдЯрдирд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдпрд╕рд▓рд╛рдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдиреЗрдЫреМрдВ:

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

рд╕рдмреИ рдХреБрд░рд╛ рдареАрдХрд╕рдБрдЧ рдХрд╛рдо рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдЫ рднрдиреЗрд░ рдлреЗрд░рд┐ рдЬрд╛рдБрдЪ рдЧрд░реМрдВ:

рдкрд╛рдЗрдердирдорд╛ рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо рдмреЛрдЯ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд▓рд┐рдирдХреНрд╕ рд╕рд░реНрднрд░рдорд╛ рдкрд╣реБрдБрдЪ

рдЬрдм рддрдкрд╛рдЗрдБ рд╕рдиреНрджреЗрд╢ рдЕрдиреНрддрд░реНрдЧрдд рдмрдЯрди рдХреНрд▓рд┐рдХ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ, рдмрдЯрд▓реЗ рд╕рдиреНрджреЗрд╢ рдкрдард╛рдЗрдПрдХреЛ рдЖрджреЗрд╢ рджреЛрд╣реЛрд░реНрдпрд╛рдЙрдиреБ рдкрд░реНрдЫред

рдмрд░реБ рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛ рдХреЛ

рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рдпреЛ рд╡рд┐рдзрд┐рд▓реЗ рд╢рд╛рд╕реНрддреНрд░реАрдп рдЬрдбрд╛рди рд╡рд┐рдзрд┐рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрдирдХреЛ рдмрд╣рд╛рдирд╛ рдЧрд░реНрджреИрди, рддрдерд╛рдкрд┐, рдпрд╕рд▓реЗ рддрдкрд╛рдЗрдБрд▓рд╛рдИ рд╕рд░реНрднрд░рдХреЛ рдЕрд╡рд╕реНрдерд╛рдХреЛ рдмрд╛рд░реЗрдорд╛ рдЫрд┐рдЯреЛ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрди рд░ рдпрд╕рд▓рд╛рдИ рдЬрдЯрд┐рд▓ рдЖрдЙрдЯрдкреБрдЯ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрджреИрди рдЖрджреЗрд╢рд╣рд░реВ рдкрдард╛рдЙрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди