Половина кода не работает, После 50 строчки не работает код, пожалуйста объясните поподробнее что нужно сделать или поменять, не разбираюсь в терминах
import random
import telebot
from telebot import types
name = ''
surname = ''
bot = telebot.TeleBot("TOKEN", parse_mode=None)
@bot.message_handler(commands=['start'])
def start(message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
item1 = types.KeyboardButton('Рандомное число(от 1 до 10)')
item2 = types.KeyboardButton('ℹИнформация')
markup.add(item1, item2)
bot.send_message(message.chat.id, 'Привет, {0.first_name}!'.format(message.from_user), reply_markup=markup)
@bot.message_handler(content_types=["text"])
def bot_message(message):
if message.chat.type == 'private':
if message.text == 'Рандомное число(от 1 до 10)':
bot.send_message(message.chat.id, 'Ваше число: ' + str(random.randint(0, 10)))
elif message.text == 'ℹИнформация':
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
item1 = types.KeyboardButton('Команды')
item2 = types.KeyboardButton('Чтото')
back = types.KeyboardButton('?Назад')
markup.add(item1, item2, back)
bot.send_message(message.chat.id, 'ℹИнформация', reply_markup=markup)
elif message.text == '?Назад':
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
item1 = types.KeyboardButton('Рандомное число(от 1 до 10)')
item2 = types.KeyboardButton('ℹИнформация')
markup.add(item1, item2)
bot.send_message(message.chat.id, '?Назад', reply_markup=markup)
elif message.text == 'Команды':
bot.send_message(message.chat.id, '/reg - регистрация')
@bot.message_handler(func=lambda m: True)
def echo_all(message):
if message.text == 'Привет':
bot.reply_to(message, 'Привет')
elif message.text == 'привет':
bot.reply_to(message, 'привет')
elif message.text == '/reg':
bot.send_message(message.from_user.id, "Привет, Давай познакомимся! Как тебя зовут?")
bot.register_next_step_handler(message, reg_name)
# bot.reply_to(message, message.text)
def reg_name(message):
global name
name = message.text
bot.send_message(message.from_user.id, "Какая у вас фамилия?")
bot.register_next_step_handler(message, reg_surname)
def reg_surname(message):
global surname
surname = message.text
keyboard = types.InlineKeyboardMarkup()
key_yes = types.InlineKeyboardButton(text='Да', callback_data='yes')
keyboard.add(key_yes)
key_no = types.InlineKeyboardButton(text='Нет', callback_data='no')
keyboard.add(key_no)
question = 'Тебя зовут: ' + surname + ' ' + name + '?'
bot.send_message(message.from_user.id, text=question, reply_markup=keyboard)
@bot.callback_query_handler(func=lambda call: True)
def callback_worker(call):
if call.data == 'yes':
bot.send_message(call.message.chat.id, 'Приятно познокомиться')
elif call.data == 'no':
bot.send_message(call.message.chat.id, 'Попробуем еще раз!')
bot.send_message(call.message.chat.id, 'Привет, Давай познакомимся! Как тебя зовут?')
bot.register_next_step_handler(call.message, reg_name)
bot.polling()
Ответы (1 шт):
Ну смотри, когда юзер что-то пишет боту, телеграм сообщает об этом собственно самому боту. Дальше бот проверяет это сообщение с помощью хендлеров, однако проверяет он их по порядку появления в коде.
То есть первый будет @bot.message_handler(commands=['start']) который проверяет не прислал ли юзер команду старт, если нет то идёт следующий хендлер @bot.message_handler(content_types=["text"]) который тебе собственно все и ломает, он принимает в себя любой ТЕКСТ то есть если бы ты отправил стикер, видео, или что нибудь что не является текстом он бы не сработал, однако ниже у тебя @bot.message_handler(func=lambda который вообще-то такой себе мусорщик, который принимает в себя всё.
Но в этом "мусорщике" у тебя идёт проверка на текст, которая в свою очередь в этот хендлер не попадет из-за хендлера выше, который в себя впитывает любой текст.
Думаю причина более менее понятная. Как это исправить?
Ну ты можешь перетащить весь код который находится под "мусорщиком" в хендлер выше который принимает в себя текст. Но я бы вообще поменял то что ты написал на вот такое.
@bot.message_handler(func=lambda message: message.text=='Рандомное число(от 1 до 10)')
def rand_num(message):
if message.chat.type == 'private':
bot.send_message(message.chat.id, 'Ваше число: ' + str(random.randint(0, 10)))
@bot.message_handler(func=lambda message: message.text=='ℹИнформация')
def info(message):
if message.chat.type == 'private':
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
item1 = types.KeyboardButton('Команды')
item2 = types.KeyboardButton('Чтото')
back = types.KeyboardButton('?Назад')
markup.add(item1, item2, back)
bot.send_message(message.chat.id, 'ℹИнформация', reply_markup=markup)
@bot.message_handler(func=lambda message: message.text=='?Назад')
def back(message):
if message.chat.type == 'private':
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
item1 = types.KeyboardButton('Рандомное число(от 1 до 10)')
item2 = types.KeyboardButton('ℹИнформация')
markup.add(item1, item2)
bot.send_message(message.chat.id, '?Назад', reply_markup=markup)
@bot.message_handler(func=lambda message: message.text=='Команды')
def back(message):
if message.chat.type == 'private':
bot.send_message(message.chat.id, '/reg - регистрация')
Уверен есть способ избавиться и от лишнего условия (тит чата), но я не уверен как это сделать правильно итак весь код с телефона писал.
И думаю буду менее понятно что я сделал, вместо того чтобы был один хендлер в котором будут тысяча ифов я сделал тысячу хендлеров для каждого сообщения которое мне нужно обрабатывать. Зачем? Потому что так удобнее. Как минимум. А ещё так ты всегда будешь понимать что вообще происходит, какой хендлер сработал, какие в нем были условия и ТД.
Ах да я не трогал тот самый "мусорщик" так как честно говоря лень. Но в целом я думаю сделать с ним тоже самое не сложно. Ну или же, как я писал ранее, ты можешь просто перетащить код в хендлер выше.