Приветствую всех, вы попали на территорию СВПиД. Сегодня ваш ведущий я, S.
Итак, могу поздравить вас с крещением. В этой статье мы начнём осваивать ботов "под капотом", то есть, учиться писать их с нуля. Начнём мы, как вы уже могли понять, с простейших команд со знаком /. Например, самым распространённым представителем является команда /start, которая используется почти в каждом боте.
1. Необходимые программы и библиотеки
Прежде, чем приступить к работе, нам понадобится установить некоторые приложения и библиотеки. Для начала скачиваем язык программирования Python. Версии 3.13 вам будет достаточно. Кто хочет, может поставить и повыше. Его установите самостоятельно и не забывайте обратить внимание на вашу операционную систему и её разрядность.
Затем нам понадобится компилятор. Советую поставить PyCharm или можете поставить VSCode. Тоже попрошу установить самостоятельно.
Курс будет вестись на PYCharm. Если есть желание, то можете работать на любом другом компиляторе.
Итак, скачали, открыли. Что делаем? Создаём проект, а дальше у нас будет несколько вариантов, как установить пакет необходимых библиотек. Либо вы через (верхний левый угол) File -> Settings ->Python Interpreter -> + и в строку поиска вбиваем python-telegram-bot -> Install Package.
Либо можете скачать через терминал. Для этого воспользуйтесь командой:
pip install python-telegram-bot --upgrade
Готово. Этого пока что достаточно. Другие библиотеки, которые мы будем использовать, в основном являются встроенными в язык.
2. Необходимое в программе
Давайте рассмотрим базовые понятия в написании ботов. Для этого нам просто необходимо создать самого простейшего бота, который будет иметь всего три команды: /start, /help, /hello.
Процесс создания (чтобы не было проблем с понятностью кода) следует делить на составляющие:
P.S.: Я не хочу призывать вас делать, как я. Если вам удобнее писать иначе, пишите иначе. Я только за!
2.1. Import
Вначале программы прописываются import-ы. Для первого бота нам понадобится рассмотреть несколько основных import-ов из библиотек. По большей части на них держится всё создание ботов. Давайте же их импортируем:
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes
А теперь по порядку. Что есть что?
- Update - специальная функция, которая будет принимать все действия от пользователя: нажатые кнопки, отправленные сообщения, картинки и подобное. Содержится в библиотеке telegram.
- Application - можно сказать, что это "мозг" бота. Через этот объект бота мы и будем управлять всеми процессами. Даже запуск бота происходит через него. Далее все объекты будут из библиотеки telegram.ext.
- CommandHandler - обработчик команд типа /start, а также то, с чем мы в основном и будем работать.
- MessageHandler - обработчик обычных сообщений.
- filters - набор фильтров, которые определяют, какие сообщения будут обрабатываться. Например, только картинки. В этот раз он нам не понадобится, но мы к нему подойдём вплотную.
- ContextTypes - используется для настройки возвращаемых данных.
2.2. API
Далее пропишем наш API в виде переменно (так как использоваться он может несколько раз и это просто удобнее)
TOKEN = "Ваш API-токен, копируем из BotFather"
2.3. Команды /start, /help, /hello
Некоторой небольшой традицией у программистов стало вывод строки "Hello, World!" в консоль. Давайте сделаем это в ботах, а заодно заложим шаблон для дальнейшей работы с ботом.
Начнём с функции /start. Обычно в ней выводят либо приветствие, либо основные сведения о боте. Так как мы уже сделали оформление нашего бота в прошлом эпизоде, то заставим нашего бота выводить просто приветствие. Для этого пропишем следующий код:
async def start(update: Update, context:ContextTypes.DEFAULT_TYPE):
await update.message.reply_text("Привет! Я твой первый бот 🤖\nНапиши /help, чтобы узнать команды.")
Теперь немного остановимся на коде. async def - это асинхронная функция, которая вызывается сама по себе, чтобы исполнить определённое действие. То есть, её не нужно дополнительно вызывать. В данном случае она ожидает сообщения /start от пользователя.
update: Update, context:ContextTypes.DEFAULT_TYPE - указывается у любых команд, которые будут работать напрямую с пользователем. Это, можно сказать, основа функций бота. Update будет принимать всё от пользователя, context же наоборот будет хранить особые функции, чтобы обработать эти сообщения.
await - это способ дождаться выполнения асинхронной операции (update.message.reply_text("Привет! Я твой первый бот 🤖\nНапиши /help, чтобы узнать команды.")
message.reply_text - функция, чтобы сообщением отправить ответ пользователю (именно сообщения в качестве ответа, а ни как-то иначе, что в данном контексте будет правильнее).
Теперь пропишем оставшиеся функции. Их код очень похож на функцию \start
Функция /help. Обычно она отвечает за показ всех команд, которые используются в боте. Её код будет следующим:
async def help(update: Update, context:ContextTypes.DEFAULT_TYPE):
await update.message.reply_text("Список команд бота:\n/start - перезапуск бота\n/help - выводит "
"список команд\n/hello - выводит самый простейши код бота")
Функция /hello. Её цель просто вывести пользователю сообщение "Hello, World!". Рассмотрим и её код:
async def hello(update: Update, context:ContextTypes.DEFAULT_TYPE):
await update.message.reply_text("HELLO, WORLD!!!!!!!!!!!!!!!!")
2.4. Функция обработки сообщений
Далее нам понадобится где-то указать, что именно после команды /start у нас будет срабатывать функция start. Для этого нам понадобится базовая функция языка программирования main. Код почти полной функции будет следующим:
def main():
app = Application.builder().token(TOKEN).build()
app.add_handler(CommandHandler("start", start))
app.add_handler(CommandHandler("help", help))
app.add_handler(CommandHandler("hello", hello))
Тут уже дам следующий комментарий.
app = Application.builder().token(TOKEN).build(), где происходит вот что:
Application.builder() - создаёт “строитель” бота (builder)
.token(TOKEN) - передаёт токен твоего бота (мы его писали ранее)
.build() - собирает готовое приложение (объект бота)
По сути, это команда: "Создай бота и подключи его к Telegram API".
Затем происходит регистрация команд. Бот выстраивает среду команд: /start, /help и /hello. Мы даём ему понять через CommandHandler, что это будет команда (со знаком /), а также название команды, а затем передаём функцию, к которой мы обратимся после принятия этой команды.
2.5. Запуск бота
Мы продолжаем находиться во всё той же функции main. Остался последний штрих: запустить бота. Но перед этим укажу ещё одну фишку.
Как себя контролировать? Вы точно уверены, что ваш код работает корректно? Тогда перед запуском либо функции, либо всего бота пропишите строчку:
print("Бот запущен...")
Эта строчка выведет вам в консоль, что всё хорошо. Это лёгкий способ, далее мы посмотрим более точный.
Теперь давайте же запустим бота:
app.run_polling()
Но, если мы попробуем запустить, будет не совсем корректно. Далее, уже после функции main() нам нужно прописать следующую команду:
if __name__ == "__main__":
main()
Зачем она нужна? По сути она сигнализирует о запуске бота напрямую. А если точнее, то у неё следующие функции:
- предотвращает автозапуск кода при импорте;
- позволяет запускать бота только намеренно;
- делает код чище, правильнее и модульнее.
3. Запуск бота и полный код
Теперь публикую полный код, который мы написали с комментариями, чтобы вам было легче разобраться и запомнить:
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes #импорт необходимых библиотек
TOKEN = "ВАШ ТОКЕН" #ваш токен
async def start(update: Update, context:ContextTypes.DEFAULT_TYPE): #функция для команды /start
await update.message.reply_text("Привет! Я твой первый бот 🤖\nНапиши /help, чтобы узнать команды.")
async def help(update: Update, context:ContextTypes.DEFAULT_TYPE): #функция для команды /help
await update.message.reply_text("Список команд бота:\n/start - перезапуск бота\n/help - выводит "
"список команд\n/hello - выводит самый простейши код бота")
async def hello(update: Update, context:ContextTypes.DEFAULT_TYPE): #функция для команды /hello
await update.message.reply_text("HELLO, WORLD!!!!!!!!!!!!!!!!")
def main(): #функция для общей обработки и сборки бота
app = Application.builder().token(TOKEN).build() #основная переменная сбрки (основа - ваш API)
app.add_handler(CommandHandler("start", start)) #обработка каждой команды
app.add_handler(CommandHandler("help", help))
app.add_handler(CommandHandler("hello", hello))
print("Бот запущен...") #сигнал, что бот запущен
app.run_polling() #запуск бота
if __name__ == "__main__": #проверка, что запущен напрямую
main()
Теперь полюбуемся нашим результатом:
Также посмотрим, что наш сигнал сработал:
4. Итог
Итог будет разделяться на несколько этапов. Вначале намекну на следующее занятие.
4.1. А что там с фильтрами?
Итак, мы подошли вплотную к моменту, а что если пользователь будет отправлять не то, что мы задумывали? Например, вместо команд скинет картинку или скинет неизвестную команду. Это может вызвать ошибку и экстренно завершить работу бота.
Что же с этим делать? Узнаете на следующем занятии, но советую прочитать про фильтры. Всю официальную информацию по библиотеке можно найти в их руководстве: https://docs.python-telegram-bot.org/en/stable/index.html.
4.2. Домашнее задание
Да, теперь с этого момента у нас будет дз, так как, чтобы научиться программировать, необходимо получать опыт. Дз мы будем разбирать в спец выпуске, который будет выходить тут же, так что, не переживайте.
Сегодня вам следующие задания:
Повторить код, который писали в этой статье (не просто копировать, а писать вручную; необходимо научиться вначале работать руками);
Напишите две дополнительные команды: /rand_number - выводит любую цифру от 0 до 9; /какое-то название - эта команда должна выводить какую-нибудь строку в ответ пользователю (подобно /hello);
Для преуспевающих доп задание: с помощью команды /name - вывести имя пользователя.
На сегодня достаточно.
4.3. Постскриптум
Итак, начинающий программист, поздравляю тебя с первыми успехами в написании ботов. Дальше будет интереснее, главное продолжать работать)
В целом, это довольно просто. Библиотека включает в себя в районе 100 самых часто используемых программ. Всё остальное используется редко.
Ботов можно отлично монетизировать, так что, дерзайте)
А с вами была Территория СВПиД и её ведущий, S. Успехов вам и всем до встречи, не прощаюсь)