Как быстро создать Telegram-бота в 2022-м году — инструкция для новичков

Python * Из песочницы 24 июня разработчики Telegram открыли платформу для создания ботов. Новость кого-то обошла стороной Хабр, однако многие уже начали разрабатывать викторины. При этом мало где указаны хоть какие-то примеры работающих ботов. Прежде всего, бот для Telegram — это по-прежнему приложение, запущенное на вашей стороне и осуществляющее запросы к Telegram Bot API. Причем API довольное простое — бот обращается на определенный URL с параметрами, а Telegram отвечает JSON объектом. Рассмотрим API на примере создания тривиального бота:

1. Регистрация

Прежде чем начинать разработку, бота необходимо зарегистрировать и получить его уникальный id, являющийся одновременно и токеном. Для этого в Telegram существует специальный бот — @BotFather. Пишем ему /start и получаем список всех его команд. Первая и главная — /newbot — отправляем ему и бот просит придумать имя нашему новому боту. Единственное ограничение на имя — оно должно оканчиваться на «bot». В случае успеха BotFather возвращает токен бота и ссылку для быстрого добавления бота в контакты, иначе придется поломать голову над именем. Для начала работы этого уже достаточно. Особо педантичные могут уже здесь присвоить боту аватар, описание и приветственное сообщение. Не забудьте проверить полученный токен с помощью ссылки /getMe”>api.telegram.org/bot/getMe, говорят, не всегда работает с первого раза.

2. Программирование

Создавать бота буду на Python3, однако благодаря адекватности этого языка алгоритмы легко переносятся на любой другой. Telegram позволяет не делать выгрузку сообщений вручную, а поставить webHook, и тогда они сами будут присылать каждое сообщение. Для Python, чтобы не заморачиваться с cgi и потоками, удобно использовать какой-нибудь реактор, поэтому я для реализации выбрал tornado.web. (для GAE удобно использовать связку Python2+Flask) Каркас бота:

URL = "https://api.telegram.org/bot%s/" % BOT_TOKEN MyURL = "https://example.com/hook"  api = requests.Session() application = tornado.web.Application([     (r"/", Handler), ])  if __name__ == '__main__':     signal.signal(signal.SIGTERM, signal_term_handler)     try:         set_hook = api.get(URL + "setWebhook?url=%s" % MyURL)         if set_hook.status_code != 200:             logging.error("Can't set hook: %s. Quit." % set_hook.text)             exit(1)         application.listen(8888)         tornado.ioloop.IOLoop.current().start()     except KeyboardInterrupt:         signal_term_handler(signal.SIGTERM, None) 

Здесь мы при запуске бота устанавливаем вебхук на наш адрес и отлавливаем сигнал выхода, чтобы вернуть поведение с ручной выгрузкой событий. Приложение торнадо для обработки запросов принимает класс tornado.web.RequestHandler, в котором и будет логика бота.

class Handler(tornado.web.RequestHandler):         def post(self):             try:                 logging.debug("Got request: %s" % self.request.body)                 update = tornado.escape.json_decode(self.request.body)                 message = update['message']                 text = message.get('text')                 if text:                     logging.info("MESSAGEt%st%s" % (message['chat']['id'], text))                      if text[0] == '/':                         command, *arguments = text.split(" ", 1)                         response = CMD.get(command, not_found)(arguments, message)                         logging.info("REPLYt%st%s" % (message['chat']['id'], response))                         send_reply(response)             except Exception as e:                 logging.warning(str(e)) 

Здесь CMD — словарь доступных команд, а send_reply — функция отправки ответа, которая на вход принимает уже сформированный объект Message. Собственно, её код довольно прост:

def send_reply(response):     if 'text' in response:         api.post(URL + "sendMessage", data=response) 

Теперь, когда вся логика бота описана можно начать придумывать ему команды.

3. Команды

Перво-наперво, необходимо соблюсти соглашение Telegram и научить бота двум командам: /start и /help:

def help_message(arguments, message):     response = {'chat_id': message['chat']['id']}     result = ["Hey, %s!" % message["from"].get("first_name"),               "rI can accept only these commands:"]     for command in CMD:         result.append(command)     response['text'] = "nt".join(result)     return response 

Структура message[‘from’] — это объект типа User, она предоставляет боту информацию как id пользователя, так и его имя. Для ответов же полезнее использовать message[‘chat’][‘id’] — в случае личного общения там будет User, а в случае чата — id чата. В противном случае можно получить ситуацию, когда пользователь пишет в чат, а бот отвечает в личку. Команда /start без параметров предназначена для вывода информации о боте, а с параметрами — для идентификации. Полезно её использовать для действий, требующих авторизации. После этого можно добавить какую-нибудь свою команду, например, /base64:

def base64_decode(arguments, message):     response = {'chat_id': message['chat']['id']}     try:         response['text'] = b64decode(" ".join(arguments).encode("utf8"))     except:         response['text'] = "Can't decode it"     finally:         return response 

Для пользователей мобильного Telegram, будет полезно сказать @BotFather, какие команды принимает наш бот: I: /setcommands BotFather : Choose a bot to change the list of commands. I: @******_bot BotFather: OK. Send me a list of commands for your bot. Please use this format: command1 - Description command2 - Another description I: whoisyourdaddy - Information about author base64 - Base64 decode BotFather: Success! Command list updated. /help C таким описанием, если пользователь наберет /, Telegram услужливо покажет список всех доступных команд.

4. Свобода

