@k1nster

Как сделать проверку написал ли что-то человек в бота, либо нажал на кнопку?

У меня есть бот в Telegram, и я использую библиотеку Telebot на Python для его разработки. У меня возникла интересная ситуация, которая требует вашей помощи.

Моя цель:
- Пользователь нажимает на кнопку "Zeptat se✏️".
- Бот должен предоставить пользователю возможность задать вопрос менеджеру.
- Если пользователь нажимает на другую кнопку (например, "Platba ") после того, как нажал "Zeptat se✏️" и не написал вопрос, то бот не должен отправлять сообщение в группу, но и кнопки должны продолжать работать.

Проблема:
В настоящий момент, если пользователь нажимает "Zeptat se✏️", а затем нажимает другую кнопку, сообщение кнопки отправляется в группу, и программа считывает это как сообщение, и это не должно происходить.

Я не уверен, как правильно реализовать такое поведение в моем коде. Может кто-то подскажет, как это можно сделать? Желательно скинуть код, либо просто пояснить).

Вот вот мой:

import telebot
from telebot import types

token = '' # ваш TOKEN бота
TO_CHAT_ID = '' # ваш CHAT ID
bot = telebot.TeleBot(token, parse_mode=None)

# Создаем клавиатуру
keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
btn1 = types.KeyboardButton('Platba ')
btn2 = types.KeyboardButton('Více s soukromé komunitě')
btn3 = types.KeyboardButton('Zeptat se✏️')
keyboard.add(btn1, btn2, btn3)

# Создаем inline клавиатуру
inline_keyboard = types.InlineKeyboardMarkup(row_width=2)
inline_btn1 = types.InlineKeyboardButton('Zaplatit', callback_data='button1')
inline_keyboard.add(inline_btn1)

# Inline support keyboard
inline_keyboard_support = types.InlineKeyboardMarkup(row_width=2)
inline_btn1_support = types.InlineKeyboardButton('Mám problém', callback_data='button2')
inline_keyboard_support.add(inline_btn1_support)



@bot.message_handler(commands=['start'])
def send_welcome(message):
    # Отправляем приветственное сообщение и клавиатуру
    bot.send_message(message.chat.id, "Zdravím \nTento bot ti pomůže dostat se do soukromé komunity Sigma Grindset Club CZ/SK \n\nCena: 15 euro.\nZrušit měsíční předplatné můžeš kdykoliv", reply_markup=keyboard)

@bot.message_handler(content_types=['text'])
def handle_text(message,  res = False):
    if message.text == 'Platba ':
        # Обработка нажатия на кнопку "Platba "
        bot.send_message(message.chat.id, text=f"Platba v jakékoli měně, odkudkoli na světě, jakoukoliv kartou✌️", reply_markup=inline_keyboard)

    if message.text == 'Více s soukromé komunitě':
        bot.send_message(message.chat.id, text="-Hlavní soukromá mužská komunita Česka a Slovenska\n\n✅Tvoje záchrana od systému, který se tě snaží oslabit a zabít v tobě tvoje mužské JÁ. Přijmi realitu a pohybuj se s náma dál.\n✅Hlavní hodnotou této komunity je BRATRSTVÍ. To znamená být obklopen stejně zamotivovanými muži, kteří se rozhodli to v životě někam dotáhnout a chtějí na sobě makat. Jsme tým, spolu jsme silnější, navzájem se nabíjíme energií a motivujeme se.\n✅Tipy a rady o mužském zdraví/životě, a také informace o hormonech a biohackerských doplňcích stravy, které zlepší tvůj život a pomůžou ti na tvé cestě.\n✅Denní dávka motivace na sobě makat\n✅Diskuze o psychologii muže, vztahy s ženami, dnešní date market atd.\nKomunita pro silného a uvažujícího muže.\n\nPředplatné je měsíční, zrušit ho můžeš kdykoliv✌️\n\nVítej k nám! ")

    if message.text == 'Zeptat se✏️':
        markup = types.InlineKeyboardMarkup()
        button1 = types.InlineKeyboardButton(text='Zeptat se', callback_data='go')
        markup.add(button1)
        bot.send_message(message.chat.id, 'Chceš se na něco zeptát? Klikni na tlačítko níže. Náš manager se s tebou spojí a zodpoví na tvůj dotaz.', reply_markup=markup)


    # Получение сообщений от юзера,
    if int(message.chat.id) == int(TO_CHAT_ID):
        bot.send_message(help_user_id, message.text)

# Функция, отправляющая вопрос от пользователя в чат поддержки
def helpBot(message):
     bot.forward_message(TO_CHAT_ID, message.chat.id, message.message_id)


