как записать сообщение пользователя в базу данных при нажатии на кнопку и ввода текста

мне нужно сделать чтобы при нажатии на кнопку покупки пользователь писал текст и после этого
записывать его в базу данных вот база [![база данныхццц][1]][1]

import sqlite3
import telebot
from telebot import types
import ujson
from db import Databese

# ---------------------------------------------------------------------------

bot = telebot.TeleBot('5639740174:AAF22Xy3SxQa4Bq2GYuaTk8Tlc_058Le024')
DB_FILE_NAME = 'db.sqlite'

# так как у тебя нет бд обойдемся словарем
# ПыСы. при перезапуске бота данные пропадут.
# Ты либо их записывай в файл либо переходи на aiogram
users = {}

        @bot.message_handler(commands=['start'])
def welcome(message: types.Message):
    # при нажатии на старт, сделаем запись юзера в нашу "бд"
    # PS если юзер нажмет ещё раз, то ничего не произойдет (если юзер записан в бд)
    users.setdefault(message.from_user.id, {"in_lab": None})

    # не делайте так. Вы не закрываете файл, могут быть тупые ошибки.
    # sti = open('welcome/welcome.webp', 'rb')
    # делайте так

    # Создание кнопок и приветствие
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    # рекомендую сократить код с этого
    # item1 = types.KeyboardButton("Кто в лабе")
    # item2 = types.KeyboardButton("подтвердить")
    # item3 = types.KeyboardButton("? Разработчики ?")
    # markup.add(item1, item2, item3)
    # до такого
    markup.add("Кто в лабе", "Подтвердить", "?покупки?", "? Разработчики ?")
    # забудьте про format, юзайе f-строки
    # bot.send_message(message.chat.id, "Добро пожаловать, {0.first_name}!\nЯ - <b>{1.first_name}</b>,
    # помогу тебе ворваться в лабу!".format( message.from_user, bot.get_me()),
    # parse_mode='html', reply_markup=markup)
    bot.send_message(chat_id=message.chat.id,
                     text=f"Добро пожаловать, {message.from_user.first_name}!\n"
                          f"Я - <b>{bot.get_me().first_name}</b>, помогу тебе ворваться в лабу!",
                     parse_mode='html',
                     reply_markup=markup)


# прекратите так делать. Делайте для каждой команды отдельный хендлер
# @bot.message_handler(content_types=['text'])
# PS также смысла писать content_types=['text'] нет, так как это значение по-умолчанию
# и уберите это условие в фильтр декоратора так ведь лучше
# if message.chat.type == 'private':
# а все свои if message.text == '...': также запихните в фильтр декоратора
@bot.message_handler(chat_types='private', func=lambda msg: msg.text == "Подтвердить")
def accept(message: types.Message):
    markup = types.InlineKeyboardMarkup(row_width=2)
    # я поменял колбеки, чтобы потом их было проще ловить и фильтровать от других
    item1 = types.InlineKeyboardButton("Ты в лабе⚡", callback_data='labs:add')
    item2 = types.InlineKeyboardButton("Ты не в лабе⚡", callback_data='labs:delete')
    markup.add(item1, item2)
    bot.send_message(message.chat.id, 'Добро пожаловать,\n ты в лабе или нет")', reply_markup=markup)

@bot.message_handler(chat_types='private', func=lambda msg: msg.text == "? Разработчики ?")
def devs(message: types.Message):
    bot.send_message(message.chat.id,
                     'Данный бот был разработан @seapix',

                     parse_mode='html')
@bot.message_handler(chat_types='private', func=lambda msg: msg.text == "?покупки?")
def devs(message: types.Message ):
    bot.send_message(message.chat.id,'Что вы хотите купить',parse_mode='html',)
def handle_message(call):
    if call.message:
        message = call.data
        print(massage)
# делаем хендлер для вывода инфы о том кто в "лабе"
@bot.message_handler(chat_types='private', func=lambda msg: msg.text == "Кто в лабе")
def output_labs_data(message: types.Message):
    # перебираем "бд" и записываем тех у кого True
    list_labs_users = []
    for key, value in users.items():
        if isinstance(value, dict):
            if value.get("in_lab") is True:
                list_labs_users.append(key)

    result_text = "В лабе:\n"
    for user in list_labs_users:
        user_data = bot.get_chat_member(chat_id=user, user_id=user)
        print(user_data)
        result_text += f"{user_data.user.first_name}\n"

    bot.send_message(message.chat.id, text=result_text)


# и вот в конец даешь хендлер который впитывает все, но я бы его убрал - бесполезная нагрузка



# этот хендлер хоть и есть в документации, но делать так не надо
# @bot.callback_query_handler(func=lambda call: True)
@bot.callback_query_handler(func=lambda call: call.data.startswith("labs:"))
def labs_callback(call: types.CallbackQuery):
    # всегда в начале делай answer_callback_query, чтобы пропал значок с часами
    bot.answer_callback_query(call.id)
    data = call.data.split(":")[2]
    # вне зависимосте от того жал юзер старт или нет перестрахуемся и еще раз запишем в бд
    users.setdefault(call.from_user.id, {"in_lab": None})
    # если жмакнул кнопку в лабе то делаем True если нет то False
    users[call.from_user.id]["in_lab"] = True if data == "add" else False


if __name__ == '__main__':
    bot.infinity_polling(skip_pending=True)```
 


  [1]: https://i.stack.imgur.com/WDvsm.png
  [2]: https://i.stack.imgur.com/Llo6X.png

Ответы (0 шт):