Как можно было заметить, Telegram присылает сообщение целиком, а не разбитое, и ограничение на то, что команды начинаются со слеша — только для удобства мобильных пользователей. Благодаря этому можно научить бота немного говорить по-человечески. UPD: Как верно подсказали, такое пройдет только при личном общении. В чатах боту доставляются только сообщения, начинающиеся с команды (/ label=”label” />) (https://core.telegram.org/bots#privacy-mode)

  • All messages that start with a slash ‘/’ (see Commands above)
  • Messages that the bot by username
  • Replies to the bot’s own messages
  • Service messages (people added or removed from the group, etc.)

Чтобы бот получал все сообщения в группах пишем @BotFather команду /setprivacy и выключаем приватность. Для начала в Handler добавляем обработчик:

if text[0] == '/':     ... else:     response = CMD[""](message)     logging.info("REPLYt%st%s" % (message['chat']['id'], response))     send_reply(response) 

А потом в список команд добавляем псевдо-речь:

RESPONSES = {     "Hello": ["Hi there!", "Hi!", "Welcome!", "Hello, {name}!"],     "Hi there": ["Hello!", "Hello, {name}!", "Hi!", "Welcome!"],     "Hi!": ["Hi there!", "Hello, {name}!", "Welcome!", "Hello!"],     "Welcome": ["Hi there!", "Hi!", "Hello!", "Hello, {name}!",], } def human_response(message):     leven = fuzzywuzzy.process.extract(message.get("text", ""), RESPONSES.keys(), limit=1)[0]     response = {'chat_id': message['chat']['id']}     if leven[1] < 75:         response['text'] = "I can not understand you"     else:         response['text'] = random.choice(RESPONSES.get(leven[0])).format_map(             {'name': message["from"].get("first_name", "")}         )     return response 

Здесь эмпирическая константа 75 относительно неплохо отражает вероятность того, что пользователь всё-таки хотел сказать. А format_map — удобна для одинакового описания строк как требующих подстановки, так и без нее. Теперь бот будет отвечать на приветствия и иногда даже обращаться по имени.

5. Не текст.

Боты, как и любой нормальный пользователь Telegram, могут не только писать сообщения, но и делиться картинками, музыкой, стикерами. Для примера расширим словарь RESPONSES:

RESPONSES["What time is it?"] = ["", "{date} UTC"] 

И будем отлавливать текст :

if response['text'] == "":         response['sticker'] = "BQADAgADeAcAAlOx9wOjY2jpAAHq9DUC"         del response['text'] 

Видно, что теперь структура Message уже не содержит текст, поэтому необходимо модифицировать send_reply:

def send_reply(response):     if 'sticker' in response:         api.post(URL + "sendSticker", data=response)     elif 'text' in response:         api.post(URL + "sendMessage", data=response) 

И все, теперь бот будет время от времени присылать стикер вместо времени: image

6. Возможности

Благодаря удобству API и быстрому старту боты Telegram могут стать хорошей платформой для автоматизации своих действий, настройки уведомлений, создания викторин и task-based соревнований (CTF, DozoR и прочие). Вспоминая статью про умный дом, могу сказать, что теперь извращений меньше, а работа прозрачнее.

7. Ограничения

К сожалению, на данный момент существует ограничение на использование webHook — он работает только по https и только с валидным сертификатом, что, например для меня пока критично за счет отсутствия поддержки сертифицирующими центрами динамических днс. К счастью, Telegram также умеет работать и по ручному обновлению, поэтому не меняя кода можно создать еще одну службу Puller, которая будет выкачивать их и слать на локальный адрес:

while True:             r = requests.get(URL + "?offset=%s" % (last + 1))             if r.status_code == 200:                 for message in r.json()["result"]:                     last = int(message["update_id"])                     requests.post("http://localhost:8888/",                                   data=json.dumps(message),                                   headers={'Content-type': 'application/json',                                            'Accept': 'text/plain'}                      )             else:                 logging.warning("FAIL " + r.text)             time.sleep(3) 

P.S. По пункту 7 нашел удобное решение — размещение бота не у себя, а на heroku, благо все имена вида *.herokuapp.com защищены их собственным сертификатом. UPD: Telegram улучшили Бот Апи, из-за чего, теперь не обязательно иметь отдельную функцию для отправки сообщений при установленном вебхуке, а в ответ на POST запрос можно отвечать тем же сформированным JSON с ответным сообщением, где одно из полей устанавливается как ч ‘method’: ‘sendMessage’ (или любой другой метод, используемый ботом).

В этой статье мы реали­зуем прос­той, но край­не полез­ный про­ект на Python — бота для Telegram. Боты — это неболь­шие скрип­ты, которые могут вза­имо­дей­ство­вать с API, что­бы получать сооб­щения от поль­зовате­ля и отправ­лять информа­цию в раз­ные чаты и каналы.

Python для новичков

Ес­ли ты сов­сем не ори­енти­руешь­ся в Python, то отличным началом будет проч­тение трех ввод­ных ста­тей, которые я пуб­ликовал в «Хакере» этим летом, либо посеще­ние кур­са «Python для нович­ков», который я нач­ну вес­ти для читате­лей «Хакера» уже сов­сем ско­ро — 30 нояб­ря.

  • Python с абсо­лют­ного нуля. Учим­ся кодить без скуч­ных кни­жек
  • Python с абсо­лют­ного нуля. Учим­ся работать со стро­ками, фай­лами и интерне­том
  • Python с абсо­лют­ного нуля. Работа­ем с ОС, изу­чаем регуляр­ные выраже­ния и фун­кции

Что­бы соз­дать бота, нам нуж­но дать ему наз­вание, адрес и получить токен — стро­ку, которая будет однознач­но иден­тифици­ровать нашего бота для сер­веров Telegram. Зай­дем в Telegram под сво­им акка­унтом и откро­ем «отца всех ботов», BotFather.

Жмем кноп­ку «Запус­тить» (или отпра­вим / start), в ответ BotFather приш­лет нам спи­сок дос­тупных команд:

  • / newbot — соз­дать нового бота;
  • / mybots — редак­тировать ваших ботов;
  • / setname — сме­нить имя бота;
  • / setdescription — изме­нить опи­сание бота;
  • / setabouttext — изме­нить информа­цию о боте;
  • / setuserpic — изме­нить фото ава­тар­ки бота;
  • / setcommands — изме­нить спи­сок команд бота;
  • / deletebot — уда­лить бота.

От­пра­вим бате‑боту коман­ду / newbot, что­бы соз­дать нового бота. В ответ он поп­росит ввес­ти имя будуще­го бота, его мож­но писать на рус­ском. Пос­ле вво­да име­ни нуж­но будет отпра­вить адрес бота, при­чем он дол­жен закан­чивать­ся на сло­во bot. Нап­ример, xakepbot или xakep_bot. Если адрес будет уже кем‑то занят, BotFather нач­нет изви­нять­ся и про­сить при­думать что‑нибудь дру­гое.

Ког­да мы наконец най­дем сво­бод­ный и кра­сивый адрес для нашего бота, в ответ получим сооб­щение, в котором пос­ле фра­зы Use this token to access the HTTP API будет написа­на стро­ка из букв и цифр — это и есть необ­ходимый нам токен. Сох­раним ее где‑нибудь на сво­ем компь­юте­ре, что­бы потом исполь­зовать в скрип­те бота.

Для вза­имо­дей­ствия с Telegram API есть нес­коль­ко готовых модулей. Самый прос­той из них — Telebot. Что­бы уста­новить его, набери

pip install pytelegrambotapi

В Linux, воз­можно, понадо­бит­ся написать pip3 вмес­то pip, что­бы ука­зать, что мы хотим работать с треть­ей вер­сией Python.

Эхо-бот

Для начала реали­зуем так называ­емо­го эхо‑бота. Он будет получать от поль­зовате­ля тек­сто­вое сооб­щение и воз­вра­щать его.

import telebot # Создаем экземпляр ботаbot = telebot.TeleBot('Здесь впиши токен, полученный от @botfather') # Функция, обрабатывающая команду /start@bot.message_handler(commands=["start"])def start(m, res=False): bot.send_message(m.chat.id, на связи. Напиши мне что-нибудь )') # Получение сообщений от юзера@bot.message_handler(content_types=["text"])def handle_text(message): bot.send_message(message.chat.id, 'Вы написали: ' + message.text) # Запускаем ботаbot.polling(none_stop=True, interval=0)

За­пус­кай скрипт и ищи в поис­ке Telegram сво­его бота по адре­су, который ты при­думал ранее. Запус­каем бота кноп­кой «Запус­тить» (Start) или коман­дой / start и можем убе­дить­ся в том, что он работа­ет и воз­вра­щает сооб­щения.

image
При­мер работы эхо‑бота

Wikipedia-бот

Да­вай научим нашего бота не прос­то отсы­лать сооб­щения обратно, а чему‑нибудь поин­терес­нее. Нап­ример, по вве­ден­ному сло­ву давать статью на Википе­дии. Здесь нам поможет модуль Wikipedia:

pip install wikipedia

Го­товим код.

import telebot, wikipedia, re # Создаем экземпляр ботаbot = telebot.TeleBot('Здесь впиши токен, полученный от @botfather') # Устанавливаем русский язык в Wikipediawikipedia.set_lang("ru") # Чистим текст статьи в Wikipedia и ограничиваем его тысячей символовdef getwiki(s): try: ny = wikipedia.page(s) # Получаем первую тысячу символов wikitext=ny.content[:1000] # Разделяем по точкам wikimas=wikitext.split('.') # Отбрасываем всЕ после последней точки wikimas = wikimas[:-1] # Создаем пустую переменную для текста wikitext2 = '' # Проходимся по строкам, где нет знаков «равно» (то есть все, кроме заголовков) for x in wikimas: if not('==' in x): # Если в строке осталось больше трех символов, добавляем ее к нашей переменной и возвращаем утерянные при разделении строк точки на место if(len((x.strip()))>3): wikitext2=wikitext2+x+'.' else: break # Теперь при помощи регулярных выражений убираем разметку wikitext2=re.sub('([^()]*)', '', wikitext2) wikitext2=re.sub('([^()]*)', '', wikitext2) wikitext2=re.sub('{[^{}]*}', '', wikitext2) # Возвращаем текстовую строку return wikitext2 # Обрабатываем исключение, которое мог вернуть модуль wikipedia при запросе except Exception as e: return энциклопедии нет информации об этом' # Функция, обрабатывающая команду /start@bot.message_handler(commands=["start"])def start(m, res=False): bot.send_message(m.chat.id, 'Отправьте мне любое слово, и я найду его значение на Wikipedia') # Получение сообщений от юзера@bot.message_handler(content_types=["text"])def handle_text(message): bot.send_message(message.chat.id, getwiki(message.text)) # Запускаем ботаbot.polling(none_stop=True, interval=0)

При­мер работы Wikipedia-бота

Другие статьи в выпуске:

Xakep #272. Приручаем WinAFL

  • Содержание выпуска
  • Подписка на «Хакер»-70%

www

При соз­дании сле­дующих ботов мы будем исполь­зовать нес­коль­ко тек­сто­вых фай­лов с кон­тентом. Ска­чать их мож­но с моего сай­та.

Бот с двумя виртуальными кнопками

Во мно­гих Telegram-ботах для выбора каких‑то дей­ствий исполь­зуют­ся так называ­емые вир­туаль­ные кноп­ки. Давай поп­робу­ем сде­лать себе такие же!

Пред­положим, что у нас есть два фай­ла facts. txt и thinks. txt, которые содер­жат спи­сок инте­рес­ных фак­тов и поговор­ки. На каж­дой стро­ке фай­лов находит­ся по одно­му фак­ту или поговор­ке.

Сде­лаем бота, в котором будут две кноп­ки: «Фак­ты» и «Поговор­ки». Если нажать любую, бот отпра­вит поль­зовате­лю соот­ветс­тву­ющее сооб­щение.

info

Ес­ли ты будешь исполь­зовать для это­го бота тот же токен, что и для пре­дыду­щего, то, что­бы уви­деть кноп­ки, переза­пус­ти бота коман­дой / start.

import telebotimport randomfrom telebot import types # Загружаем список интересных фактовf = open('data/facts.txt', 'r', encoding='UTF-8')facts = f.read().split('n')f.close() # Загружаем список поговорокf = open('data/thinks.txt', 'r', encoding='UTF-8')thinks = f.read().split('n')f.close() # Создаем ботаbot = telebot.TeleBot('Здесь твой токен, полученный от @botfather') # Команда start@bot.message_handler(commands=["start"])def start(m, res=False): # Добавляем две кнопки markup=types.ReplyKeyboardMarkup(resize_keyboard=True) item1=types.KeyboardButton("Факт") item2=types.KeyboardButton("Поговорка") markup.add(item1) markup.add(item2) bot.send_message(m.chat.id, 'Нажми: nФакт для получения интересного фактаnПоговорка для получения мудрой цитаты ', reply_markup=markup) # Получение сообщений от юзера@bot.message_handler(content_types=["text"])def handle_text(message): # Если юзер прислал 1, выдаем ему случайный факт if message.text.strip() == 'Факт' : answer = random.choice(facts) # Если юзер прислал 2, выдаем умную мысль elif message.text.strip() == 'Поговорка': answer = random.choice(thinks) # Отсылаем юзеру сообщение в его чат bot.send_message(message.chat.id, answer) # Запускаем ботаbot.polling(none_stop=True, interval=0)

При­мер работы бота, зна­юще­го фак­ты и поговор­ки

Бот, ведущий Telegram-канал с анекдотами

Пре­дыду­щие боты посыла­ли юзе­ру сооб­щения тог­да, ког­да получа­ли от него коман­ды или фра­зы. Но что, если нам нужен бот, который будет пери­оди­чес­ки и в авто­мати­чес­ком режиме пос­тить что‑то в наш канал?

Да­вай сде­лаем бота, который получа­ет спи­сок анек­дотов из фай­ла и каж­дый час пос­тит в канал один из этих анек­дотов. Для это­го нам нуж­но соз­дать свой канал в Telegram, добавить в под­писчи­ки канала нашего бота и наз­начить его адми­нис­тра­тором канала с пра­вом пуб­ликовать сооб­щения.

Файл с анек­дотами дол­жен лежать в пап­ке data рядом со скрип­том бота.

import telebotimport time # Токен, который выдает @botfatherbot = telebot.TeleBot('Здесь твой токен, полученный от @botfather')# Адрес телеграм-канала, начинается с @CHANNEL_NAME = '@адрес_твоего_канала' # Загружаем список шутокf = open('data/fun.txt', 'r', encoding='UTF-8')jokes = f.read().split('n')f.close() # Пока не закончатся шутки, посылаем их в каналfor joke in jokes: bot.send_message(CHANNEL_NAME, joke) # Делаем паузу в один час time.sleep(3600) bot.send_message(CHANNEL_NAME, "Анекдоты закончились :-(")

При­мер работы бота, ведуще­го канал с анек­дотами

Чат-бот «Маша»

Те­перь давай сде­лаем прос­тей­шего чат‑бота, который будет бол­тать с поль­зовате­лем. Для это­го мы под­готовим файл boltun. txt, содер­жащий стро­ки с воп­росами (в начале таких строк пос­тавим мет­ку u:) и отве­тами на них в сле­дующей стро­ке.

u: как зовутМаша меня зовут!u: сколько тебе летМне уже 18, честно-честно!

Файл boltun. txt помес­тим в пап­ку data рядом со скрип­том бота. Для поис­ка похожих воп­росов исполь­зуем модуль fuzzywuzzy, который поз­воля­ет срав­нивать, нас­коль­ко похожи меж­ду собой две стро­ки. Естес­твен­но, спер­ва этот модуль нуж­но уста­новить:

pip install fuzzywuzzypip install python-Levenshtein

Ни­же при­веден исходный код бота. Пос­ле его запус­ка напиши боту «При­вет» и поп­робуй с ним пооб­щать­ся. Естес­твен­но, это не искусс­твен­ный интеллект и набор его отве­тов огра­ничен фра­зами из фай­ла boltun. txt.

import telebotimport osfrom fuzzywuzzy import fuzz # Создаем бота, пишем свой токенbot = telebot.TeleBot('Здесь твой токен, полученный от @botfather') # Загружаем список фраз и ответов в массивmas=[]if os.path.exists('data/boltun.txt'): f=open('data/boltun.txt', 'r', encoding='UTF-8') for x in f: if(len(x.strip()) > 2): mas.append(x.strip().lower()) f.close() # С помощью fuzzywuzzy вычисляем наиболее похожую фразу и выдаем в качестве ответа следующий элемент спискаdef answer(text): try: text=text.lower().strip() if os.path.exists('data/boltun.txt'): a = 0 n = 0 nn = 0 for q in mas: if('u: ' in q): # С помощью fuzzywuzzy получаем, насколько похожи две строки aa=(fuzz.token_sort_ratio(q.replace('u: ',''), text)) if(aa > a and aa!= a): a = aa nn = n n = n + 1 s = mas[nn + 1] return s else: return 'Ошибка' except: return 'Ошибка' # Команда «Старт»@bot.message_handler(commands=["start"])def start(m, res=False): bot.send_message(m.chat.id, на связи. Напиши мне Привет )') # Получение сообщений от юзера@bot.message_handler(content_types=["text"])def handle_text(message): # Запись логов f=open('data/' + str(message.chat.id) + '_log.txt', 'a', encoding='UTF-8') s=answer(message.text) f.write('u: ' + message.text + 'n' + s +'n') f.close() # Отправка ответа bot.send_message(message.chat.id, s) # Запускаем ботаbot.polling(none_stop=True, interval=0)

При­мер работы чат‑бота

Выводы

Мы написа­ли пять прос­тых ботов, на при­мере которых научи­лись при­нимать и отправ­лять сооб­щения, делать кноп­ки и понимать неточ­ные зап­росы.

В сле­дующей статье мы рас­смот­рим работу с Telegram-ботами более под­робно: научим­ся делать ботов, работа­ющих через веб‑хуки, при­нимать опла­ту от поль­зовате­лей и вза­имо­дей­ство­вать с базой дан­ных SQLite.

Так­же при­зываю тебя не откла­дывать и записы­вать­ся на курс «Python для нович­ков», где мы от прос­тей­ших понятий перей­дем к соз­данию пер­вых инте­рес­ных про­ектов. Стар­туем уже сов­сем ско­ро!

Курс по Python

Курс «Python с нуля» нап­равлен на изу­чение основ и базовых кон­цепций прог­рамми­рова­ния. Пос­ле него ты смо­жешь лег­ко углу­бить­ся в любую из ИТ‑сфер: веб‑раз­работ­ку, ана­лиз дан­ных, безопас­ность при­ложе­ний и так далее. Про­дол­житель­ность кур­са — два кален­дарных месяца. Уро­ки будут про­водить­ся два раза в неделю (втор­ник и чет­верг, ори­енти­ровоч­но в 17:00 по Мос­кве), каж­дый по одно­му ака­деми­чес­кому часу. Пери­оди­чес­ки будут выдавать­ся домаш­ние задания.

За­писать­ся на курс

← Ранее Интерпол сообщил об аресте 1000 человек, связанных с киберпреступностью Далее → HTB Intelligence. Пентестим Active Directory от MSA до KDC

Если вы устали вручную рассылать подписчикам новые коллекции, не можете больше отвечать на стандартные вопросы и вообще хотели бы перепоручить это кому-то другому – создайте своего бота в Телеграме.

В статье подробно расскажем, как это сделать за пару часов. Погнали.

Содержание

Зачем нужен бот в Телеграме

Потратьте немного времени и сделайте бесплатного бота в Телеграме, чтобы освободить себя от рутинной работы. Этот маленький помощник будет выполнять простую работу по общению с пользователями: разговаривать с ними, отправлять новые коллекции и отвечать на стандартные вопросы 24/7. Он не устает и не оставляет без внимания сообщения подписчиков, всегда отвечает им и создает уютную атмосферу, пока владелец занят более важными задачами.

И это только маленькая часть того, что он может. Его в любой момент можно донастроить и добавить новые функции, изменить любую часть бота и перенастроить ответы. Робота можно постоянно поддерживать в актуальном состоянии.

Бот в Телеграме помогает подписчикам:

  • искать информацию;
  • читать и скачивать текстовые файлы;
  • искать и смотреть видео;
  • искать и слушать аудио;
  • комментировать статьи внутри мессенджера;
  • учиться – например, учить новые слова на иностранном языке.

Кроме того, бот умеет:

  • развлекать;
  • проводить конкурсы и опросы подписчиков;
  • показывать новости вашей группы, бизнеса, мира, чего угодно;
  • отвечать на вопросы;
  • рассылать сообщения подписчикам;
  • напоминать о встречах, помогать договариваться и организовывать их;
  • участвовать в групповых чатах;
  • выдавать информацию о товарах.

Это только популярная часть функций, которые подключают к ботам разные магазины и чаты в Телеграме. Что именно добавите вы – зависит от направления и требований вашего бизнеса.

В Телеграме и других соцсетях можно публиковать посты через сервис отложенного постинга SMMplanner. Вы можете планировать публикации одновременно в ВК, Одноклассники, другие соцсети и Телеграм. Это очень удобно – оцените сами. Тестировать весь функционал можно бесплатно в течение 2 недель после регистрации по ссылке – SMMplanner.

Подробно о том, как настроить автопостинг и зачем он нужен, – в статье «Автопостинг в Телеграме: боты, сервисы, возможности».

Одно из главных преимуществ любого бота в Телеграме – его не нужно устанавливать на устройство. Он работает прямо в мессенджере и там остается всегда.

Есть много способов создать бота в Телеграме: на телефоне или ПК, платных и бесплатных, с помощью программирования или конструкторов. А можно – вообще без знания кодов, на телефоне за пару часов.

Мы расскажем вам о бесплатном и самом простом способе создать бота в Телеграме самостоятельно. Подготовьте телефон, листайте вниз и приятного чтения.

Как сделать бота в Телеграме с помощью телефона

Заходим в Телеграм, в строке «Поиск» находим BotFather – это конструктор чат-ботов в Телеграме, нажимаем «Старт».

Хочешь сделать бота – найди бота, который их создает

Единственный минус этого бота в том, что он будет общаться с вами на английском языке. Ничего страшного в этом нет, мы поможем вам разобраться, как с его помощью сделать бота в Телеграме для сообщений и не только. Команды у него интуитивные, так что проблем возникнуть не должно.

Бот пришлет сообщение, что поможет создать и управлять вашими ботами. А чтобы создать нового, нужно нажать на /newbot.

В большом количестве вариантов выбираем нужный

Главный бот предложит вам придумать имя для вашего бота, которое будут видеть все и смогут по этому имени находить его. Название для своего робота вы можете подобрать в зависимости от того, чем вы занимаетесь и какого бота хотите создать. Вообще, название может быть любым. Обязательное правило – чтобы оно было уникальным. Также желательно, чтобы название было понятным.

Если придуманное имя уже существует, BotFather предложит придумать другое, уникальное.

В нашем случае тренировочный бот выступает в качестве магазина одежды. Поэтому мы дали ему название – Showroom «Чёткие шмотки».

После того, как новый бот получил свое имя, а BotFather его принял, он предложит придумать никнейм – это будет ссылка на нового робота в Телеграмме. В нашем случае мы просто перевели название на английский и отправили главному боту.

Робот родился, но он еще ничего не умеет. Ему еще предстоит научиться говорить и ходить.

У каждого бота есть токен – уникальная строка из символов, которая нужна, чтобы установить подлинность робота в системе. Его следует скопировать и не терять.

Желтым прямоугольником выделен токен бота

Все остальное на английском и нам пока не нужно.

Далее листаем чат с BotFather вверх и находим там ссылку /mybots или вводим ее вручную. Выбираем нашего готового бота и нажимаем на него.

Если у вас несколько ботов, то и для выбора главный бот предоставит несколько вариантов

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

Кроме прочего, главный бот будет показывать, заполнены ли поля – где пусто, там будет стоять соответствующий знак

Для первой настройки нужно нажать Edit Bot. В этом разделе можно редактировать:

  • имя;
  • описание;
  • информацию;
  • картинку бота.

На картинке мы видим, что у бота есть только имя. Описания, команд и картинки пока еще нет. Поэтому нам сейчас и предстоит наполнить нашего юного бота.

Как сделать приветствие в боте в Телеграме? Для создания/редактирования описания бота нужно нажать Edit Description, чтобы BotFather понял, что нам нужно изменить описание бота. После выбора этой функции главный бот пришлет сообщение с предложением ввести описание, которое увидят люди, когда откроют чат с новым ботом в блоке под названием «Что может делать этот бот?»

Заполняем Description – описание бота

Создайте описание своего бота исходя из того, чем он будет заниматься. Вы в любой момент сможете сменить род деятельности вашего бота и заново наполнить его обязанностями, если что-то пойдет не так.

Заполняем поле Description и сохраняем изменения

Мы придумали описание нашему боту. Когда мы заходим в чат, сразу видим его. Теперь бот умеет говорить, для чего он родился. Идем дальше.

После того, как мы придумали описание, выбираем Edit About, чтобы ввести информацию о боте.

Заполняем поле «Описание» или About

BotFather пришлет сообщение с предложением создать описание программы, которое увидят пользователи, когда зайдут в профиль нового бота. Как сделать текст в боте Телеграма – вписать его и сохранить.

Информация о боте готова, текс можно увидеть в чате с BotFather на картинке. Переходим к созданию аватарки.

Выбираем кнопку Edit Botpic, затем нажимаем скрепку, чтобы выбрать фото из галереи и отправляем его главному боту. Также можно сделать фото и использовать его.

Для выбора доступна вся ваша галерея

Постарайтесь выбрать интересный кадр, чтобы он иллюстрировал суть работы этого бота. Некоторые пользователи ставят картинки роботов, но это совершенно не информативно и смешивает бота с массой других безликих программ.

Картинку можно посмотреть в боте, выглядит интересно

Аватарка готова. Теперь мы можем увидеть, что бот уже не такой, как был до этого. Робот стал лучше выглядеть, у него есть фото и текст с описанием. Всю эту информацию увидят пользователи – не только, когда они зайдут в профиль, но и когда они поделятся ссылкой на бота с другими людьми.

Пора научить новичка командам. Выбираем пункт меню Edit Commands и получаем от бота такое сообщение: «ОК. Пришлите мне список команд для вашего бота, используя этот формат: command1 – описание; command2 – другое описание. Либо отправьте /empty, чтобы список оставался пустым».

Действуем, как говорит нам БотОтец – прописываем последовательно каждую команду

Вы можете создать все команды через BotFather или воспользоваться Manybot. С его помощью вы можете создать красивое меню, разослать сообщения пользователям своего бота, создать команды. И общается он на русском.

Мы создали одну команду и назвали ее «О нас» – для проверки работоспособности. А дальше для настройки действий, меню и команд перешли в Manybot. Так проще. Вы можете поступить как вам удобно.

В Телеграме можно сделать даже свои стикеры. Для бизнеса или для личного использования, порадовать клиентов или посмешить друзей – все на ваше усмотрение. О том, как их делать, мы говорили в статье «Как сделать свои стикеры в Телеграме».

Как настроить нового бота с помощью Manybot

В 2022 году есть еще один конструктор для чат-ботов в Телеграме. Находим Manybot, жмем «Старт» и после приветственного сообщения нажимаем «Добавить нового бота».

Бот говорит с нами на русском, это намного удобнее

Manybot предложит вам перейти в чат с BotFather и скопировать токен своего бота.

Переходим, копируем, нажимаем «Я скопировал токен».

Описание деятельности

После того, как Manybot принял токен нового бота, он предложит коротко описать, чем будет заниматься вновь прибывший бот, но этот момент можно пропустить, нажав команду /skip, как это сделали мы. Тем более, что мы уже описывали это через БотаОтца.

Кликаем на «Я скопировал токен»

Далее от Manybot придет сообщение, что новый бот создан и настроен. Затем он предложит отправить сообщение вашим подписчикам с ссылкой на вашего бота.

Кликаем на /skip или прописываем описание заново

Отправка первого сообщения подписчикам

Конечно, вы можете нажать «Отправить новое сообщение подписчикам», создав какой-нибудь пост. Но какой в этом смысл, если бот еще новичок и ничего пока не умеет? Правильнее и логичнее будет сделать рассылку позже, когда бот будет готов выполнять команды и принимать гостей. Поэтому мы переходим к настройке команд.

Настройка команд

Нажимаем на имя нового бота и переходим в его чат. Теперь разберемся, как сделать меню в боте в Телеграме.

В чате выбираем пункт «Создать команду». Бот ответит вам, что вы можете создавать разные команды, на которые он будет отвечать заранее заданным образом.

Кликаем на «Создать команду»

Команда создается так же, как и в BotFather – вводим commands и номер. У нас команда уже пятая, так как мы тренировались и настраивали бота и его команды.

В зависимости от того, как вы настроете своего бота, он может отвечать своим подписчикам одним или несколькими сообщениями и любыми файлами.

После запроса commands нужно нажать «Добавить вопрос» и выбрать вариант вопроса.

Бот может отвечать словами или файлами – как настроите

Есть 3 типа вопросов:

  • обычные;
  • развернутые;
  • с вариантами ответов.

Вы можете выбрать любой удобный. Бот все подробно и на русском языке поясняет.

Мы выбираем «Обычный вопрос», и наш бот будет отвечать любому подписчику, который пришлет ему текст, символ или даже картинку.

А что будет отвечать наш бот?

Аналогично настраиваются 2 других варианта

Даем произвольное название нашему обычному вопросу – «Головные уборы», загружаем картинку из галереи и нажимаем «Сохранить». То, что будет написано, покажется пользователям, которые будут запрашивать этот пункт.

Обязательно кликаем на «Сохранить»

Если понадобится отредактировать, нужно в меню бота выбрать пункт «Пользовательские команды» и выбрать ту команду, которую хотите изменить. В любой момент вы можете изменить название, режим и варианты ответов, настроить меню команды.

После сохранения команда готова, но у пользователей она не появится, когда они зайдут в меню. Для этого нужно настроить ее видимость.

Настройка видимости команды

Выбираем «Настроить гл. меню», а затем «Добавить пункт меню».

У нас это уже не первая команда в настройке, поэтому не удивляйтесь, что у вас количество кнопок намного меньше, это только пока

Вводим название пункта меню «Головные уборы», отправляем боту это сообщение, и готовый пункт с этим названием появляется в меню.

Команда готова к использованию, ничего сложного

Остальные пункты меню были созданы ранее тем же способом. Чтобы поменять их местами, в этом же меню выбираем нужную для перемещения команду и с помощью кнопок, которые будут доступны, перемещаем.

Как выглядит готовый к использованию бот

Вот так выглядит наш готовый бот с аккаунта подписчика:

Он рассказывает, что умеет делать, отвечает на команды

Выбираем команду «О нас», чтобы посмотреть, поймет ли читатель, куда попал. И получаем ответ от бота «О нашей компании».

Можно ему ответить любым текстом и получаем в ответ: «Пример текста. Наша компания занимается…» Это то, что мы указали в настройках. Вы можете здесь написать все что угодно о своей компании. Старайтесь рассказывать коротко, но понятно. Или просто вставьте ссылку на свой сайт, чтобы люди могли туда зайти и почитать подробнее. Перегружать чат многостраничными сообщениями об «активно развивающейся компании» не стоит, человек вряд ли пришел за этим. А если ему очень интересно, он почитает на сайте.

«О нас» почитали, можно переходить и к делу – посмотрим на «головные уборы»

В зависимости от настроек команд и их описания, бот может долго присылать пользователям разные варианты картинок, ответов, ссылок – все, что вы в него заложите.

Популярный и короткий вопрос «Еще?» может побуждать пользователя продолжать общение

Чем больше вы настроите кнопок и зальете информации, тем больше пользователь сможет узнать от вашего бота. Вполне можно вместе с картинкой показывать подписчику карточку товара или ссылку на него, чтобы он мог сразу переходить к заказу.

Таким же образом работают остальные кнопки

Головные уборы рассмотрели, а что там в пункте «Одежда»? Он настроен аналогично предыдущему, присылает картинки и общается с пользователем. Можно настроить сложную ветвь вариантов ответов, ведущих к разным пунктам и папкам. В ней подписчик будет плавно переходить к покупке, подписке или регистрации.

Все варианты модной одежды к вашим услугам

Любое сообщение, например, с новой коллекцией товаров, может приходить подписчикам, если его разослать от имени бота. Мы говорили об этом в самом начале, нужно только кликнуть по кнопке и отправить его.

Если нужно подробно изучить чат-боты и рассылки в ВК, приходите на 14-дневный практический курс «Рассылки, чат-боты и автоворонки ВКонтакте» от SMM.school. Там научитесь автоматизировать работу с помощью Senler, запускать рассылки, прогревать и продавать во ВКонтакте. Это самое актуальное руководство по автоматическим инструментам для продвижения бизнеса в ВК на данный момент.

Мы разобрались, как создать и настроить бота в Телеграме, как сделать меню и настроить чат. Ваш бот получится еще более продуманным, ведь вы создадите его для конкретных целей, а не ради эксперимента. Создавайте бота и рассылайте сообщения подписчикам, а мы скоро расскажем в нашем блоге, как подключить его к вашему каналу и научить говорить в нем с подписчиками.

image Интенсив «Научитесь собирать информацию с сайтов с помощью парсера на Python» tproger.ru События и курсы на tproger.ru

Ну вот и всё, простенький бот в Телеграмме на языке Python готов.

Docker

Сейчас мало кто не слышал про Docker, но если вдруг не слышали — вот хорошая статья. Для нашего проекта потребуется самый простой Dockerfile:

FROM python:3.8  # set work directory  WORKDIR /usr/src/app/  # copy project  COPY . /usr/src/app/  # install dependencies  RUN pip install --user aiogram  # run app  CMD ["python", "bot.py"]

Каталог проекта должны при этом содержать следующие файлы:

  • bot.py;
  • Dockerfile.

Для локальных тестов достаточно установить Docker (linux, mac, windows), после чего в папке проекта собрать и запустить контейнер с помощью команд:

docker build -t my_app  docker run -d my_app  

my_app — это просто название нашего контейнера, вместо которого можно использовать другое имя.

-d — специальный флаг, который запускает контейнер в фоне и позволяет дальше работать в терминале. Это называется detached mode.

Деплой на AWS

Прежде всего нам понадобится аккаунт на Docker Hub. Это аналог GitHub, только не с исходниками кода, а с уже созданными контейнерами. Работа с Docker Hub выглядит достаточно просто:

  1. Локально или с помощью пайплайнов собрали контейнер.
  2. Загрузили его на докер хаб.
  3. В любом удобном месте скачали его. Это может быть локальная машина, VPS сервер или облачный провайдер по типу AWS.
  4. Запустили.

Пройдёмся по этим шагам. Везде, где указано , надо вставлять свой юзернейм, использованный при регистрации на докерхабе. Если это ваша первая публикация на докерхаб, для начала потребуется залогиниться с помощью docker login.

Билдим контейнер:

docker build -t /my_app

Загружаем его на докерхаб:

docker push /my_app

Для проверки успешности загрузки можете запустить контейнер из Docker Hub с помощью команды:

docker run -d /my_app

Далее загрузим наш контейнер в AWS Elastic Beanstalk. Для этого потребуется аккаунт на AWS. Если его нет, необходимо зарегистрироваться. Вас попросят ввести данные карты для верификации, но переживать не стоит, ведь мы воспользуемся бесплатным годовым триалом. Чтобы поиграться, этого более чем достаточно, а вот если вы захотите вывести проект в продакшен, следует перейти на VPS — это даст больше контроля и гибкости.

  • Переходим в Elastic Beanstalk, на вкладку Applications, и создаём новое приложение:
  • Называем приложение, теги оставляем пустыми:
  • Создаём для приложения environment:
  • Выбираем Worker environment:
  • В качестве платформы выбираем Docker:
  • В пункте Application code нужно загрузить JSON-файл с конфигурацией Docker-образа. Сам файл:
Dockerrun.aws.json  {   "AWSEBDockerrunVersion": "1",   "Image": {     "Name": "/my_app",     "Update": "true"   },  "Ports": [   {     "ContainerPort": 5000,     "HostPort": 8000   }  ]  }  
  • Создаём окружение:
  • AWS начинает создавать окружение, просто ждём завершения процесса:
  • Если всё прошло успешно, вы увидите индикатор успешного запуска приложения:

Проверяем работу нашего Telegram bot:

Успех!

Заключение

Поздравляем! Теперь вы знаете, как писать роботов для Telegram на Python.

Бота можно дополнять другими функциями, например, добавить отправку файлов, опрос или клавиатуру.

Кстати, в телеграмме есть аж целых два типа клавиатур:

  1. Классическая RelpyKeyboardMarkup, у которой кнопки располагаются под полем ввода сообщения:
  2. Более современная InlineKeyboardMarkup, которая привязывается к конкретному сообщению:

Но и это полностью рабочий Телеграм-бот на Python: дополните словарём, и получите полноценную беседу. Также можете опробовать функциональность нашего Telegram-бота.

В «настоящих проектах» не обойтись без базы данных. Тут на помощь приходит docker-compose, который позволяет объединить несколько контейнеров в один сервис. Таким образом, например, можно создать приложение и положить его в контейнер, а базу данных, как отдельный сервис, поместить в другой контейнер, и с помощью docker-compose наладить между ними связь.

Также для более серьёзной разработки лучше использовать выделенный виртуальный сервер (VPS): он даёт гораздо больше гибкости и свободы, чем тот же AWS. А самое главное, он более приближён к «боевой» разработке. Схема работы тут будет даже проще, чем с AWS: вам просто нужно установить Docker, спуллить образ с Docker Hub и запустить его.

Оцените статью
Рейтинг автора
4,8
Материал подготовил
Егор Новиков
Наш эксперт
Написано статей
127
А как считаете Вы?
Напишите в комментариях, что вы думаете – согласны
ли со статьей или есть что добавить?
Добавить комментарий