Почему callback не вызывается во второй раз?

Как создать телеграм-бота с использованием библиотеки Telebot для отправки изображений и использования клавиатуры инлайн-кнопок для обработки пользовательских запросов, сохранения данных в базе данных SQLite и перехода между различными шагами в обработке сообщений?
  • 4 июля 2024 г. 18:32
Ответы на вопрос 2
Существует несколько возможных причин, по которым callback может не вызываться во второй раз. Одна из них может быть связана с неправильной регистрацией обработчика callback'ов или переписыванием callback данных во время выполнения. Другая возможная причина может быть связана с ошибкой в коде или ситуацией, когда callback не вызывается из-за условий в самом обработчике.

Чтобы создать телеграм-бота с использованием библиотеки Telebot для отправки изображений и использования клавиатуры инлайн-кнопок для обработки пользовательских запросов, сохранения данных в базе данных SQLite и перехода между различными шагами в обработке сообщений, можно применить следующий подход:

1. Установите и импортируйте библиотеку Telebot в свой проект.

2. Создайте экземпляр бота, указав токен вашего бота. Например:

```python
import telebot

bot = telebot.TeleBot('YOUR_BOT_TOKEN')
```

3. Определите обработчики для различных типов сообщений, включая текстовые сообщения, изображения и callback запросы. Например:

```python
@bot.message_handler(content_types=['text'])
def handle_text(message):
    # Обработка текстовых сообщений
    pass

@bot.message_handler(content_types=['photo'])
def handle_photo(message):
    # Обработка изображений
    pass

@bot.callback_query_handler(func=lambda call: True)
def handle_callback(call):
    # Обработка callback запросов
    pass
```

4. Используйте клавиатуру с инлайн-кнопками для обработки пользовательских запросов. Например:

```python
keyboard = telebot.types.InlineKeyboardMarkup()
keyboard.add(telebot.types.InlineKeyboardButton('Кнопка 1', callback_data='button1'))

@bot.message_handler(commands=['start'])
def handle_start(message):
    bot.send_message(message.chat.id, 'Нажмите на кнопку:', reply_markup=keyboard)
```

5. Используйте базу данных SQLite для сохранения данных по мере необходимости. Например:

```python
import sqlite3

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

# Создание таблицы
cursor.execute('''CREATE TABLE IF NOT EXISTS users
                  (user_id INTEGER PRIMARY KEY, username TEXT, name TEXT)''')

# Вставка данных
cursor.execute("INSERT INTO users (user_id, username, name) VALUES (?, ?, ?)", (user.id, user.username, user.first_name))

# Получение данных
cursor.execute("SELECT * FROM users WHERE user_id=?", (user.id,))
data = cursor.fetchall()
```

6. Разработайте логику программы для перехода между различными шагами в обработке сообщений, включая вызов других функций, отправку сообщений и обработку ответов от пользователя.

7. Запустите бота, чтобы он начал принимать сообщения от пользователей и выполнять заданные обработчики.

Это базовый шаблон для создания телеграм-бота с использованием библиотеки Telebot. Можно дополнительно расширить его функциональность и улучшить пользовательский опыт, добавив новые обработчики, клавиатуры и функции работы с базой данных.
- Зачем светить своим токеном? 
- Зачем 2 раза объявлять одну и туже функцию callback_message?
- Внутри функции callback_message Вы использовали callback.message.chat.id для отправки сообщений, но callback.message является ссылкой на сообщение, которое инициировало callback, а не на сообщение, которое нужно отправить.
- А как же обработка callback_data cadastral?
- message.message_id минус 0?
import telebot
from telebot import types

bot = telebot.TeleBot('token')
file = open('./start1.jpg', 'rb')

@bot.message_handler(commands=['start'])
def start(message):
    markup = types.InlineKeyboardMarkup()
    markup.add(types.InlineKeyboardButton('Оценка', url='https://google.com'))
    markup.add(types.InlineKeyboardButton('Кадастровые работы', callback_data='cadastral'))
    markup.add(types.InlineKeyboardButton('Строительные экспертизы', callback_data='expertise'))
    bot.send_photo(message.chat.id, file, 
                   caption='Здравствуйте, это Бот-помощник группы компаний "Стандарт Оценка", я помогу Вам определиться с нужной услугой, оформить заявку и связаться с администратором. Выберете желаемую услугу', 
                   reply_markup=markup)

@bot.callback_query_handler(func=lambda call: True)
def callback_message(call):
    if call.data == 'cadastral':
        bot.delete_message(call.message.chat.id, call.message.message_id)
        bot.send_message(call.message.chat.id, 'Введите свое ФИО')
        bot.register_next_step_handler(call.message, message_input_step)
    elif call.data == 'expertise':
        bot.send_message(call.message.chat.id, 'Вы выбрали Строительные экспертизы')
    elif call.data == 'all':
        bot.send_message(call.message.chat.id, 'Все данные верны')

def message_input_step(message):
    global name
    name = message.text
    bot.send_message(message.chat.id, 'Введите свой номер телефона')
    bot.register_next_step_handler(message, phone)

def phone(message):
    global phone
    phone = message.text
    markup = types.InlineKeyboardMarkup()
    markup.add(types.InlineKeyboardButton('Все верно✅', callback_data='all'))
    markup.add(types.InlineKeyboardButton('Начать сначало❌', callback_data='cadastral'))
    bot.send_message(message.chat.id, f'Ваше ФИО: {name}\nВаш номер телефона: {phone}', reply_markup=markup)

if __name__ == "__main__":
    bot.polling(none_stop=True)
Похожие вопросы