from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler, MessageHandler, ConversationHandler, CallbackContext, Filters
TOKEN = 'YOUR_TOKEN'
products_database = {}
SELECTING_ACTION, ADDING_PRODUCT = range(2)
def start(update: Update, context: CallbackContext) -> None:
keyboard = [
[InlineKeyboardButton("Показать товары", callback_data='show_products')],
[InlineKeyboardButton("Корзина", callback_data='show_cart')],
[InlineKeyboardButton("Контакты", callback_data='contact')],
[InlineKeyboardButton("Добавить товар", callback_data='add_product')]
]
reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text('Привет! Я бот для продажи вещей. Как я могу помочь?', reply_markup=reply_markup)
return SELECTING_ACTION
def show_products(update: Update, context: CallbackContext) -> None:
product_list = "Список товаров:\n"
for product_id, product_info in products_database.items():
product_list += f"{product_id}. {product_info['name']} - {product_info['price']} руб.\n"
update.message.reply_text(product_list + "Выберите товар.")
def show_product_details(update: Update, context: CallbackContext) -> None:
query = update.callback_query
product_id = int(query.data.split('_')[1])
product_info = products_database.get(product_id)
if product_info:
details_text = f"{product_info['name']}\n\nОписание: {product_info['description']}\nЦена: {product_info['price']} руб."
keyboard = [
[InlineKeyboardButton("Добавить в корзину", callback_data=f'add_to_cart_{product_id}')],
[InlineKeyboardButton("Назад", callback_data='show_products')]
]
reply_markup = InlineKeyboardMarkup(keyboard)
query.edit_message_text(details_text, reply_markup=reply_markup)
else:
query.answer("Товар не найден.")
def add_to_cart(update: Update, context: CallbackContext) -> None:
query = update.callback_query
product_id = int(query.data.split('_')[2])
product_info = products_database.get(product_id)
if product_info and product_id not in context.user_data['selected_products']:
context.user_data['selected_products'][product_id] = product_info
query.answer(f"{product_info['name']} добавлен в корзину.")
elif product_id in context.user_data['selected_products']:
query.answer("Товар уже в корзине.")
else:
query.answer("Товар не найден.")
def show_cart(update: Update, context: CallbackContext) -> None:
cart_text = "Корзина:\n"
total_price = 0
for product_id, product_info in context.user_data['selected_products'].items():
cart_text += f"{product_info['name']} - {product_info['price']} руб.\n"
total_price += product_info['price']
cart_text += f"\nИтого: {total_price} руб."
keyboard = [
[InlineKeyboardButton("Оформить заказ", callback_data='checkout')],
[InlineKeyboardButton("Назад", callback_data='show_products')]
]
reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text(cart_text, reply_markup=reply_markup)
def checkout(update: Update, context: CallbackContext) -> None:
query = update.callback_query
user_id = update.effective_user.id
if user_id not in context.user_data['user_orders']:
context.user_data['user_orders'][user_id] = []
for product_id, product_info in context.user_data['selected_products'].items():
context.user_data['user_orders'][user_id].append(product_info)
context.user_data['selected_products'].clear()
query.edit_message_text("Введите адрес доставки:")
return ADDING_PRODUCT
def get_address(update: Update, context: CallbackContext) -> None:
user_id = update.effective_user.id
context.user_data['user_addresses'][user_id] = update.message.text
keyboard = [
[InlineKeyboardButton("Кредитная карта", callback_data='credit_card')],
[InlineKeyboardButton("Банковский перевод", callback_data='bank_transfer')]
]
reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text("Выберите метод оплаты:", reply_markup=reply_markup)
return SELECTING_ACTION
def get_payment_method(update: Update, context: CallbackContext) -> None:
query = update.callback_query
user_id = update.effective_user.id
if query.data == 'credit_card':
context.user_data['user_payment_methods'][user_id] = 'Кредитная карта'
elif query.data == 'bank_transfer':
context.user_data['user_payment_methods'][user_id] = 'Банковский перевод'
order_details = "\n".join([f"{item['name']} - {item['price']} руб." for item in context.user_data['user_orders'][user_id]])
total_price = sum([item['price'] for item in context.user_data['user_orders'][user_id]])
order_message = (
f"Заказ:\n{order_details}\n\n"
f"Итого: {total_price} руб.\n\n"
f"Адрес доставки:\n{context.user_data['user_addresses'][user_id]}\n\n"
f"Метод оплаты:\n{context.user_data['user_payment_methods'][user_id]}\n\n"
f"Спасибо за заказ! Доставка будет осуществлена в ближайшее время."
)
context.user_data['user_orders'][user_id] = []
context.user_data['user_addresses'].pop(user_id, None)
context.user_data['user_payment_methods'].pop(user_id, None)
query.edit_message_text(order_message)
def contact(update: Update, context: CallbackContext) -> None:
update.message.reply_text('Наши контакты:\nТелефон: +123456789\nEmail: example@example.com')
def button_click(update: Update, context: CallbackContext) -> None:
query = update.callback_query
query.answer()
if query.data == 'show_products':
show_products(update, context)
elif query.data.startswith('product_details'):
show_product_details(update, context)
elif query.data.startswith('add_to_cart'):
add_to_cart(update, context)
elif query.data == 'show_cart':
show_cart(update, context)
elif query.data == 'checkout':
checkout(update, context)
elif query.data == 'contact':
contact(update, context)
def main() -> None:
updater = Updater(TOKEN, use_context=True)
dp = updater.dispatcher
conv_handler = ConversationHandler(
entry_points=[CommandHandler('start', start)],
states={
SELECTING_ACTION: [
CallbackQueryHandler(button_click),
MessageHandler(Filters.text & ~Filters.command, start)
],
ADDING_PRODUCT: [MessageHandler(Filters.text & Filters.update.message, get_address)]
},
fallbacks=[]
)
dp.add_handler(conv_handler)
dp.add_handler(CommandHandler("start", start))
updater.start_polling()
updater.idle()
if __name__ == '__main__':
main()