Почему не работает функция в PyCharm для Телеграмм бота?

Рейтинг: 0Ответов: 1Опубликовано: 31.05.2023

Мне надо, чтобы когда пользователь нажимал на 'номер' он мог текстом ввести номер машины, а бот выводил название машины. Помогите пожалуйста!

import telebot
from telebot import types

bot = telebot.TeleBot('Токен')


@bot.message_handler(commands=['start'])
def start(message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    btn1 = types.KeyboardButton("Поздороваться")
    markup.add(btn1)
    bot.send_message(message.from_user.id, "Привет! Я твой бот-помошник!", reply_markup=markup)  
# Тут я думаю всё понятно


@bot.message_handler(content_types=['text'])
def get_text_messages(message):
    if message.text == 'Поздороваться':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('Номер')
        btn2 = types.KeyboardButton('Название')
        btn3 = types.KeyboardButton('Все машины')
        markup.add(btn1, btn2, btn3)
        bot.send_message(message.from_user.id, 'Я помогу вам найти досье о машине.', reply_markup=markup)
        bot.send_message(message.from_user.id, 'Какую информацию о машине вы знаете?', reply_markup=markup)

    elif message.text == 'Номер':
        bot.send_message(message.from_user.id, 'Введите гос номер авто', parse_mode='Markdown')
# Следующая функция почему-то игнорируется ботом

        @bot.message_handler(content_types=['text'])
        def get_text_messag(messags):

            a = messags.lower()
            if a == 'нффф' or a == '294':
                bot.send_message(messags.from_user.id, '7 серебро', parse_mode='Markdown')
                bot.send_message(messags.from_user.id, 'нффф', parse_mode='Markdown')
                bot.send_message(messags.from_user.id, 'Текст', parse_mode='Markdown')

            elif a == 'аффф' or a == '213':
                bot.send_message(messags.from_user.id, '14 серебро', parse_mode='Markdown')
                bot.send_message(messags.from_user.id, 'аффф', parse_mode='Markdown')
                bot.send_message(messags.from_user.id, 'Текст', parse_mode='Markdown')
# А дальше всё работает

    elif message.text == 'Название':
        bot.send_message(message.from_user.id, 'Введите название машины', parse_mode='Markdown')

    elif message.text == 'Все машины':
        bot.send_message(message.from_user.id, 'Здесь вы можете увидеть перечинь машин', parse_mode='Markdown')


bot.polling(none_stop=True, interval=0)

Ответы

▲ 2Принят

Pycharm не имеет отношения к вопросу, это IDE, а не язык программирования.

В остальном, проблема в определениях функции; вы объявляете одну функцию внутри другой.

Попробуйте так:

import telebot
from telebot import types

bot = telebot.TeleBot('TOKEN')

@bot.message_handler(commands=['start'])
def start(message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    btn1 = types.KeyboardButton("Поздороваться")
    markup.add(btn1)
    bot.send_message(message.from_user.id, "Привет! Я твой бот-помощник!", reply_markup=markup)


@bot.message_handler(content_types=['text'])
def get_text_messages(message):
    if message.text == 'Поздороваться':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('Номер')
        btn2 = types.KeyboardButton('Название')
        btn3 = types.KeyboardButton('Все машины')
        markup.add(btn1, btn2, btn3)
        bot.send_message(message.from_user.id, 'Я помогу вам найти досье о машине.', reply_markup=markup)
        bot.send_message(message.from_user.id, 'Какую информацию о машине вы знаете?', reply_markup=markup)

    elif message.text == 'Номер':
        bot.send_message(message.from_user.id, 'Введите гос номер авто', parse_mode='Markdown')
        bot.register_next_step_handler(message, handle_car_number_input)

    elif message.text == 'Название':
        bot.send_message(message.from_user.id, 'Введите название машины', parse_mode='Markdown')
        bot.register_next_step_handler(message, handle_car_name_input)

    elif message.text == 'Все машины':
        bot.send_message(message.from_user.id, 'Здесь вы можете увидеть перечень машин', parse_mode='Markdown')

def handle_car_number_input(message):
    car_number = message.text
    if car_number == 'нффф' or car_number == '294':
        bot.send_message(message.from_user.id, '7 серебро', parse_mode='Markdown')
        bot.send_message(message.from_user.id, 'нффф', parse_mode='Markdown')
        bot.send_message(message.from_user.id, 'Текст', parse_mode='Markdown')

    elif car_number == 'аффф' or car_number == '213':
        bot.send_message(message.from_user.id, '14 серебро', parse_mode='Markdown')
        bot.send_message(message.from_user.id, 'аффф', parse_mode='Markdown')
        bot.send_message(message.from_user.id, 'Текст', parse_mode='Markdown')

def handle_car_name_input(message):
    car_name = message.text
    if message.text == 'Название':
        bot.send_message(message.from_user.id, 'Введите название машины', parse_mode='Markdown')

#### здесь нужно дописать проверку по названию машины, аналогично с предыдущей функцией с номерами машин

def handle_car_name_input(message):
    all_car = message.text
    if message.text == 'Все машины':
        bot.send_message(message.from_user.id, 'Здесь вы можете увидеть перечень машин', parse_mode='Markdown')
#### здесь можете написать логику вывода всех машин. Можете в список все занести и оттуда прогонять, вместо бесконечных if/elif и сделать для всех функции.

bot.polling(none_stop=True, interval=0)

Я бы рекомендовал вместо if/elif проверять по заданному списку элементы на совпадение и дальше уже создать логику вывода информации. А ещё лучше, если подключите SQL базу данных и через запросы будете работать.