TerryBear
@TerryBear

Почему могут необрабатываться некоторые ответы для инлайн кнопок в Telegram боте?

Решил недавно написать телеграм бота для работы с QIWI api, используя библиотеку Telebot. Для реализации платежей сделал связь из инлайн кнопок, в которых пользователь сначала выбирает хочет ли он добавить комментарий к платежу, после чего подтверждает отправление платежа. Столкнулся с такой проблемой, что бот реагирует только на выбор в первых инлайн кнопках, после чего уже в подтверждении платежа перестает как-либо реагировать на нажатие кнопок (на кнопках появляется значок часиков).

629ab0f55242c166177071.png
В терминале при этом никаких ошибок не выводится, из чего я сделал вывод, что бот просто не видит обработку значений всех последующих кнопок.
Весь необходимый код прилагаю и заранее извиняюсь за (возможно) банальные ошибки. Решение много где пробовал искать, к сожалению не нашел, очень надеюсь на вас :3

#ПЛАТЕЖИ
@bot.message_handler(regexp=' Перевести на кошелек ')

def send_money_phone(message):
    bot.send_message(message.chat.id, 'Пришлите номер кошелька QIWI, на который хотите отправить деньги\n\nНапример : +79999999999 ')
    bot.register_next_step_handler(message, send_money_summ)
    
def send_money_summ(message):
    global tel
    tel = message.text
    try:
        len(tel) > 11
        bot.send_message(message.chat.id, ' Пришлите сумму, которую хотите отправить (в рублях) ')
        bot.register_next_step_handler(message, send_money_comm)
    except:
        bot.send_message(message.chat.id, '⚠️ Введите правильный номер телефона\n\nНапример : +79999999999 ⚠️')
        send_money_phone(message)
        
def send_money_comm(message):
    global summ
    summ = message.text
    try:
        float(summ)
        keyboard = types.InlineKeyboardMarkup()
        key_send = types.InlineKeyboardButton(text=' Да, хочу ', callback_data='yes')
        keyboard.add(key_send)
        key_edit = types.InlineKeyboardButton(text='❌ Нет, спасибо ❌', callback_data='no')
        keyboard.add(key_edit)
        bot.send_message(message.chat.id, ' Хотите прислать комментарий к платежу? ', reply_markup=keyboard)
    except:
        bot.send_message(message.chat.id, '⚠️ Введите правильную сумму для перевода ⚠️')
        send_money_summ(message)

def abc123(message):
    bot.send_message(message.chat.id, ' Введите комментарий ')
    bot.register_next_step_handler(message, abc321)

def abc321(message): 
    global tel
    global summ
    global comm
    global wallet
    comm = message.text
    keyboard = types.InlineKeyboardMarkup()
    key_send = types.InlineKeyboardButton(text=' Да, уверен ', callback_data='yea1')
    keyboard.add(key_send)
    key_edit = types.InlineKeyboardButton(text='❌ Нет, не уверен ❌', callback_data='nope1')
    keyboard.add(key_edit)
    bot.send_message(message.chat.id, '❓ Вы уверены, что хотите отправить на номер ' + str(tel) + ' ' + str(summ) + '₽ с комментарием "' + str(comm) + '" ❓', reply_markup=keyboard)

def nocomm(message):
    global wallet
    global summ
    global tel
    keyboard = types.InlineKeyboardMarkup()
    key_send = types.InlineKeyboardButton(text=' Да, уверен ', callback_data='yea2')
    keyboard.add(key_send)
    key_edit = types.InlineKeyboardButton(text='❌ Нет, не уверен ❌', callback_data='nope2')
    keyboard.add(key_edit)
    bot.send_message(message.chat.id, '❓ Вы уверены, что хотите отправить на номер ' + str(tel) + ' ' + str(summ) + '₽ без комментария '  + '❓', reply_markup=keyboard)

   
# выбор вида платежа (с комментарием / без)
@bot.callback_query_handler(func=lambda call: True)
def callback(call):
    if call.data == 'yes':
        abc123(call.message)
    elif call.data == 'no':
        nocomm(call.message)

