подключение корзины к тг боту
подскажите, пожалуйста, как написать код для работающей корзины в тг бот на 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)
Но все же, если вы хотите сделать что-то действительно качественное, то лучше сделать самому