подключение корзины к тг боту

подскажите, пожалуйста, как написать код для работающей корзины в тг бот на aiogram. необходимо, чтобы работали кнопки "добавить в корзину" и "удалить из корзины". к сожалению, несмотря на все попытки написать код, ничего толкового не получилось, заранее спасибо!


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

Автор решения: IvanProkshin

Это может работать примерно так:

from aiogram import Bot, Dispatcher, executor, types
from aiogram.types import ReplyKeyboardRemove, ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton

API_TOKEN = 'токен'

inline_btn_1 = InlineKeyboardButton('Товар 1', callback_data='button1')
inline_btn_2 = InlineKeyboardButton('Товар 2', callback_data='button2')
inline_btn_3 = InlineKeyboardButton('Товар 3', callback_data='button3')

basket = {}

inline_kb1 = InlineKeyboardMarkup()
inline_kb1.add(inline_btn_1)
inline_kb1.add(inline_btn_2)
inline_kb1.add(inline_btn_3)

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
   await message.reply("Список доступных товаров:", reply_markup=inline_kb1)

@dp.message_handler(commands=['basket'])
async def send_basket(message: types.Message):
    rpl = InlineKeyboardMarkup()
    for i in basket.get(message.from_user.id):
        rpl.add(InlineKeyboardButton(i, callback_data=f'{message.from_user.id}_{i}'))
    await message.reply("Ваша корзина,\nНажмите на товар, чтобы удалить его", reply_markup=rpl)


@dp.callback_query_handler(lambda c: c.data == 'button1')
async def process_callback_button1(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)
    try:
        basket.get(callback_query.from_user.id).append("Товар 1")
    except:
        basket[callback_query.from_user.id] = []
        basket.get(callback_query.from_user.id).append("Товар 1")

    await bot.send_message(callback_query.from_user.id, 'Добавлен первый товар')

@dp.callback_query_handler(lambda c: c.data == 'button2')
async def process_callback_button2(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)
    try:
        basket.get(callback_query.from_user.id).append("Товар 2")
    except:
        basket[callback_query.from_user.id] = []
        basket.get(callback_query.from_user.id).append("Товар 2")

    await bot.send_message(callback_query.from_user.id, 'Добавлен второй товар')

@dp.callback_query_handler(lambda c: c.data == 'button3')
async def process_callback_button3(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)
    try:
        basket.get(callback_query.from_user.id).append("Товар 3")
    except:
        basket[callback_query.from_user.id] = []
        basket.get(callback_query.from_user.id).append("Товар 3")

    await bot.send_message(callback_query.from_user.id, 'Добавлен третий товар')

@dp.callback_query_handler(lambda c: c.data)
async def process_callback_remover(callback_query: types.CallbackQuery):
    await callback_query.answer()
    chat_id, name = callback_query.data.split("_")
    rpl = InlineKeyboardMarkup()
    basket.get(int(chat_id)).remove(name)
    for i in basket.get(int(chat_id)):
        rpl.add(InlineKeyboardButton(i, callback_data=f'{int(chat_id)}_{i}'))
    await callback_query.message.reply("Ваша корзина,\nНажмите на товар, чтобы удалить его", reply_markup=rpl)


if __name__ == '__main__':
   executor.start_polling(dp, skip_updates=True)

Но все же, если вы хотите сделать что-то действительно качественное, то лучше сделать самому

→ Ссылка