# Подтверждение платежа с комментарием
@bot.callback_query_handler(func=lambda call: True)
def dhsdsd(call):
    global wallet
    global tel
    global summ
    global comm
    if call.data == 'yea1':
        try:
            wallet.pay(account=tel, amount=summ, comment=comm)
            bot.send_message(message.chat.id, '✅ Платеж совершен успешно! ✅')
        except:
            bot.send_message(message.chat.id, '⚠️ Не удалось совершить платеж ⚠️')

    elif call.data == 'nope1':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        watch_balance = types.KeyboardButton(' Посмотреть баланс ')
        send_money_button = types.KeyboardButton(' Перевести на кошелек ')
        edit_data = types.KeyboardButton('️ Изменить данные ️')
        markup.add(watch_balance)
        markup.add(send_money_button)
        markup.add(edit_data)
        bot.send_message(message.chat.id, ' Выберите, что делать ', reply_markup=markup)

# Подтверждение платежа без коммента
@bot.callback_query_handler(func=lambda call: True) 
def fdfdf(call):
    if call.data == 'yea2':
        global wallet
        global summ
        global tel
        try:
            wallet.pay(account=tel, amount=summ, comment='')
            bot.send_message(message.chat.id, '✅ Платеж отправлен успешно! ✅')
        except:
            bot.send_message(message.chat.id, '⚠️ Не удалось отправить платеж, проверьте правильность перевода ⚠️')
    elif call.data == 'nope2':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        watch_balance = types.KeyboardButton(' Посмотреть баланс ')
        send_money_button = types.KeyboardButton(' Перевести на кошелек ')
        edit_data = types.KeyboardButton('️ Изменить данные ️')
        markup.add(watch_balance)
        markup.add(send_money_button)
        markup.add(edit_data)
        bot.send_message(message.chat.id, 'Выберите что делать', reply_markup=markup)
  • Вопрос задан
  • 89 просмотров
Пригласить эксперта
Ответы на вопрос 2
@pr0l
вы все колбеки пытаетесь обработать 2 раза. оно попадает в первый и дальше уже не обрабатывается.
@bot.callback_query_handler(func=lambda call: True)
В первом он не находит вариантов обработки вот и ничего не делает.
Нужно разделить callback
@bot.callback_query_handler(func=lambda call: call.data == 'yea1')

@bot.callback_query_handler(func=lambda call: call.data == 'yea2’)

@bot.callback_query_handler(func=lambda call: call.data == 'nope1')

@bot.callback_query_handler(func=lambda call: call.data == 'nope2’)

и не используйте глобальные переменные, есть классы.

class Info:
    def __init__(self, phname):
        self.phname = phname
        self.rndnumber = None
        self.tdn = None


А потом вызывай и присваивай
Info.tnumber1 = message.text

создай сначала все кнопки, а потом скопом добавь, лишний код:
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        watch_balance = types.KeyboardButton(' Посмотреть баланс ')
        send_money_button = types.KeyboardButton(' Перевести на кошелек ')
        edit_data = types.KeyboardButton('️ Изменить данные ️')
        markup.add(watch_balance, send_money_button, edit_data) # <------
        bot.send_message(message.chat.id, ' Выберите, что делать ', reply_markup=markup)


вместо отправки просто сообщения, используй реплай, типа ответ на запрос.
bot.reply_to(message, ' Выберите, что делать ', reply_markup=markup)
Ответ написан
Комментировать
nki
@nki
bezkart.ru готовая система лояльности
Вы уверены, что вам нужно несколько callback_query_handler?
Какой из них отрабатывает при нажатии на инлайн кнопку?
Можно все обрабатывать в одном. Может в этом проблема?
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
SpectrumData Екатеринбург
от 150 000 до 250 000 ₽
Гринатом Москва
от 150 000 ₽
DIGITAL SECTOR Краснодар
от 150 000 до 250 000 ₽
13 июл. 2024, в 02:06
100 руб./за проект
13 июл. 2024, в 01:29
50000 руб./за проект
13 июл. 2024, в 01:06
13000 руб./за проект