Как извлечь user_id из таблицы SQLite3, используемая в Telebot?

У меня подключена библиотека sqlite3, и я получаю данные по id в таблице. Мне нужно, чтобы при нажатии на кнопку "принять" сообщение отправлялось пользователю. Вот мой код с подключённым sqlite: 

```python
import sqlite3
import telebot
from telebot import types

token='***************'
bot=telebot.TeleBot(token)

conn = sqlite3.connect('/Users/User/PycharmProjects/pythonProject3/.venv/db/database', check_same_thread=False)
cursor = conn.cursor()

@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
    if call.message:
        if call.data == 'menu1':
            markup = types.InlineKeyboardMarkup()
            switch_button3 = types.InlineKeyboardButton(text='fragolino', callback_data="menu4")
            markup.add(switch_button3)
            switch_button4 = types.InlineKeyboardButton(text='fragolino2', callback_data="menu4")
            markup.add(switch_button4)
            switch_button5 = types.InlineKeyboardButton(text='fragolino3', callback_data="menu4")
            markup.add(switch_button5)
            bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="выбери товар", reply_markup=markup)
        
        if call.data == 'oper':
            bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Наш оператор @fluacyl, оступен с 8:00-23:00")
        
        if call.data == 'menu4':
            markup = types.InlineKeyboardMarkup()
            switch_button3 = types.InlineKeyboardButton(text='btc', callback_data="menu5")
            markup.add(switch_button3)
            switch_button4 = types.InlineKeyboardButton(text='efr', callback_data="menu6")
            markup.add(switch_button4)
            switch_button5 = types.InlineKeyboardButton(text='...')
```

Как мне реализовать отправку сообщения пользователю при нажатии кнопки "принять"?
  • 4 ноября 2024 г. 6:23
Ответы на вопрос 2
Чтобы реализовать отправку сообщения пользователю при нажатии на кнопку "принять" в вашем коде с использованием библиотек Telebot и SQLite3, вам нужно выполнить несколько шагов. Предположим, у вас есть таблица в SQLite с названиями, например, `users`, где вы храните `user_id` пользователей. 

Вот как можно это реализовать:

1. Добавьте кнопку "принять" на ваше меню.
2. Обработайте нажатие этой кнопки, чтобы отправить сообщение пользователю на основании его `user_id`, который должен быть доступен в вашей базе данных.

Приведенный ниже код является примером, как это может выглядеть:

```python
import sqlite3
import telebot
from telebot import types

token = '***************'
bot = telebot.TeleBot(token)

# Подключение к базе данных
conn = sqlite3.connect('/Users/User/PycharmProjects/pythonProject3/.venv/db/database', check_same_thread=False)
cursor = conn.cursor()

@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
    if call.message:
        if call.data == 'menu1':
            markup = types.InlineKeyboardMarkup()
            switch_button3 = types.InlineKeyboardButton(text='fragolino', callback_data="menu4")
            markup.add(switch_button3)
            switch_button4 = types.InlineKeyboardButton(text='fragolino2', callback_data="menu4")
            markup.add(switch_button4)
            switch_button5 = types.InlineKeyboardButton(text='fragolino3', callback_data="menu4")
            markup.add(switch_button5)
            bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="выбери товар", reply_markup=markup)
        
        if call.data == 'oper':
            bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Наш оператор @fluacyl, оступен с 8:00-23:00")
        
        if call.data == 'menu4':
            markup = types.InlineKeyboardMarkup()
            switch_button3 = types.InlineKeyboardButton(text='btc', callback_data="menu5")
            markup.add(switch_button3)
            switch_button4 = types.InlineKeyboardButton(text='efr', callback_data="menu6")
            markup.add(switch_button4)
            switch_button5 = types.InlineKeyboardButton(text='Принять', callback_data="accept_order")
            markup.add(switch_button5)
            
            bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Выберите опцию:", reply_markup=markup)

        if call.data == 'accept_order':
            user_id = call.from_user.id  # Получаем user_id
            # Пример запроса к БД для получения user_id (если у вас есть таблица users)
            cursor.execute("SELECT telegram_id FROM users WHERE user_id = ?", (user_id,))
            result = cursor.fetchone()
            
            if result:
                user_telegram_id = result[0]  # предположим, что id Telegram - это первый столбец
                bot.send_message(user_telegram_id, "Ваш заказ принят!")  # Отправляем сообщение пользователю
            else:
                bot.send_message(call.message.chat.id, "Не удалось найти пользователя в базе данных.")

# Запуск бота
bot.polling(none_stop=True)
```

### Объяснение кода:
1. **Кнопка "Принять"**: Мы добавляем новую кнопку с `callback_data="accept_order"` в обработчик для кнопки `menu4`.
2. **Обработка нажатия кнопки "Принять"**: При нажатии на кнопку извлекается `user_id` из `call.from_user.id`.
3. **Запрос в БД**: Выполняется SQL-запрос для получения `telegram_id` соответствующего пользователя по вашему `user_id`.
4. **Отправка сообщения**: Если `telegram_id` найден, бот отправляет сообщение этому пользователю.

Не забывайте адаптировать код в зависимости от конкретной схемы вашей базы данных и логики приложения.
Через запрос к БД: 
SELECT user_id FROM ... WHERE ...
После FROM указывается таблица, откуда надо взять значение, а после WHERE условия
Похожие вопросы