Сообщить об ошибке.

Создание Inline-бота, модуль python-telegram-bot

Базовый пример Telegram бота с режимом встроенных запросов

В материале рассматривается базовый пример создания 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()