Перейти к содержимому

Bot message handler что это

  • автор:

Типы обработчиков модуля python-telegram-bot

Внимание! Пакеты python-telegram-bot версии 13.x будут придерживаться многопоточной парадигмы программирования (*на данный момент актуальна версия 13.15). Пакеты версий 20.x и новее предоставляют чистый асинхронный Python интерфейс для Telegram Bot API. Дополнительно смотрите основные изменения в пакете python-telegram-bot версии 20.x.

Обработчик сообщений — это экземпляр, производный от базового класса telegram.ext.Handler , который отвечает за передачу различных видов сообщений (текст, звук, встроенный запрос, нажатия кнопок и т. д.) в соответствующую функцию обратного вызова.

Например, если надо, чтобы бот отвечал на команду /start , нужно использовать обработчик telegram.ext.CommandHandler , который сопоставляет ввод команды пользователя /start с обратным вызовом с именем start_callback :

Например, обработка команды /start для python-telegram-bot версии 13.x:

. def start_callback(update, context): update.message.reply_text("Welcome to my awesome bot!") . updater = Updater('TOKEN') dispatcher = updater.dispatcher dispatcher.add_handler(CommandHandler("start", start_callback)) 

Пример обработки команды /start для асинхронного python-telegram-bot версии 20.x:

. async def start_callback(update, context): await update.message.reply_text("Welcome to my awesome bot!") . application = ApplicationBuilder().token('TOKEN').build() application.add_handler(CommandHandler("start", start_callback)) 

Обработчики сообщений пакета python-telegram-bot :

