как записать сообщение пользователя в базу данных при нажатии на кнопку и ввода текста
мне нужно сделать чтобы при нажатии на кнопку покупки пользователь писал текст и после этого
записывать его в базу данных
вот база
[![база данныхццц][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