@GoAi

Python telegram bot не работает одна из инлайн кнопок во вложенном меню, как исправить?

Суть бота в том, чтобы предоставлять отчеты компаний торгуемых на мосбирже. Бот проверяет пользовательский ввод с помощью библиотеки fuzzy wuzzy, если пользователь допустил опечатку, то пытается исправить её и уточняет то ли имел ввиду пользователь. Если да, то всплывает второе меню в котором предлагается получить краткий отчёт или полный. Краткий отчёт получается получить, а полный нет. Где я допустил ошибки?

import telebot
import sqlite3
from telebot import types
from thefuzz import fuzz        #подключил модули из библиотеки 
from thefuzz import process     #fuzzywuzzy для обработки неточных соответствий

company_list=['Газпром','Сбербанк','Алроса', 'ТГК-1', 'Московская биржа']


def query_db(user_query,info):                                        #создал функцию запроса в базу данных
    conn = sqlite3.connect('msfo.db3')
    cur = conn.cursor()
    return cur.execute(f'SELECT {info} FROM msfo WHERE name="{user_query}";')
    conn.close()




bot = telebot.TeleBot('') #тут подключаю токен выданый BotFather в телеграмме

@bot.message_handler(commands=['start'])
def start_command(message):                                                 #старт функция приветствие
    bot.send_message(message.chat.id, "Вас приветствует бот-помошник. Вы пожете получить последний отчёт компании МСФО/РСБУ.\nВведите название компании :")



@bot.message_handler(content_types=['text'])                        #считываем пользовательский ввод
def query_company(message):
    global a
    a = process.extractOne(message.text, company_list)              #тут начинается корректировка неточного запроса пользователя
    if a[1] >= 60:
        
        #так как process.excractOne возвращает список, то получаем доступ к его значениям по индексам
        
        if a[1] < 99:
            markup_inline = types.InlineKeyboardMarkup()
            item_yes = types.InlineKeyboardButton(text='Да', callback_data='Yes')
            item_no = types.InlineKeyboardButton(text='Нет', callback_data='No')
            markup_inline.add(item_yes, item_no)
            bot.send_message(message.from_user.id, f'Вы имели ввиду компанию {a[0]}?', reply_markup=markup_inline)
        else:
            response_data(message.from_user.id)
    else:
        bot.send_message(message.from_user.id, "по вашему запросу нет информации")


@bot.callback_query_handler(func=lambda call: call.data != "short")
def callback_inline(call):                                #функция обработчик callback данных пользовательского выбора
    try:
        if call.message:
            if call.data == "Yes":                    #если выбор "Да" то запускается функция со второй клавиатурой
                return response_data(call.message.chat.id)
            elif call.data == "No":
                bot.send_message(call.message.chat.id, "Попробуйте ещё раз")
    except Exception as e:
       print(repr(e))
    
def response_data(param):          #создал функцию со второй клавиатурой передал в нее 
    markup_inline = types.InlineKeyboardMarkup()
    item_short = types.InlineKeyboardButton(text='Краткий', callback_data='short')
    item_long = types.InlineKeyboardButton(text='Полный', callback_data='long')
    markup_inline.add(item_short, item_long)
    bot.send_message(param, 'Какой отчёт нужен краткий или полный?', reply_markup=markup_inline)

@bot.callback_query_handler(func=lambda call: call.data != 'Yes')
def callback_inline(call):                                #функция обработчик callback данных пользовательского выбора
    try:
        if call.message:
            if call.data == 'short':                    #если выбор ...
                bot.send_message(call.message.chat.id, query_db(a[0],"short_info"))
            elif call.data == 'long':
                bot.send_message(call.message.chat.id, query_db(a[0],"long_info"))   #тут не срабатывает
    except Exception as e:
       print(repr(e))
                               
bot.infinity_polling()
  • Вопрос задан
  • 603 просмотра
Решения вопроса 1
@GoAi Автор вопроса
Переделал callback_query_handler. Догадался что нужно обработку всех кнопок делать в одном декораторе. Всё заработало.
@bot.callback_query_handler(func=lambda call: True)
def callback_inline_menu(call):                                    #функция обработчик callback данных пользовательского выбора
    if call.data == "Yes":                                          #если выбор "Да" то запускается функция со второй клавиатурой
        return response_data(call.message.chat.id)
    elif call.data == "No":
        bot.send_message(call.message.chat.id, "Попробуйте ещё раз")
    elif call.data == "short":                                                   
        bot.send_message(call.message.chat.id, query_db(a[0],"short_info"))     #выдается краткий отчёт 
    elif call.data == "long":                                             
        bot.send_message(call.message.chat.id, query_db(a[0],"long_info"))      #выдается полный отчёт
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
SoreMix
@SoreMix Куратор тега Python
yellow
Для полного отчета передаётся callback data = long.
Попадает в первый хэндлер, т.к выполнилось условие call.data != short
@bot.callback_query_handler(func=lambda call: call.data != "short")
def callback_inline(call):                                #функция обработчик callback данных пользовательского выбора
    try:
        if call.message:
            if call.data == "Yes":                    #если выбор "Да" то запускается функция со второй клавиатурой
                return response_data(call.message.chat.id)
            elif call.data == "No":
                bot.send_message(call.message.chat.id, "Попробуйте ещё раз")
    except Exception as e:
       print(repr(e))

А дальше в этой функции нет никаких обработок для call.data == ‘long’

Переделывайте все колбэк функции, почему они одинаково вообще называются?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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