Николай Армоньев
Гуру
(4355)
4 недели назад
Ваш код содержит несколько ошибок и недочетов, которые могут мешать его правильной работе. Давайте разберем его и исправим.
Недостаток кнопок:
В коде не создаются кнопки для взаимодействия с пользователем. Чтобы создать кнопки, используйте InlineKeyboardMarkup и InlineKeyboardButton.
Функция отправки сообщений:
Необходимо использовать правильные методы для отправки текстовых сообщений и файлов.
Ошибки в именах методов:
Методы bot.send_text и bot.send_document нужно заменить на bot.send_message и bot.send_document.
Некорректная обработка чатов:
При вызове методов необходимо правильно передавать идентификаторы и сообщения.
Логика обработки заказа:
В коде есть некорректные определения обработчиков сообщений.
Вот улучшенная версия вашего кода с учетом вышеперечисленных моментов:
import telebot
from telebot import types
bot = telebot.TeleBot("7388191311:AAE-taUw6qzlM7E1mQPSWvb7ktSrJQdE-yY")
shop = {
'goods': {
'товар1': {'price': 100},
'товар2': {'price': 200}
},
'orders': {}
}
@bot.message_handler(commands=['start'])
def start(message):
markup = types.InlineKeyboardMarkup()
btn_catalog = types.InlineKeyboardButton("Каталог", callback_data='каталог')
btn_author = types.InlineKeyboardButton("Автор", callback_data='автор')
markup.add(btn_catalog, btn_author)
bot.send_message(message.chat.id, 'Привет! Я — магазин. Что ты хочешь купить?', reply_markup=markup)
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
if call.data == 'каталог':
bot.send_document(call.message.chat.id, open('catalog.txt', 'rb'))
elif call.data == 'автор':
bot.send_message(call.message.chat.id, 'Автор магазина: [имя автора]')
elif call.data.startswith('купить'):
item = call.data.split(' ')[1]
bot.send_message(call.message.chat.id, f'Хорошо, {item} добавлен в корзину.')
@bot.message_handler(func=lambda message: True)
def get_order(message):
items = message.text.split(', ')
for item in items:
if item not in shop['goods']:
bot.reply_to(message, 'Я не знаю такого товара. Попробуй ещё раз.')
return
total = sum([shop['goods'][item]['price'] for item in items if item in shop['goods']])
bot.send_message(message.chat.id, f"Ваш заказ на сумму {total} успешно оформлен!")
shop['orders'][message.chat.id] = items
@bot.message_handler(func=lambda message: message.text == 'подтвердить')
def send_confirmation(message):
Николай АрмоньевГуру (4355)
4 недели назад
bot.send_message(message.chat.id, "Ваш заказ успешно подтверждён!")
@bot.message_handler(func=lambda message: True)
def show_bought_items(message):
if message.chat.id in shop['orders']:
items = shop['orders'][message.chat.id]
bot.send_message(message.chat.id, f"Вы купили: {', '.join(items)}")
else:
bot.send_message(message.chat.id, "У вас нет купленных товаров.")
bot.polling(none_stop=True)
Ключевые изменения:
Добавлены кнопки для взаимодействия с пользователем.
Исправлены методы для отправки сообщений.
Введены проверки на наличие товара в shop['goods'].
Оптимизирована логика обработки сообщений.
Попробуйте использовать этот код и проверьте, работают ли кнопки корректно
Артём МусаелянУченик (123)
4 недели назад
Привет line 25
markup = types.InlineKeyboardMarkup()
^
IndentationError: expected an indented block after function definition on line 23
Выдаёт эту ошибку
import telebot
from telebot import types
bot = telebot.TeleBot("7388191311:AAE-taUw6qzlM7E1mQPSWvb7ktSrJQdE-yY")
shop = {
'goods': {},
'orders': {}
}
@bot.message_handler(commands=['start'])
def start(message):
bot.send_message(message.chat.id, 'Привет! Я — магазин. Что ты хочешь купить?')
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
if call.data == 'каталог':
bot.send_document(call.message.from_user, open('catalog.txt', 'rb'))
elif call.data == 'автор':
bot.send_text(call.message.from_user, 'Автор магазина: [имя автора]')
elif call.data == 'товары':
bot.send_document(call.message.from_user, open('goods.txt', 'rb'))
elif call.data == 'купить':
item = call.data.split(' ')[1]
bot.send_text(call.message.from_user, f'Хорошо, {item} добавлен в корзину.')
# Обработка заказа
@bot.message_handler()
def get_order(message):
items = message.text.split(', ')
for item in items:
if item not in shop['goods']:
bot.reply_to(message, 'Я не знаю такого товара. Попробуй ещё раз.')
return
total = sum([shop['goods'][item]['price'] for item in items])
bot.send_text(message.from_ user.id , f"Ваш заказ на сумму {total} успешно оформлен!")
shop['orders'][message.chat.id] = items
# Отправка подтверждения и информации о доставке
@bot.message_handler(content_types=['text'])
def send_confirmation(message):
if message.text == 'подтвердить':
bot.send_text(message.from_ user.id , "Ваш заказ успешно подтверждён!")
else: bot.reply_to(message, "Я не понимаю ваш запрос. Попробуйте ещё раз.")
# Отображение купленных товаров
@bot.message_handler()
def show_bought_items(message):
items = shop['orders'][message.chat.id]
bot.send_document(message.chat.id, open('bought.txt', 'rb'))
bot.polling(none_stop=True)