@Preacher999

Как реализовать изменение данных анкеты в БД через inline клавиатуру в телеграм боте?

Aiogram 2 и sqlite3. Вот часть кода:
from aiogram import types, executor, Bot, Dispatcher
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import StatesGroup, State
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton,InlineKeyboardMarkup, InlineKeyboardButton, ReplyKeyboardRemove  #Remove удаление клавы
import sqlite3
import config
from database import database_start, create_user, edit_user, pay
import spk
conn = sqlite3.connect('profiles.db')
cursor = conn.cursor()

async def on_startup(_):
    await database_start()

storage = MemoryStorage()
bot = Bot(config.token)
price = types.LabeledPrice(label="Подписка на бота", amount=199*100)
dp = Dispatcher(bot, storage=storage)

#Кнопки клавиатуры
def kb_1() -> ReplyKeyboardMarkup:
    kb = ReplyKeyboardMarkup(resize_keyboard=True)
    kb.add(KeyboardButton('Приступим!'))

    return kb

def kb_2() -> ReplyKeyboardMarkup:
    kb = ReplyKeyboardMarkup(resize_keyboard=True)
    kb.add(KeyboardButton('Мужской'))
    kb.add(KeyboardButton('Женский'))

    return kb

def kb_3() -> ReplyKeyboardMarkup:
    kb = ReplyKeyboardMarkup(resize_keyboard=True)
    kb.add(KeyboardButton('Показать анкету и изменить данные'))
    kb.add(KeyboardButton('Информация о тренере'))
    kb.add(KeyboardButton('Расчёт суточной потребности калорий'))
    kb.add(KeyboardButton('Оплатить подписку'))
    kb.add(KeyboardButton('Лекционный материал по тренировкам и питанию'))

    return kb

def kb_4() -> ReplyKeyboardMarkup:
    kb = ReplyKeyboardMarkup(resize_keyboard=True)
    kb.add(KeyboardButton('Сидячий образ жизни'))
    kb.add(KeyboardButton('Небольшая активность'))
    kb.add(KeyboardButton('Умеренная активность'))
    kb.add(KeyboardButton('Высокая активность'))
    kb.add(KeyboardButton('Очень высокая активность'))
    kb.add(KeyboardButton('Назад'))

    return kb

#Инлайновые кнопки
catalog_list = InlineKeyboardMarkup(row_width=2)
catalog_list.add(InlineKeyboardButton(text='⏲Изменить вес', callback_data='weight'),
                 InlineKeyboardButton(text='Изменить рост', callback_data='height'),
                 InlineKeyboardButton(text='Изменить возраст', callback_data='age'),
                 InlineKeyboardButton(text='⚤Изменить пол', callback_data='gender'),
                 InlineKeyboardButton(text='Изменить ФИО', callback_data='full_name'))

class ClientStates(StatesGroup):
    fullname = State()
    gender = State()
    weight = State()
    height = State()
    age = State()


#Изменение данных анкеты (За new_weight принимает сообщение к которому привязана inline клавиатура)
@dp.callback_query_handler(lambda c: c.data == 'weight')
async def callback_query_keyboard(callback_query: types.CallbackQuery):
    await bot.send_message(chat_id=callback_query.from_user.id, text='Напишите Ваш вес:')
    new_weight = callback_query.message.text
    user_id = callback_query.from_user.id
    cursor.execute(f"Update users SET weight ='{new_weight}' where user_id={user_id}")
    conn.commit()
    cursor.close()
    conn.close()
    await bot.send_message(chat_id=callback_query.from_user.id, text="Вес успешно изменён!", parse_mode='html', reply_markup=kb_3())
  • Вопрос задан
  • 50 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
1. Если пользователь должен отправлять данные как текст сообщения, тебе нужен finite state machine (FSM). В aiogram уже есть реализация, почитай и погугли примеры.
2. Никогда не формируй SQL запросы f-строками - слишком легко ошибиться, да и небезопасно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы