1

Тема: Проблема в handler при написанні tg бота для зберігання фольклору

Пишу бота на telebot, який зможе зберігати пісні від користувача в sqlite3 бд та видавати інформацію про пісні. Зараз готова частина з додаванням пісень. Тобто користувач може додати пісню. Після чого вся інфа додається до бд. Вже трохи довго застиг на реалізації пошуку пісні за назвою.

Вище ще є код, який викликає process_song_name, після введення назви. Далі йде пошук в бд і результати збігів виводяться в кнопках.
Далі починаються проблеми... При натисканні на кнопку з піснею має посилатися callback_data, яку обробляє handler. І виконуватись функція, яка повертає все про пісню. Але чомусь не працює. Буду вдячний, якщо допоможете виправити помилку!

@bot.message_handler(func=lambda message: True)
def process_song_name(message):
    # Отримати назву 
    search_name = message.text

    conn = sqlite3.connect('new_songs.db')
    cursor = conn.cursor()

    cursor.execute('SELECT * FROM songs WHERE title LIKE ?', ('%' + search_name + '%',))
    search_results = cursor.fetchall()

    conn.close()

    # відобразити результати у кнопках
    if not search_results:
        bot.send_message(message.chat.id, f"Не знайдено пісні: '{search_name}'.")
    else:
        bot.send_message(message.chat.id, "Результати пошуку:")
        for result in search_results:
            # створення кнопок з кожним результатом
            button_text = f"{result[3]} - {result[6]}"
            callback_data = f"song_info-{result[0]}"  
            markup = types.InlineKeyboardMarkup()
            markup.add(types.InlineKeyboardButton(text=button_text, callback_data=callback_data))
            bot.send_message(message.chat.id, f"Назва: {result[3]}, Регіон: {result[6]}", reply_markup=markup)


# Хендлер для виведення інфи про вибрану пісню, який не працює(
@bot.callback_query_handler(func=lambda call: call.data and call.data.startswith("song_info-"))
def handle_song_info_callback(call):
    print("Callback received:", call.data)
    #не виводиться в консоль(
    song_id = int(call.data.split('-')[1])

   
    conn = sqlite3.connect('new_songs.db')
    cursor = conn.cursor()
    
    cursor.execute('SELECT * FROM songs WHERE id = ?', (song_id,))
    song_info = cursor.fetchone()
    conn.close()
    
    if song_info:
        info_message = f'Title: {song_info[3]}\nРегіон: {song_info[6]}\Додано: {song_info[1]}\Текст: {song_info[5]}'
        bot.send_message(call.message.chat.id, info_message)
    else:
        bot.send_message(call.message.chat.id, "Помилка при отримані даних.")

2

Re: Проблема в handler при написанні tg бота для зберігання фольклору

Прихований текст

Проблема в тому, що ви викликаєте bot.send_message в циклі, де створюються кнопки. Кожен раз, коли ви викликаєте bot.send_message, ви відправляєте нове повідомлення, і старе повідомлення з кнопками втрачається.

Щоб виправити це, вам слід змінити ваш підхід до створення кнопок та відправлення повідомлень. Одна з можливих опцій - зберігати всі кнопки у списку, а потім відправляти їх разом. Тут простий приклад:

# Отримати назву 
search_name = message.text

conn = sqlite3.connect('new_songs.db')
cursor = conn.cursor()

cursor.execute('SELECT * FROM songs WHERE title LIKE ?', ('%' + search_name + '%',))
search_results = cursor.fetchall()

conn.close()

# відобразити результати у кнопках
if not search_results:
    bot.send_message(message.chat.id, f"Не знайдено пісні: '{search_name}'.")
else:
    bot.send_message(message.chat.id, "Результати пошуку:")
    buttons = []  # Список для зберігання кнопок
    for result in search_results:
        button_text = f"{result[3]} - {result[6]}"
        callback_data = f"song_info-{result[0]}"
        markup = types.InlineKeyboardMarkup()
        markup.add(types.InlineKeyboardButton(text=button_text, callback_data=callback_data))
        buttons.append((f"Назва: {result[3]}, Регіон: {result[6]}", markup))

    # Відправити всі кнопки разом
    for text, markup in buttons:
        bot.send_message(message.chat.id, text, reply_markup=markup)

Цей код зберігає всі кнопки в списку buttons, а потім відправляє їх разом за допомогою циклу в кінці блоку. Це дозволяє зберегти повідомлення з кнопками та визначити правильність обробки callback_query для кожної кнопки.

3

Re: Проблема в handler при написанні tg бота для зберігання фольклору

Схоже, що помилки не в цьому або не тільки в цьому. Можливо треба якось хендлер змінити або callback_data?