Ответы пользователя по тегу Telegram
  • Как связать вопросы в телеграм-боте с ответами?

    @griona
    Чтобы ограничить ввод в Telegram боте и разрешить только цифры или только буквы в ответе на вопрос, можно использовать валидацию сообщений в зависимости от их содержания. Например, когда бот ожидает определённый ответ (только цифры или только буквы), он проверяет ввод пользователя, и если ввод не соответствует правилам, бот отправляет сообщение с предупреждением.

    Вот пример кода на Python с использованием библиотеки `python-telegram-bot`, где бот проверяет, что ввод содержит только цифры или только буквы:

    ```python
    from telegram import Update
    from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext

    # Функция для обработки стартовой команды
    def start(update: Update, context: CallbackContext) -> None:
    update.message.reply_text("Введите ваш возраст (только цифры):")
    context.user_data['expecting'] = 'digits'

    # Функция для обработки текста от пользователя
    def handle_message(update: Update, context: CallbackContext) -> None:
    user_input = update.message.text

    # Проверка, ожидаем ли мы ввод цифр
    if context.user_data.get('expecting') == 'digits':
    if user_input.isdigit():
    update.message.reply_text(f"Ваш возраст: {user_input}")
    context.user_data['expecting'] = None # Сбрасываем ожидание
    else:
    update.message.reply_text("Пожалуйста, введите только цифры!")

    # Проверка, ожидаем ли мы ввод букв
    elif context.user_data.get('expecting') == 'letters':
    if user_input.isalpha():
    update.message.reply_text(f"Ваше имя: {user_input}")
    context.user_data['expecting'] = None # Сбрасываем ожидание
    else:
    update.message.reply_text("Пожалуйста, введите только буквы!")

    # Команда для запроса имени (ожидаем буквы)
    def ask_name(update: Update, context: CallbackContext) -> None:
    update.message.reply_text("Введите ваше имя (только буквы):")
    context.user_data['expecting'] = 'letters'

    def main() -> None:
    updater = Updater("YOUR_TELEGRAM_BOT_TOKEN")

    dispatcher = updater.dispatcher

    # Обработчики команд
    dispatcher.add_handler(CommandHandler("start", start))
    dispatcher.add_handler(CommandHandler("name", ask_name))

    # Обработчик текстовых сообщений
    dispatcher.add_handler(MessageHandler(Filters.text & ~Filters.command, handle_message))

    # Запуск бота
    updater.start_polling()
    updater.idle()

    if __name__ == '__main__':
    main()
    ```

    ### Что происходит:
    1. Бот задаёт вопросы и сохраняет состояние ожидания (цифры или буквы) в `context.user_data`.
    2. Когда пользователь вводит ответ, бот проверяет, соответствует ли ответ ожидаемому типу данных.
    - Если бот ожидает цифры, а пользователь вводит буквы или другие символы, бот сообщает об ошибке и просит ввести только цифры.
    - Если бот ожидает буквы, а пользователь вводит цифры, бот также сообщает об ошибке.
    3. После успешного ввода состояние ожидания сбрасывается.

    Этот код можно расширить для проверки других условий или типов ввода.
    Ответ написан
    3 комментария