# Обработка inline-кнопок
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
    try:

        global help_user_id
        help_user_id = call.message.from_user.id

        if call.message:
            if call.data == 'button1':
                bot.send_message(call.message.chat.id, 'Platba kartou v jakékoli měně:\n\n[✅Klikni na odkaz](https://t.me/+azOZuNQUS0cxYWM0)\n\n@donate přijme platbu a automaticky tě přidá do skupiny\n\n⚠️Problémy s botem/platbou? — Klikni na tlačítko «Mám problém» . Náš manager se s tebou spojí a pomůže ti problém vyřešit',  parse_mode='Markdown', reply_markup=inline_keyboard_support)

            if call.data == 'button2':
                help_user_id = call.message.chat.id

                # Получить информацию о чате пользователя
                chat_info = bot.get_chat(help_user_id)
                chat_link = f"https://t.me/{chat_info.username}"  # Получаем ссылку на личку пользователя

                # Отправить уведомление в группу о проблеме и ссылку на личку
                bot.send_message(TO_CHAT_ID, f"Пользователь имеет проблему с оплатой. {chat_link}")

                # Отправить сообщение пользователю в его личку
                bot.send_message(help_user_id, "Náš manažer tě bude brzy kontaktovat ")


            if call.data == 'go':
                help_user_id = call.message.chat.id

                # Получить информацию о чате пользователя
                chat_info = bot.get_chat(help_user_id)
                chat_link = f"https://t.me/{chat_info.username}"  # Получаем ссылку на личку пользователя

                # Отправить уведомление в группу о проблеме и ссылку на личку
                bot.send_message(TO_CHAT_ID, f"Пользователь имеет проблему с ботом, вскоре он напишет вам сообщение, ожидайте... {chat_link}")

                # Отправить сообщение пользователю в его личку
                msg = bot.send_message(help_user_id, "Náš manažer tě bude brzy kontaktovat ")
                bot.register_next_step_handler(msg, helpBot)





    except Exception as e:
        print(repr(e))
bot.infinity_polling(skip_pending=True)


Участок кода который отвечает за отправку сообщений в группу:
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
    try:

        global help_user_id
        help_user_id = call.message.from_user.id

        if call.message:
            if call.data == 'button1':
                bot.send_message(call.message.chat.id, 'Platba kartou v jakékoli měně:\n\n[✅Klikni na odkaz](https://t.me/+azOZuNQUS0cxYWM0)\n\n@donate přijme platbu a automaticky tě přidá do skupiny\n\n⚠️Problémy s botem/platbou? — Klikni na tlačítko «Mám problém» . Náš manager se s tebou spojí a pomůže ti problém vyřešit',  parse_mode='Markdown', reply_markup=inline_keyboard_support)

            if call.data == 'button2':
                help_user_id = call.message.chat.id

                # Получить информацию о чате пользователя
                chat_info = bot.get_chat(help_user_id)
                chat_link = f"https://t.me/{chat_info.username}"  # Получаем ссылку на личку пользователя

                # Отправить уведомление в группу о проблеме и ссылку на личку
                bot.send_message(TO_CHAT_ID, f"Пользователь имеет проблему с оплатой. {chat_link}")

                # Отправить сообщение пользователю в его личку
                bot.send_message(help_user_id, "Náš manažer tě bude brzy kontaktovat ")


            if call.data == 'go':
                help_user_id = call.message.chat.id

                # Получить информацию о чате пользователя
                chat_info = bot.get_chat(help_user_id)
                chat_link = f"https://t.me/{chat_info.username}"  # Получаем ссылку на личку пользователя

                # Отправить уведомление в группу о проблеме и ссылку на личку
                bot.send_message(TO_CHAT_ID, f"Пользователь имеет проблему с ботом, вскоре он напишет вам сообщение, ожидайте... {chat_link}")

                # Отправить сообщение пользователю в его личку
                msg = bot.send_message(help_user_id, "Náš manažer tě bude brzy kontaktovat ")
                bot.register_next_step_handler(msg, helpBot)
  • Вопрос задан
  • 918 просмотров
Решения вопроса 1
SoreMix
@SoreMix
yellow
1. Отказываемся от глобальных переменных в любом виде.
2. Разделяем декораторы для того чтобы понимать что происходит в коде
3. Используем register_next_step_handler, который для этого и создан.

Я тут начал писать решение, но удалил, подумав, а зачем так запутанно?

# Я бы закинул все обработчики кнопок в свои хэндлеры (с call аналогичено)

@bot.message_handler(func=lambda m: m.text and m.text == 'Zeptat se✏️')
def handle_user_question(message):
    bot.send_message(message.chat.id, 'Напишите сюда Ваш вопрос. Менеджер свяжется с Вами.')
    bot.send_message(manager, 'С вами свяжется пользователь URL')
    bot.register_next_step_handler(message, proccess_user_question)

def proccess_user_question(message):
    # здесь проверяем что пришло, реальный вопрос или нажали кнопку
    if message.text and message.text in ['Zeptat se✏️', 'Více s soukromé komunitě', 'Platba ']:
        # просто вызываем нужную функцию, которые описали выше, как пример:
        if message.text == 'Zeptat se✏️':
            return handle_user_question(message)

    # а дальше уже если все проверки на клаву пришли, то обрабатываем как реальный вопрос
    bot.send_message(manager, 'Вопрос от URL:')
    bot.forward_message(manager, message.chat.id, message.message_id)
    bot.send_message(message.chat.id, 'Ваш вопрос отправлен')


ИМХО лишние здесь всякие вот эти инлайн кнопки которые не несут функционал, только путают. Вот и всё стихотворенье
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
RimMirK
@RimMirK
Вроде человек. Вроде учусь. Вроде пайтону
если в кнопку добавить какой-то спец символ, например, неразрывной пробел (alt+00160 (на нум паде)), то по нему можно ровняться
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы