В материале рассматривается базовый пример создания Telegram бота на основе библиотеке python-telegram-bot
, использующего режим встроенных запросов Телеграмм, а так же обработчика InlineQueryHandler
для распознавания этих встроенных запросов.
Внимание! Пакеты
python-telegram-bot
версии 13.x будут придерживаться многопоточной парадигмы программирования (*на данный момент актуальна версия 13.15). Пакеты версий 20.x и новее предоставляют чистый асинхронный Python интерфейс для Telegram Bot API. Дополнительно смотрите основные изменения в пакетеpython-telegram-bot
версии 20.x.
Пример снабжен подробными комментариями. Сначала определяются несколько функций обработчика. Затем эти функции передаются Диспетчеру и регистрируются в соответствующих местах. Затем бот запускается и работает до тех пор, пока пользователь в командной строке не нажмет Ctrl-C.
Внимание! Изначально, созданный вами бот в @BotFather
не поддерживает режим встроенных запросов Телеграмм. Для включения этого режима необходимо снова подключиться к @BotFather
, и используя команду /setinline
переключить созданного бота во встроенный режим запросов.
В примере ниже бот применяет различные текстовые преобразования к вводимым сообщениям, которые пользователь может выбрать из так называемого подменю UPPER, BOLD, ITALIC.
Использование: в используемом вами клиенте Телеграмм наберите @логин_бота и через пробел какое либо сообщение. Далее появится контекстное меню с выбором преобразования сообщения: UPPER, BOLD, ITALIC. Выберете требуемое преобразование.
import logging from uuid import uuid4 from telegram import InlineQueryResultArticle, ParseMode, InputTextMessageContent, Update from telegram.ext import Updater, InlineQueryHandler, CommandHandler from telegram.utils.helpers import escape_markdown # Включение ведение журнала logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO ) # создаем `logger` с именем файла logger = logging.getLogger(__name__) # Определяем несколько обработчиков команд. # Они обычно принимают два аргумента `update` и `context`. # Обработчики ошибок также получают исключения `TelegramError`. # т.к. аргумент `context` в обработчиках не используется и # во избежании путаницы заменим его на переменную `_` def start(update, _): """Сообщение при команде `/start`""" update.message.reply_text('Привет!') def help_command(update, _): """Сообщение при команде `/help`.""" update.message.reply_text('Введите: @логин_бота и через пробел какое либо сообщение.') def inlinequery(update, _): """Обработка встроенного запроса.""" # извлекаем текст сообщения query = update.inline_query.query # формируем результат в зависимости от того # что выберет пользователь из так называемого # меню `title`. results = [ # Аргумент `id` служит для извлечения выбранного из `title` результата # преобразования, в `id` так же можно использовать строку, # используемую в `title`, если конечно она уникальная InlineQueryResultArticle( id=str(uuid4()), title="UPPER", input_message_content=InputTextMessageContent(query.upper()), ), InlineQueryResultArticle( id=str(uuid4()), title="BOLD", input_message_content=InputTextMessageContent( f"*{escape_markdown(query)}*", parse_mode=ParseMode.MARKDOWN ), ), InlineQueryResultArticle( id=str(uuid4()), title="ITALIC", input_message_content=InputTextMessageContent( f"_{escape_markdown(query)}_", parse_mode=ParseMode.MARKDOWN ), ), ] # отвечаем на сообщение результатом update.inline_query.answer(results) if __name__ == '__main__': # Создаем Updater с токеном вашего бота. updater = Updater("TOKEN") # Получаем диспетчера для регистрации обработчиков dispatcher = updater.dispatcher # отвечаем на команды Telegram dispatcher.add_handler(CommandHandler("start", start)) dispatcher.add_handler(CommandHandler("help", help_command)) # на простые сообщения отвечаем тем же сообщением, # только преобразуем текст в зависимости от # выбранного `title` - UPPER, BOLD, ITALIC dispatcher.add_handler(InlineQueryHandler(inlinequery)) # Старт бота updater.start_polling() updater.idle()