G
G
GoAi2021-10-03 23:10:25
Python
GoAi, 2021-10-03 23:10:25

Python telegram bot does not work one of the inline buttons in the nested menu, how to fix it?

The essence of the bot is to provide reports of companies traded on the Moscow exchange. The bot checks user input using the fuzzy wuzzy library, if the user made a typo, it tries to correct it and clarifies whether the user meant it. If yes, then a second menu pops up in which it is proposed to receive a short report or a complete one. A short report is obtained, but a complete one is not. Where did I make mistakes?

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()

Answer the question

In order to leave comments, you need to log in

2 answer(s)
G
GoAi, 2021-10-04
@GoAi

Redesigned callback_query_handler. Guessed that it is necessary to do processing of all buttons in one decorator. Everything worked.

@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"))      #выдается полный отчёт

S
soremix, 2021-10-04
@SoreMix

For a full report, callback data = long is passed.
Gets to the first handler, because the condition call.data != short was fulfilled

@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))

And then in this function there are no processing for call.data == ‘long’
Rework all callback functions, why are they called the same at all?

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question