Бот Telegram может выполнять практически любые задачи: управлять сообществами, фильтровать сообщения в чатах, помогать регистрировать пользователей или продавать услуги. В этой статье разберемся с основами создания Telegram-ботов и напишем своего для отправки пользователю случайных комплиментов из коллекции с помощью языка программирования Python.
Что такое Telegram-бот?
Telegram — популярный мессенджер, позволяющий пользователям обмениваться сообщениями, видео, музыкой и файлами. Блогеры используют сервис для публикации своего контента, а бизнес — чтобы продавать товары и услуги. Кроме всего прочего, в Telegram есть возможность создавать собственных ботов — программы внутри мессенджера, автоматизирующие общение.
У каждого бота есть уникальное имя, поэтому его можно легко найти в строке поиска Telegram. Также ботов можно добавлять в чаты и каналы, чтобы они выполняли роль модератора или администратора. С недавних пор Telegram-боты могут быть полноценными веб-приложениями с собственным пользовательским интерфейсом.
Какими бывают боты в Telegram
Возможности ботов ограничены только фантазией и навыками разработчиков, поэтому компании активно используют их для ежедневных задач.
Боты для автоматизации задач
Например, при помощи телеграм-бота можно автоматизировать запись на услуги в салон или к врачу и разгрузить администраторов. Бот может принять заявку в любое время суток, в выходные и праздники, а также и перенести информацию о записи в календарь компании.
Боты для продвижения и продаж
Бот может отвечать на вопросы клиентов, предлагать промокоды, рассказывать о новых продуктах. Telegram-бот здесь может взять на себя функцию социальных сетей, email-рассылки и продавца-консультанта.
Боты для общения и развлечения
Telegram-боты нужны не только для того, чтобы продавать. Они также могут помочь выбрать кино на вечер, предложить забавный тест или сгенерировать мем. Например, студенты Skillfactory разработали для Московского зоопарка Telegram-бот, который имитирует общение с манулом Тимофеем и предлагает поучаствовать в викторине.
Конструкторы для настройки ботов
Для создания простых ботов можно использовать сервисы-конструкторы. С их помощью получится реализовать наиболее частые сценарии использования: ответы на вопросы, выдачу информации по запросу и обработку данных пользователя. Такие сервисы не требуют знания программирования, их можно освоить за несколько часов.
Популярные конструкторы для создания ботов Telegram:
Manybot — сервис для создания ботов с помощью сообщений в чате. Подойдет для самых простых сценариев использования. У Manybot есть встроенная реклама и нет возможности отключить ее с помощью подписки;
botmother — редактор ботов, который умеет работать не только с Telegram, но и с другими популярными мессенджерами. Есть возможность обрабатывать медиа, файлы и обращаться к сторонним сервисам.
PuzzleBot — мощный конструктор, позволяющий создать бота практически любой сложности и без единой строчки кода. При этом важно понимать основы программирования: переменные, циклы и условия. Есть премиальная версия по подписке.
Какие технологии нужны, чтобы создать чат-бота в Telegram с нуля?
Если от бота нужны нестандартные сценарии использования или в проекте важно полностью контролировать поведение и обработку данных, то без программирования не обойтись. У Telegram открытое API с хорошей документацией, поэтому ботов можно разрабатывать практически на любом языке программирования, но удобнее использовать для этого уже готовые библиотеки.
Разработчики Telegram активно развивают мессенджер, поэтому от библиотеки важно, чтобы она обновлялась так же часто и поддерживала все новшества сервиса. Ботов чаще всего пишут на Python из-за простоты и удобства этого языка.
Для Python существуют следующие библиотеки для ботов Telegram:
aiogram — комплексная библиотека с отличной документацией, поддержкой и активным сообществом. Есть русскоязычное сообщество разработчиков, которое поможет с трудностями и ответит на вопросы. Библиотека aiogram поддерживает асинхронность, работу с машиной состояний и рассчитана на разработку сложных ботов с большим количеством ежедневных пользователей. Сейчас у aiogram две активные версии, и лучше сразу выбирать версию 3.0, которая пока находится в бете, но работает стабильно. Библиотека подразумевает глубокие знания Python и опыт в программировании, поэтому может быть сложной для начинающих;
telebot (pyTelegramBotAPI) — библиотека для простых ботов с небольшим количеством пользователей, поддерживающая работу с основными методами Telegram API. С telebot сложнее организовать асинхронность и управлять большой нагрузкой, но новичкам в разы легче и приятнее с ней работать.
В статье мы будем использовать библиотеку telebot и писать код на Python, поэтому нам понадобится редактор кода. Сейчас разработчики в основном используют один из двух редакторов:
Visual Studio Code — бесплатный редактор кода от компании Microsoft с задатками полноценной среды разработки. VS Code можно использовать практически с любыми языками программирования и технологиями. Для этого компания предусмотрела маркетплейс плагинов, расширяющих возможности редактора. VS Code полностью бесплатный и доступен для Windows, macOS и Linux.
PyCharm — полноценная среда разработки на Python от компании JetBrains. Более тяжеловесная, чем VS Code, и включает в себя дополнительные инструменты для профессиональной работы над большими проектами. Есть как бесплатная версия, так и продвинутая по подписке. Для разработки даже самых сложных ботов хватит возможностей бесплатной версии PyCharm.
Как создать своего бота в Telegram
Разработка Telegram-бота начинается с его создания в мессенджере. Для этого команда сервиса предусмотрела специального бота BotFather, через которого осуществляется управление другими ботами пользователя. Важно отметить, что BotFather доступен только под этим именем и оснащен синей галочкой верификации. Найти его можно через строку поиска или по ссылке.
После перехода в BotFather нажимаем на кнопку «Начать». В чат придет сообщение со списком всех команд, доступных в боте. Так как мы создаем нового бота, то нам нужна команда `/newbot`. Ее можно выбрать из списка или ввести с клавиатуры и отправить в чат.
После этого BotFather попросит ввести название бота, которое пользователи будут видеть в его профиле и списке своих чатов. Оно может быть любым, но должно передавать суть бота и его возможности. Мы разрабатываем бота для комплиментов, так его и назовем — «Комплименты».
Теперь нашему боту надо задать имя пользователя, по которому его можно будет найти в Telegram. В этом случае уже есть несколько правил оформления:
- имя бота должно заканчиваться словом `bot`: к примеру, `SuperBot` или `super_bot`. Это обязательное требование Telegram, чтобы пользователи могли отличать обычные профили от ботов. Исключение делается только для внутреннего BotFather, имя которого начинается с ключевого слова, а не заканчивается им;
- имя бота должно быть уникальным, а учитывая, что многие создают ботов ради эксперимента и не удаляют их, то найти подходящий свободный вариант может быть проблематично.
Исходя из всего этого, подбираем звучное имя, состоящее из ключевых слов, которые бы точно описывали его суть. Для экспериментов можно использовать просто набор символов. В нашем случае имя `compliment_bot` уже было занято, поэтому использовали `super_compliment_bot`. Получилось слишком длинно, но отражает суть.
После регистрации BotFather передаст нам токен для доступа к нашему боту и подскажет ссылки на официальную документацию по разработке ботов для Telegram. Важно запомнить, что токен надо держать в секрете. С его помощью можно полностью управлять ботом и сообщениями, которые он отправляет. Посторонние лица, не имеющие отношения к разработке вашего бота, не должны его знать.
Оформление бота
Бот создан, и его можно найти в строке поиска Telegram или по ссылке. Но в таком виде пользователю будет очень сложно понять, для чего нужен бот и какие задачи он выполняет. Поэтому оформим его, добавив описание, иконку и приветственное изображение.
Для этого опять откроем BotFather, введем команду `/mybots` и выберем из списка только что созданного бота. Перед нами откроется меню управления ботом.
Коротко о каждом пункте меню:
API Token — можно узнать токен, если потеряли его. Также можно отозвать имеющийся токен и сгенерировать новый, если кто-то все же узнал его и перехватил на себя управление ботом;
Edit Bot — меню редактирования бота, в котором можно изменить имя, добавить описание, иконку, приветственное изображение и команды;
Bot Settings — тут можно выдавать боту права на взаимодействия с сообщениями в групповых чатах и каналах, добавлять кнопки и включить инлайн-режим;
Payments — бот может принимать платежи, к примеру, можно предлагать его функции по подписке или продавать через него товары. В этом пункте меню можно подключить платежную систему для обработки платежей и банковский счет. Есть поддержка российских платежных систем;
Transfer Ownership — бот принадлежит пользователю, который его создал, но права на владение и управление можно передать с помощью этого пункта меню;
Delete Bot — если бот больше не нужен, то его можно удалить, освободив список свободных уникальных имен.
У нашего бота пока есть только название. Теперь зададим ему описание, которое будет видно в окне его профиля. Для этого в меню бота выбираем Edit Bot → Edit About и присылаем в чат короткое описание. После зададим расширенное описание, выводящееся в чате новым пользователям. Переходим в Edit Bot → Edit Description и присылаем текст.
Для узнаваемости боту надо установить иконку, которую будет видно в списке чатов пользователя. Для иконок есть ограничения:
- формат файла должен быть jpg или png;
- квадратное изображение не меньше 300×300px и не больше 1280×1280px. Лучше всего использовать изображения размером 500×500px;
- изображение надо отправить BotFather в виде фото, а не файла.
Также боту можно задать изображение с описанием его возможностей. Его будут видеть новые пользователи при переходе в чат. Можно использовать картинки размером 640×360px или гифки 320×120px/640×360px. На таком изображении можно тезисно указать возможности бота и оставить QR-код с ссылкой на сайт компании или разработчика для пользователей, которые используют настольную версию Telegram.
Иконку бота можно задать, перейдя в Edit Bot → Edit Botpic, а изображение-описание — Edit Bot → Edit Description Picture. После настройки наш Telegram-бот выглядит так:
Начинаем программировать
Теперь у нас есть готовый оформленный бот, который ничего не умеет. Если открыть и запустить бота командой `/start` или кнопкой, то ничего не произойдет. Поэтому надо его оживить и научить обрабатывать сообщения от пользователя. Наш бот будет присылать в чат случайный комплимент из собственной коллекции.
Сперва надо установить среду разработки. В этой статье будем использовать PyCharm от JetBrains. Скачать установочный файл можно с официального сайта разработчика. Скачать и установить Python можно с официального портала. Проверить установленную версию Python можно с помощью следующей команды:
При создании бота мы будем в основном работать с библиотекой telebot. Поэтому ее надо установить. Заходим в PyCharm и создаем новый проект с названием `bot`. PyCharm создаст необходимое окружение, в котором мы установим библиотеку. Для этого надо открыть вкладку Terminal в редакторе кода и ввести команду `pip install pyTelegramBotAPI` для Windows или `pip3 install pyTelegramBotAPI` для macOS.
В папке проекта должен был автоматически появиться файл `main.py`. Если этого не произошло, то создаем его сами. Теперь научим нашего бота здороваться. Для этого в файле `main.py` импортируем `telebot`, создадим переменную `token` с нашим токеном и передадим его экземпляру бота.
import telebot # Импортируем telebot token = ('Ваш токен') bot = telebot.TeleBot(token)
Теперь создадим хендлер для обработки команды `/start`. Хендлер (Heandler) или обработчик — функция, которая вызывается в ответ на наступление определенного события. В случае с Telegram хендлер запускает функцию при получении сообщения.
В самом хендлере создадим функцию `start_message` с текстом сообщения, которым бот будет отвечать на полученную команду. Нам нужно бесконечное выполнение кода, чтобы бот работал всегда и был доступен в любое время суток. Поэтому завершим все строкой `bot.polling(none_stop=*True*, interval=0)`, которая будет запускать бесконечное выполнение.
import telebot # импортируем telebot # передаём значение переменной с кодом экземпляру бота token = ('Ваш токен') bot = telebot.TeleBot(token) # хендлер и функция для обработки команды /start @bot.message_handler(commands=['start']) def start_message(message): bot.send_message(message.chat.id, "Привет ✌️") # бесконечное выполнение кода bot.polling(none_stop=True, interval=0) Встроить код
Сейчас можно попробовать запустить код в PyCharm и открыть бота в Telegram. Если отправить ему команду `/start`, то он ответит сообщением, которое мы передали ему в коде. Бот работает, значит, можно наращивать его возможности.
Сейчас токен бота находится в одном файле с его кодом. Такой подход можно применять в разработке, но если надо будет поделиться кодом с кем-то или опубликовать его на GitHub, то токен надо будет удалять и тратить на это время. А еще можно просто забыть удалить токен, и тогда безопасность бота будет под вопросом.
Поэтому создадим в папке проекта файл `secrets.py` и в файле инициализируем словарь с ключом `BOT_API_TOKEN` и самим токеном в виде значения ключа.
secrets = {'BOT_API_TOKEN': 'Ваш токен'} Встроить код
Теперь вернемся к файлу `main.py`, импортируем словарь из файла `secrets.py` и сделаем так, чтобы токен подтягивался из файла, а не находился в коде.
import telebot # импортируем telebot from secrets import secrets # импортируем словарь с токеном из файла secrets.py # передаём значение переменной с кодом экземпляру бота token = secrets.get('BOT_API_TOKEN') bot = telebot.TeleBot(token) # хендлер и функция для обработки команды /start @bot.message_handler(commands=['start']) def start_message(message): bot.send_message(message.chat.id, "Привет ✌️") # бесконечное выполнение кода bot.polling(none_stop=True, interval=0)
Снова запускаем код и проверяем. Бот продолжает отвечать на команду `/start`, но в его коде уже нет токена. Поэтому можно спокойно делиться файлом `main.py` и не бояться за безопасность.
Разработчики могут встраивать кнопки для удобного общения с Telegram-ботами. Воспользуемся этой возможностью и создадим несколько кнопок для автоматической отправки команд. Нам потребуется определение типов сообщений, поэтому для этого импортируем `types` из `telebot`. Часть с импортами в коде будет выглядеть так:
import telebot # импортируем telebot from secrets import secrets # импортируем словарь с токеном из файла secrets.py from telebot import types # для определения типов
Теперь перепишем хендлер для обработки команды `/start`. Он будет не только отправлять приветственное сообщение, но и инициализировать кнопки бота. В нашем боте две кнопки: «Старт» будет выводить краткую инструкцию по использованию бота, а «Комплимент» — присылать приятное сообщение из коллекции. Сами кнопки украсим эмодзи.
Вместе с этим заменим текст приветственного сообщения. Будем обращаться к пользователю по имени. Мы не можем знать имен всех пользователей, но их знает Telegram, поэтому спросим у него с помощью конструкции `{0.first_name}` . Весь код хендлера выглядит так:
# хендлер и функция для обработки команды /start @bot.message_handler(commands=['start']) def start_message(message): markup = types.ReplyKeyboardMarkup(resize_keyboard=True) start_button = types.KeyboardButton("🚀 Старт") action_button = types.KeyboardButton("🥰 Комплимент") markup.add(start_button, action_button) bot.send_message(message.chat.id, text="Привет, {0.first_name} 👋\nВоспользуйся кнопками".format(message.from_user), reply_markup=markup)
Бот обзавелся красивыми кнопками, но если попробовать нажать на них, то ничего не произойдет. Исправим это, дописав функции для ответа. Кнопка в Telegram просто отправляет в чат то, что на ней написано. Поэтому надо научить бота анализировать полученные сообщения и отвечать на сообщения-триггеры.
Для начала создадим коллекцию комплиментов в отдельном файле `compliments.py`:
compliments = ('Выглядишь лучшее всех!', 'Сегодня будет замечательный день!', 'Ты обязательно всё сможешь!', 'Я не встречал людей добрее тебя!', 'С тобой приятно проводить время!',)
После этого импортируем файл и модуль для работы со случайными числами:
import random # для выбора случайного комплимента from compliments import compliments # коллекция комплиментов
Теперь можно приступать к созданию хендлера для обработки кнопок. В условии будем отслеживать, какой текст пришел от пользователя. Если встречаем «🚀 Старт», то выводим краткое описание возможностей, если «🥰 Комплимент» — присылаем случайное сообщение из коллекции. На все остальные сообщения будем отвечать просьбой воспользоваться кнопками. Весь код хендлера выглядит так:
# хендлер для обработки нажатий кнопок @bot.message_handler(content_types=['text']) def buttons(message): if (message.text == "🚀 Старт"): bot.send_message(message.chat.id, text="Я могу поддержать тебя и поднять настроение. Просто попроси об этом") elif (message.text == "🥰 Комплимент"): bot.send_message(message.chat.id, text=f"{random.choice(compliments)}") else: bot.send_message(message.chat.id, text="Я могу отвечать только на нажатие кнопок")
Бот готов, исправно работает, отвечает на сообщения и присылает в чат случайные комплименты из собственной коллекции, а его полный код выглядит так:
import telebot # импортируем telebot from secrets import secrets # словарь с токеном из файла secrets.py from telebot import types # для определения типов import random # для выбора случайного комплимента from compliments import compliments # коллекция комплиментов # передаём значение переменной с кодом экземпляру бота token = secrets.get('BOT_API_TOKEN') bot = telebot.TeleBot(token) # хендлер и функция для обработки команды /start @bot.message_handler(commands=['start']) def start_message(message): # создаём кнопки бота markup = types.ReplyKeyboardMarkup(resize_keyboard=True) start_button = types.KeyboardButton("🚀 Старт") action_button = types.KeyboardButton("🥰 Комплимент") markup.add(start_button, action_button) # приветсвенное сообщение для команды /start bot.send_message(message.chat.id, text="Привет, {0.first_name} 👋\nВоспользуйся кнопками".format(message.from_user), reply_markup=markup) # хендлер для обработки нажатий кнопок @bot.message_handler(content_types=['text']) def buttons(message): if (message.text == "🚀 Старт"): bot.send_message(message.chat.id, text="Я могу поддержать тебя и поднять настроение. Просто попроси об этом") elif (message.text == "🥰 Комплимент"): bot.send_message(message.chat.id, text=f"{random.choice(compliments)}") else: bot.send_message(message.chat.id, text="Я могу отвечать только на нажатие кнопок") # бесконечное выполнение кода bot.polling(none_stop=True, interval=0)
А полное дерево файлов в проекте выглядит так:
. └── bot/ ├── main.py ├── secrets.py └── compliments.py
Сейчас бот работает только в том случае, если код запущен на компьютере. Поэтому пользователи не могут получить к нему постоянный доступ. Для этого надо арендовать виртуальный сервер, загрузить на него код бота и запустить. В таком случае бот будет доступен в любое время и не будет зависеть от компьютера разработчика.