Суть бота в том, чтобы предоставлять отчеты компаний торгуемых на мосбирже. Бот проверяет пользовательский ввод с помощью библиотеки 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()