Не доходит колбэк в колбекобработчик, как можно решить эту проблему?

Рейтинг: 1Ответов: 1Опубликовано: 22.07.2025

В коде есть два колбек обработчика , первый срабатывает от инлайнкнопки и потом выводит инлайнкнопки, которые должен обработать второй обработчик , но они не обрабатываются , пробовал менять токен бота , открывал в другом файле тоже не помогло вот сам код:

   import telebot
    from pyexpat.errors import messages
    from telebot import types
    from telebot.util import content_type_media
    from telebot import TeleBot
    from telebot.types import InlineKeyboardMarkup,  InlineKeyboardButton
    import time

    bot = telebot.TeleBot("токен")

    #хендлер на старт
    @bot.message_handler(commands=["start"])
    def start(message):
        markup = InlineKeyboardMarkup()
        button1 = InlineKeyboardButton("ПРОДОЛЖИТЬ", callback_data="start")
        markup.add(button1)
        bot.send_message(message.chat.id,f"<b> Привет, {message.from_user.first_name}😊!      </b> ",parse_mode= "HTML", reply_markup=markup)

    #колбек на старт
    @bot.callback_query_handler(func=lambda call: True)
    def callback_NaStart(call):
       if call.message:
           if call.data == 'start':

               bot.send_message(call.message.chat.id,"<em>текст</em>",parse_mode='HTML')
               time.sleep(0)
               bot.send_message(call.message.chat.id,"<em>=текст</em>",parse_mode='HTML')
               time.sleep(0)
               bot.send_message(call.message.chat.id,'<em>текст</em>',parse_mode='HTML')
               time.sleep(0)
               bot.send_message(call.message.chat.id,"<em>текст</em> ",parse_mode='HTML')
               bot.send_photo(call.message.chat.id, open("C:\\Users\\Hyppo\\PycharmProjects\\PythonProject\\data\\photo1.jpg" , 'rb'))
               markup2 = InlineKeyboardMarkup(row_width=1)
               button1_1 = InlineKeyboardButton("текст", callback_data="first_try1")
               button2_1 = InlineKeyboardButton("текст", callback_data="first_try2")
               markup2.add(button1_1,button2_1)
               bot.send_message(call.message.chat.id," Нам надо решить,что сделать:" ,reply_markup=markup2) 
    #хендлер на текст
    @bot.message_handler(content_types=['text'])
    def txt_(message):
       bot.send_message(message.chat.id,f"<b>Извини, {message.from_user.first_name},я могу получать и обрабатывать только нажатия по кнопкам или команды(start).</b>",parse_mode="HTML")
    #колбек на первый выбор(1)
    @bot.callback_query_handler(func=lambda call:call.data=="first_try1")
    def firs(call):
       bot.send_message(call.message.chat.id,"пришел колбек")
       print(1)

    bot.polling(none_stop=True)

Ответы

▲ 0

Проблема в том, что ниже приведённый handler перехватывает все callback и до следующих обработчиков уже ничего не доходит:

#колбек на старт
@bot.callback_query_handler(func=lambda call: True)
def callback_NaStart(call):
   if call.message:
       if call.data == 'start':

Сюда уже ничего не попадёт, так как обработчик выше использует фильтр func=lambda call: True:

@bot.callback_query_handler(func=lambda call: call.data == "first_try1")
def firs(call):

Что бы это исправить, нужно переписать:

#колбек на старт
@bot.callback_query_handler(func=lambda call: True) 

На:

# колбек на старт
@bot.callback_query_handler(func=lambda call: call.data == "start")
def callback_NaStart(call):

При этом в самом обработчики уже будут не нужны if:

   if call.message:
       if call.data == 'start':

Достаточно условий в самом handler.


Так же, что бы кнопки не мигали после нажатия, боту нужно явно передать что нажатие кнопки обработано. Для этого есть специальный сигнал, который можно отправить через метод: bot.answer_callback_query(call.id)

# колбек на первый выбор(1)
@bot.callback_query_handler(func=lambda call: call.data == "first_try1")
def firs(call):
    bot.send_message(call.message.chat.id, "пришел колбек")
    bot.answer_callback_query(call.id)
    print(1)

Полный код для наглядности:

import telebot
from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton
import time

bot = telebot.TeleBot("TOKEN")


# хендлер на старт
@bot.message_handler(commands=["start"])
def start(message):
    markup = InlineKeyboardMarkup()
    button1 = InlineKeyboardButton("ПРОДОЛЖИТЬ", callback_data="start")
    markup.add(button1)
    bot.send_message(
        message.chat.id,
        f"<b> Привет, {message.from_user.first_name}😊!      </b> ",
        parse_mode="HTML",
        reply_markup=markup,
    )


# колбек на старт
@bot.callback_query_handler(func=lambda call: call.data == "start")
def callback_NaStart(call):

    bot.send_message(call.message.chat.id, "<em>текст</em>", parse_mode="HTML")
    time.sleep(0)
    bot.send_message(call.message.chat.id, "<em>=текст</em>", parse_mode="HTML")
    time.sleep(0)
    bot.send_message(call.message.chat.id, "<em>текст</em>", parse_mode="HTML")
    time.sleep(0)
    bot.send_message(call.message.chat.id, "<em>текст</em> ", parse_mode="HTML")
    bot.send_photo(
        call.message.chat.id,
        open(
            "C:\\Users\\Hyppo\\PycharmProjects\\PythonProject\\data\\photo1.jpg",
            "rb",
        ),
    )
    markup2 = InlineKeyboardMarkup(row_width=1)
    button1_1 = InlineKeyboardButton("текст", callback_data="first_try1")
    button2_1 = InlineKeyboardButton("текст", callback_data="first_try2")
    markup2.add(button1_1, button2_1)
    bot.send_message(
        call.message.chat.id,
        " Нам надо решить,что сделать:",
        reply_markup=markup2,
    )
    # хендлер на текст


@bot.message_handler(content_types=["text"])
def txt_(message):
    bot.send_message(
        message.chat.id,
        f"<b>Извини, {message.from_user.first_name},я могу получать и обрабатывать только нажатия по кнопкам или команды(start).</b>",
        parse_mode="HTML",
    )


# колбек на первый выбор(1)
@bot.callback_query_handler(func=lambda call: call.data == "first_try1")
def firs(call):
    bot.send_message(call.message.chat.id, "пришел колбек")
    bot.answer_callback_query(call.id)
    print(1)


bot.polling(none_stop=True)