Не доходит колбэк в колбекобработчик, как можно решить эту проблему?
В коде есть два колбек обработчика , первый срабатывает от инлайнкнопки и потом выводит инлайнкнопки, которые должен обработать второй обработчик , но они не обрабатываются , пробовал менять токен бота , открывал в другом файле тоже не помогло вот сам код:
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)
Ответы (1 шт):
Проблема в том, что ниже приведённый 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)