Для разных типов пользовательского ввода в полученных от telegram.Update сообщениях будут установлены разные атрибуты. Например, входящее сообщение приведет к update.message , содержащему отправленное сообщение. Нажатие встроенной кнопки приведет к установке update.callback_query . Чтобы различать все эти сообщения, модуль telegram.ext содержит следующие обработчики:

  • Класс MessageHandler(filters, callback) предназначен для обработки всех сообщений Telegram. Они могут содержать текст, мультимедиа или обновления статуса и т.д. Будете использовать в 70% случаев совместно с фильтрами сообщений.
  • Класс CommandHandler(command, callback, filters=None) предназначен для обработки команд. Команды представляют собой сообщения, которые начинаются с / . Будете использовать в 20% случаев.
  • Класс CallbackQueryHandler(callback) предназначен для обработки запросов обратного вызова Telegram (нажатие кнопок встроенной клавиатуры).
  • Класс ConversationHandler(entry_points, states, fallbacks) предназначен для ведения разговора с одним или несколькими пользователями через сообщения Telegram путем управления четырьмя коллекциями других обработчиков. Пример использования данного обработчика можно посмотреть в разделе создания меню из кнопок (Пример встроенной клавиатуры с 2-мя состояниями).
    • entry_points — список обработчиков сообщений, которые используются для инициирования разговора, например, с CommandHandler или MessageHandler .
    • state — представляет собой словарь dict , который в качестве ключей хранит состояния/этапы разговора, а в качестве значений этих ключей один или несколько (список) связанных обработчиков сообщений, которые должны быть использованы, если пользователь отправляет сообщение, когда разговор с ними в настоящее время находится в этом состоянии/этапе. Здесь также можно определить состояние TIMEOUT для определения поведения при превышении conversation_timeout .
    • fallbacks — это список обработчиков сообщений, которые используются, если пользователь в данный момент находится в разговоре, но состояние либо не имеет связанного обработчика, либо обработчик, связанный с состоянием, не подходит для обновления, например, если обновление содержит команду, но ожидается обычное текстовое сообщение. Это поведение можно использовать для отмены разговора или сообщения пользователю, что его сообщение не было распознано.

    Чтобы изменить состояние разговора, функция обратного вызова обработчика должна вернуть новое состояние после ответа пользователю. Если она ничего не возвращает (по умолчанию), то состояние не изменится. Если функция обратного вызова точки входа возвращает None, разговор заканчивается сразу же после выполнения этой функции обратного вызова. Чтобы завершить разговор, функция обратного вызова должна вернуть END или -1. Для обработки тайм-аута разговора используйте TIMEOUT или -2.

    Пример фрагмента кода определения обработчика разговора ConversationHandler :

    conv_handler = ConversationHandler( # точка входа в разговор entry_points=[CommandHandler('start', start)], # словарь состояний разговора, возвращаемых callback функциями states= # Этап `FIRST` - т.е. функция обработчик сообщения в этом разговоре явно # вернула константу FIRST (return `FIRST`), а так же послала/ответила # на сообщение. Ответ пользователя на это сообщение будет # обрабатываться обработчиками определенными в этом списке FIRST: [ CallbackQueryHandler(one, pattern='^' + str(ONE) + '$'), CallbackQueryHandler(two, pattern='^' + str(TWO) + '$'), CallbackQueryHandler(three, pattern='^' + str(THREE) + '$'), CallbackQueryHandler(four, pattern='^' + str(FOUR) + '$'), ], # Этап `SECOND` - происходит то же самое, что и в описании этапа `FIRST` SECOND: [ CallbackQueryHandler(start_over, pattern='^' + str(ONE) + '$'), CallbackQueryHandler(end, pattern='^' + str(TWO) + '$'), ], >, # точка выхода из разговора fallbacks=[CommandHandler('start', start)], ) 
    from telegram.ext import ChosenInlineResultHandler def result_chosen(update, _): print(update.to_dict()) # результат inline запроса result = update.chosen_inline_result # параметры результата result_id = result.result_id query = result.query user = result.from_user.id print(result_id) print(user) print(query) print(result.inline_message_id) result_chosen_handler = ChosenInlineResultHandler(result_chosen) dispatcher.add_handler(result_chosen_handler) 
    # сработает на команду '!test'. PrefixHandler('!', 'test', callback) # сработает на команды '!test' и '#test'. PrefixHandler(['!', '#'], 'test', callback) # сработает на команды '!test', '#test', '!help' и '#help'. PrefixHandler(['!', '#'], ['test', 'help`], callback) 

    В некоторых случаях полезно обрабатывать сообщения, поступающие не из Telegram. Например. можно обрабатывать уведомления от сторонней службы и пересылать их своим пользователям. Для таких случаев python-telegram-bot предоставляет следующие обработчики:

    • Класс TypeHandler() предназначен для обработки обновлений пользовательских типов. Тип type — тип сообщения, которые должен обрабатывать этот обработчик, как определено isinstance() .
    • Класс StringRegexHandler(pattern, callback) предназначен для обработки обновлений строк на основе регулярного выражения, которое проверяет содержимое сообщения.
    • Класс StringCommandHandler(command, callback) предназначен для обработки пользовательских строковых команд. Команды представляют собой сообщения, которые начинаются с / .

    Эти обработчики не используется для обработки Telegram.Update , но строки вручную помещаются в очередь. Например, чтобы отправлять сообщения с ботом, используя командную строку или API.

    Обработка сообщений обработчиком MessageHandler .

    Особенностью MessageHandler является то, что существует такое огромное разнообразие типов сообщений (текст, gif, изображение, документ, стикер и т. д.), что невозможно предоставить отдельный обработчик для каждого типа. Вместо этого MessageHandler сочетается с так называемыми фильтрами, которые позволяют проводить мелкие различия: MessageHandler(Filters.all, callback) будет обрабатывать все сообщения, которые содержат:

    • update.message ;
    • update.edited_message ;
    • update.channel_post ;
    • update.edited_channel_post .

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

    Обработка команд обработчиком CommandHandler .

    Команды — это сообщения Telegram, которые начинаются с символа / , за которым могут следовать @ и имя бота и / или некоторый дополнительный текст. Обработчик добавит список в context с именем CallbackContext.args . Он будет содержать список строк, который представляет собой текст, следующий за командой, разделенной на одиночные или последовательные символы пробела.

    По умолчанию обработчик прослушивает все сообщения, а также отредактированные сообщения. Чтобы изменить это поведение, используйте ~Filters.update.edited_message в аргументе фильтра.

    Класс telegram.ext.CommandHandler не обрабатывает отредактированные сообщения на канале.

    Для примера использования обработчика CommandHandler , расширим функцию start_callback() некоторыми аргументами, чтобы пользователь мог предоставить дополнительную информацию:

    Для многопоточной версии 13.x библиотеки:

    . def start_callback(update, context): # обработка аргументов, переданных с командой user_says = " ".join(context.args) update.message.reply_text("User said: " + user_says) . updater = Updater('TOKEN') dispatcher = updater.dispatcher dispatcher.add_handler(CommandHandler("start", start_callback)) 

    Для асинхронной версии 20.x библиотеки:

    . async def start_callback(update, context): # обработка аргументов, переданных с командой user_says = " ".join(context.args) await update.message.reply_text("User said:" + user_says) . application = ApplicationBuilder().token('TOKEN').build() application.add_handler(CommandHandler("start", start_callback)) 

    Отправка команды ‘/start Hello World!’ приведет к тому, что бот разделит все, что находится после /start , на список слов по пробелам и передаст его параметру args контекста: [‘Hello’, ‘World!’] . Мы объединяем эти фрагменты вместе, вызывая ».join(context.args) , и выводим полученную строку обратно пользователю.

    Старт Telegram бота с параметрами.

    Описанная выше передача аргументов работает точно так же, когда пользователь нажимает на глубоко связанный начальный URL, например этот:

    Щелчок по этой ссылке откроет Telegram-клиент и покажет большую кнопку СТАРТ. При ее нажатии параметры URL-адреса Hello_World! будут переданы в аргументы объекта контекста.

    Обратите внимание, поскольку Telegram не поддерживает пробелы в параметрах URL для запуска ботов таким образом, то придется вручную разделить единственный аргумент Hello_World на [‘Hello’, ‘World!’] , например используя вызов context.args[0].split(‘_’) .

    Также обратите внимание на максимальную длину, принимаемую самим Telegram. Как указано в документации, максимальная длина параметра start в URL составляет не более 64 символа.

    Кроме того, так как это параметр URL-адреса, то необходимо правильно передавать значения, чтобы избежать зарезервированных символов URL-адреса. Рассмотрим использование base64.urlsafe_b64encode .

    Соответствие шаблону: Filters.regex(pattern)

    Для более сложных входных данных можно использовать telegram.ext.MessageHandler с фильтром telegram.ext.Filters.regex , который внутренне использует модуль re для сопоставления текстового ввода пользователя с предоставленным шаблоном.

    Имейте в виду, что для извлечения URL-адресов, #Hashtags , @Mentions и других объектов Telegram нет необходимости, потому что Bot AP уже присылает их нам с каждым сообщением.

    Сущности сообщения MessageEntity .

    Для использования MessageEntity , сначала необходимо извлечь сущности и соответствующий им текст из объекта Message с помощью метода parse_entities .

    Примечание. Этот метод всегда следует использовать вместо атрибута сущностей, поскольку он вычисляет правильную подстроку из текста сообщения на основе кодовых точек UTF-16, то есть извлекает правильную строку даже при работе со странными символами, такими как Emojis .

    entity = message.parse_entities() 
    • КРАТКИЙ ОБЗОР МАТЕРИАЛА.
    • Переход на асинхронный python-telegram-bot версии 20.x
    • Чистый интерфейс Python для Telegram Bot API
    • Команды и оповещения @BotFather в Telegram
    • Обработка сообщений модулем python-telegram-bot
    • Фильтры сообщений модуля python-telegram-bot
    • Хранение временных данных модулем python-telegram-bot
    • Настройки по умолчанию модуля python-telegram-bot
    • Планировщик сообщений модуля python-telegram-bot
    • Форматирование и отправка сообщений в python-telegram-bot
    • Работа с файлами/media, модуль python-telegram-bot
    • Меню из кнопок, модуль python-telegram-bot
    • Объект CallbackContext модуля python-telegram-bot
    • Подключения Telegram-бота через webhook
    • Обработка исключений модуля python-telegram-bot
    • Создание Inline-бота, модуль python-telegram-bot
    • Работа с опросами в модуле python-telegram-bot
    • Создание разговоров ConversationHandler в python-telegram-bot
    • Перезапуск телеграмм-бота в случае ошибки
    • Декоратор-обработчик сообщений в python-telegram-bot
    • Авторизация на сайте через Telegram Passport
    • Ведение публикаций в Telegram-канале с python-telegram-bot
    • UTF коды emoji/эмодзи для отправки в Telegram из Python

    Создаём Telegram-бота на Python с помощью pyTelegramBotAPI (telebot)

    Создаём Telegram-бота на Python с помощью pyTelegramBotAPI (telebot)

    Сегодня будем учиться создавать ботов в Telegram с помощью Python.
    Попробуем заставить бота присылать сводку погоды по нашему городу.

    Нам потребуется:

    1. Компьютер или ноутбук (При должном усердии можно попробовать на телефоне).
    2. Python 3 (Мы будем работать на версии 3.10).
    3. Редактор кода (Я использую PyCharm).
    4. Соединение с интернетом.

    У всех на слуху две библиотеки для разработки telegram-ботов, это:
    — telebot (он же pyTelegramBotAPI),
    — aiogram.

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

    Как и aiogram, telebot является адаптацией API telegram для взаимодействия с ответами от сайта. Со справкой API telegram можно ознакомиться тут https://core.telegram.org/. Там же вы сможете узнать подробнее об ответах API.

    Получение токена для Telegram-бота

    Чтобы создать нашего первого бота на Python надо обратиться к официальному боту от Telegram — BotFather. Там можно создать бота и получить его токен. Токен – это аналог пароля, который позволит нам управлять ботом изнутри и программировать его ответы.

    Переходим в BotFather — https://t.me/BotFather и нажимаем «Запустить»:

    Дальше выбираем команду /newbot и следуем всем указанием, и в конце мы получаем токен нашего бота:

    Установка библиотеки telebot и знакомство с pyTelegramBotAPI

    После получения токена нужно скачать библиотеку telebot:

    pip install pyTelegramBotAPI 

    если вы на macOS, то:

    pip3 install pyTelegramBotAPI

    Мы не будем раскладывать проект по модулям, поэтому у нас будет один исполнимый файл main.py. После создания файла надо импортировать библиотеку и наш токен:

    import telebot api_token = 'Ваш токен вставлять сюда'

    Первым делом следует инициализировать бота, передав в него токен, полученный от BotFather:

    bot = telebot.TeleBot(api_token)

    Дальше убедимся, что все корректно работает и заставим отправлять полученное сообщение обратно:

    @bot.message_handler(content_types=['text']) def echo(message): bot.send_message(message.chat.id, text=f"")

    Бот работает за cчёт декораторов, которые указывают, что мы хотим от него. Message handler – это обработчик всех сообщений, которые отправляет пользователь. В списке content_types перечисляем типы сообщений, которые хотим принимать. Можно указать text, audio, image и document.

    У объекта bot есть множество методов, частью которых мы будем пользоваться. Основной из них — send message.

    Чтобы заставить бота принимать сообщение, в конце файла пропишем:

    bot.polling(none_stop=True)

    Параметр none_stop указывает, что мы хотим принимать сообщения постоянно.
    В стандартном положении параметр равен False, но мы ставим True.

    После всех манипуляций получаем свое же сообщение:

    Работа с API Яндекс Погоды

    Перейдем к добавлению нужных функций — получению данных о погоде.

    Для погоды мы будем пользоваться услугами бесплатного API от Яндекс Погоды:
    https://yandex.ru/dev/weather/. Следует отметить, что бесплатный API от Яндекса ограничен 50 запросам в сутки. Если вас такое количество не устраивает, можно воспользоваться OpenWeather.

    Запрос будет выглядеть так:

    https://api.weather.yandex.ru/v2/informers?lat=55.75222&lon=37.61556

    Запрос состоит из местоположения — в данном случае указаны координаты Москвы. Далее можно просить у пользователя геолокацию и присылать ему погоду по его координатам.

    Для отправки GET-запроса к API Яндекс.Погоды нам поможет библиотека requests, а для обработки ответа — библиотека json.

    pip install requests
    pip3 install requests 

    Библиотека requests предназначена для работы с GET и POST запросами, которые обычный пользователь делает через браузер. Теперь же мы можем общаться с сервером через python оставляя браузер за скобками. Часто используют requests вместе с BS4 (beautiful soup 4), чтобы удобно получать и анализировать информацию из html кода. Но в наш случае другая задача.

    API Яндекс.Погоды отдаёт данные в формате JSON, поэтому библиотека json подойдёт лучше всего. JSON основан на JavaScript объекте и часто используется при обмене данными. Раньше он использовался только на сайтаx для работы с текстовыми данными. Сейчас его используют почти везде для удобного обмена данными. JSON принимают все языки программирования, что является его большим плюсом. В python библиотека json уже установлена и не требует отдельной команды.

    Добавляем импорт нужных библиотек:

    import requests import json

    До этого мы не затрагивали тему, как именно обрабатывать команды через слеш. Для этого у декоратора есть метод message_handlers, внутрь которого мы передаем название команд:

    @bot.message_handler(commands=['get_weather', 'weather', 'pogoda']): def get_weather(message): pass

    Для удобства выносим токен Яндекс.Погоды и ссылку в отдельные переменные:

    url = "https://api.weather.yandex.ru/v2/informers?lat=55.75222&lon=37.61556" headers =

    Отправим себе в Telegram полный ответ от API Яндекс.Погоды и проверим что все работает:

    @bot.message_handler(commands=['get_weather', 'weather', 'pogoda']) def get_weather(message): r = requests.get(url=url, headers=headers) bot.send_message(message.chat.id, r.text)

    После получения ответа сформируем нормальный ответ для пользователя. Сразу сделаем проверку на status_code, чтобы оповестить пользователя, если проблемы на стороне API. После получения ответа от API в текстовом формате, надо перевести его в словарь. Для этого подключаем библиотеку json — в функцию loads мы передаем текст ответа, а на выходе получаем объект типа dict (словарь):

    @bot.message_handler(commands=['get_weather', 'weather', 'pogoda']) def get_weather(message): r = requests.get(url=url, headers=headers) bot.send_message(message.chat.id, r.text) if r.status_code == 200: data = json.loads(r.text) fact = data["fact"] bot.send_message(message.chat.id, text=f'Now in Moscow °, feels like °. Now on the street ') else: bot.send_message(message.chat.id, 'Problems on weather API')

    Теперь бот отправляет температуру, как она ощущается и какая сейчас погода:

    Настройка команд для telegram-бота

    Нам осталось сделать реакцию на команду /start. Она будет выводить команду для получения данных о погоде:

    @bot.message_handler(commands=['start']) def get_weather(message): bot.send_message(message.chat.id, text=f'Hello, ! \n\nI can show you the weather with: \n/weather\n/pogoda\n/get_weather')

    Мы обращаемся к информации, которая приходит нам в сообщении пользователя, чтобы получить из нее имя пользователя. Подробнее узнать о сообщениях пользователей можно тут https://core.telegram.org/constructor/message.

    Теперь создадим подсказки для пользователей. Библиотека pyTElegramBotAPI не позволяет из кода редактировать подсказки для написания команды. Чтобы это сделать нам потребуется несколько операций в BotFather:

    1. кликаем на меню
    2. выбираем команду /mybots
    3. ищем нашего бота
    4. edit bot
    5. и выбираем edit commands
    6. дальше вводим нашу команду (Пример: команда – описание)

    После всех манипуляций у нас появится всплывающая менюшка с командами:

    Финальный код Telegram-бота на Python

    Мы с вами затронули лишь малу часть того, что можно сделать с помощью python и Telegram. Telebot — не самая лучшая библиотека для создания ботов под большую аудитории. Если вы хотите писать бот для магазинов, вам потребуется более сильные инструменты разработки, которые есть в aiogram.

    Если вам хочется потренироваться самостоятельно — попробуйте написать бота со следующими функциями: конвертор валюты, сводка по курсу валюты.

    Весь код из урока:

    import telebot import requests import json api_token = '5347819163:********lZu1qWQc5f55DPk' url = "https://api.weather.yandex.ru/v2/informers?lat=55.75222&lon=37.61556" headers = bot = telebot.TeleBot(api_token) @bot.message_handler(commands=['start']) def get_weather(message): bot.send_message(message.chat.id, text=f'Hello, ! \n\nI can show you the weather with: \n/weather\n/pogoda\n/get_weather') @bot.message_handler(commands=['get_weather', 'weather', 'pogoda']) def get_weather(message): r = requests.get(url=url, headers=headers) bot.send_message(message.chat.id, r.text) if r.status_code == 200: data = json.loads(r.text) fact = data["fact"] bot.send_message(message.chat.id, text=f'Now in Moscow °, feels like °. Now on the street ') else: bot.send_message(message.chat.id, 'Problems on weather API') bot.polling(none_stop=True)

    Handler

    Хендлеры это конечная точка в обработке событий. Хендлеры могут быть блокирующими (если нашелся подходящий хендлер другие уже не проверяются и не выполняются) и не блокирующими (в таком случае количество выполняемых хендлеров не ограничено и зависит от того какие пройдут). По умолчанию все хендлеры являются блокирующими

    Хендлеры помечаются (лейблируются) с помощью декораторов. За это отвечает Labeler high-level инстанс с которым вы работаете. Пример с ботом:

    1 2 3 4 5 6 7 8 9
     from vkbottle.bot import Bot, Message  bot = Bot("token")  @bot.on.message()  async def any_message(message: Message):  await message.answer("Привет я бот")  bot.run_forever() 

    Хендлеры ботов

    message

    Этот хендлер показан в примере выше

    Хендлер на все сообщения (и из чата, и из личных сообщений)

    chat_message

    Хендлер на сообщения из чатов

    private_message

    Хендлер на сообщения из личных диалогов

    Типы хендлеров выше не делают ничего необычного, просто оперируют предустановленным правилом PeerRule :

    • в message он не предустанавливается
    • в chat_message — PeerRule(True)
    • в private_message — PeerRule(False)

    В качестве аргументов декоратор принимает инстансы правил ( ABCRule ), а в качестве kwargs он принимает значение из custom_rules (подробнее в туториале

    Если правило вернуло словарь, то он будет распакован и передан в качестве аргументов в хендлер, если он принимает их:

     1  2  3  4  5  6  7  8  9 10 11 12 13
     # Кастомное правило MyRule возвращает словарь ``  @bot.on.message(MyRule())  async def some_key_handler(message: Message, some_key: str):  await message.answer(f"some_key=some_value>")  @bot.on.message(MyRule())  async def regular_handler(message: Message):  await message.answer("Этот хендлер не принимает аргумент 'some_key', поэтому он и не был передан")  @bot.on.message(MyRule())  async def kwargs_handler(message: Message, **kwargs):  await message.answer(f"В хендлере переданы аргументы: kwargs>")  # В хендлере переданы аргументы: 

    Чат-боты в Telegram на Python и Aiogram: пишем первого бота

    Большой гайд по работе с Aiogram на примере эхо‑бота — чат‑бота, который повторяет за пользователем его фразы. Весь код — внутри статьи.

    Иллюстрация: Polina Vari для Skillbox Media

    Антон Яценко

    Антон Яценко
    Изучает Python, его библиотеки и занимается анализом данных. Любит путешествовать в горах.

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

    Благодаря этой статье вы научитесь с нуля создавать чат-ботов с помощью Python и библиотеки Aiogram. Мы напишем эхо-бота, который отвечает на сообщения пользователя точно такими же сообщениями. Это первая часть урока по Aiogram — во второй части мы добавим боту кнопки и новые фичи.

    Содержание

    • Библиотеки для создания бота
    • Краткое описание Aiogram
    • Создаём эхо-бота
    • Шаг 1. Устанавливаем Python
    • Шаг 2. Создаём виртуальное окружение
    • Шаг 3. Создаём бота
    • Шаг 4. Подключаем Aiogram
    • Шаг 5. Пишем код для эхо-бота
    • Шаг 6. Запускаем бота и проверяем работу
    • Что дальше?

    Библиотеки для создания бота

    Для создания телеграм-ботов на Python существует несколько десятков библиотек. Они различаются популярностью, размером комьюнити и функциональностью. Рассмотрим самые популярные.

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

    Python-telegram-bot. Одна из первых библиотек для создания ботов. Отличается от Aiogram синхронным подходом к работе, то есть при ожидании ответа от пользователя выполнение кода останавливается.

    TeleBot. Библиотека для создания простых ботов, позволяющая работать с асинхронным и синхронным подходом на выбор. Подходит для небольших проектов. Подробнее можно узнать в документации.

    Что нужно знать об Aiogram перед написанием кода

    Перед тем как приступить к написанию нашего бота, остановимся подробнее на одной технической особенности Aiogram.

    Как уже было сказано ранее, одно из главных достоинств библиотеки — полная асинхронность. Она использует синтаксис async/await, который позволяет программе выполнять несколько задач одновременно и эффективно управлять потоком выполнения.

    Вот простой пример функции, использующей механизм async/await:

    Другой плюс Aiogram — в большом наборе инструментов и хуков, которые можно использовать для добавления дополнительных функций и настроек бота. Библиотека обеспечивает полный доступ ко всем возможностям Telegram API, включая отправку и получение сообщений, управление клавиатурой, обработку медиафайлов (фотографий, видео, документов) и многое другое.

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

    • официальная документация,
    • репозиторий библиотеки на GitHub,
    • русскоязычный телеграм-чат, посвящённый Aiogram,
    • англоязычный чат, посвящённый Aiogram,
    • канал с новостями библиотеки,
    • тестовый бот на основе Aiogram.

    Создаём эхо-бота

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

    Для этого нам необходимо:

    • установить Python и настроить виртуальное окружение;
    • зарегистрировать бота в специальном телеграм-канале @BotFather;
    • установить библиотеку Aiogram;
    • написать код эхо-бота, связав его по API с Telegram.
    Шаг 1

    Устанавливаем Python

    На macOS или Linux. Python установлен в эти операционные системы изначально. Чтобы проверить его наличие, откройте терминал и введите команду:

    На Windows требуется установка Python. Сделать это проще всего по нашей инструкции.

    Шаг 2

    Создаём виртуальное окружение

    После установки и проверки Python требуется установить виртуальное окружение с помощью virtualenv. Это специальный инструмент, который позволяет изолировать друг от друга проекты в разработке, независимо устанавливая для них библиотеки и пакеты. Удобно, когда вы работаете над разными приложениями одновременно.

    virtualenv устанавливается через терминал:

    Открываем его, жмём кнопку «Запустить» и вводим команду /newbot:

    Теперь напишем название и юзернейм для нашего бота. Назовём его echo_skillbox_bot (теперь это имя занято, так что вам надо будет придумать своё). В ответ придёт наш токен, который мы будем использовать для подключения к API Telegram.

    Этот токен мы сохраняем — он потребуется нам в будущем.

    Шаг 4

    Подключаем Aiogram

    Для установки Aiogram воспользуемся менеджером пакетов PIP. Вводим в терминал:

    Находим нашего бота в Telegram по имени @echo_skillbox_bot и запускаем его, нажав на кнопку Начать. В ответ на это или на команду /start нам придёт приветственное сообщение:

    Попробуем написать что-то:

    Как мы видим — всё работает. Бот возвращает нам наши сообщения.

    Что дальше?

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

    Во второй части статьи мы добавим к нашему боту кнопки и новые возможности. Так что обязательно заходите и читайте 🙂

    Больше интересного про код в нашем телеграм-канале. Подписывайтесь!

    Читайте также:

    • С# для новичков: развеиваем мифы и пишем простого чат-бота
    • «Я удивился, когда написал код, а он заработал»: как живёт начинающий Python-разработчик
    • Учимся верстать: что такое CSS

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *