Подскажет по боту telebot. Он зависает если к нему обращается несколько пользователей.

antirock

Новичок
Пользователь
Ноя 29, 2023
4
0
1
Возможно кто подскажет по боту telebot.
Вообщем бот задает 4-5 вопросов, собирает ответы в лист, и затем делает расчеты исходя из собранных ответов. Для расчетов написан отдельный модуль. Возникает зависание бота, если им начинают пользоваться несколько пользователей одновременно,на одном из вопросов бот просто не чего не делает и все весит пока не перезапустить его в ручную. Причем бот не показываете какой ошибки. Если к боту обращается один пользователь, то все нормально отрабатывает. Бот запускаю на pycharm

строго не судите я только учусь.(а вообще я инструктор по сноуборду)


Код:
import telebot
from telebot import types
from time import sleep
import raschet


bot = telebot.TeleBot('6963474359:AAHpq9r4Tdd3mrj2AAw5cPCLI53ooouH-WM')
d = ''
answers = []


def is_number(s):
    try:
        float(s)
        return True
    except ValueError:
        return False


@bot.message_handler(commands=['start'])
def start_message(message):
    global answers
    answers.clear()
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    btn1 = types.KeyboardButton('Мужчина')
    btn2 = types.KeyboardButton('Женщина')
    markup.row(btn1, btn2)
    bot.send_message(message.chat.id, 'Привет! Я помогу подобрать тебе сноуборд. Ответь на несколько вопросов:\n\n'
                                      'Для кого вы хотите подобрать сноуборд? (Мужчины/Женщины)', reply_markup=markup)


@bot.message_handler(content_types=['text'])
def send_text(message):
    global answers
    if message.text.lower() == 'мужчина' or message.text.lower() == 'женщина':
        answers.append(message.text.lower())
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn2 = types.KeyboardButton('Новичок')
        btn3 = types.KeyboardButton('Прогрессирующий')
        markup.row(btn2)
        markup.row(btn3)
        bot.send_message(message.chat.id, 'Укажите ваш уровень владения сноубордом.', reply_markup=markup)
    elif message.text.lower() == 'новичок':
        a = telebot.types.ReplyKeyboardRemove()
        answers.append(message.text.lower())
        bot.send_message(message.chat.id, 'Укажите ваш рост в сантиметрах.\n'
                                          '(Пример: 170 или 167)', reply_markup=a)
    elif message.text.lower() == 'прогрессирующий':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('Карвинг')
        btn2 = types.KeyboardButton('Флэт фристайл')
        btn3 = types.KeyboardButton('Фрирайд')
        btn4 = types.KeyboardButton('Джиббинг')
        btn5 = types.KeyboardButton('Любитель')
        # btn6 = types.KeyboardButton('Фристайл(трамплин)')
        markup.row(btn5)
        markup.row(btn1, btn3)
        markup.row(btn2, btn4)
        # markup.row(btn6)
        answers.append(message.text.lower())
        bot.send_message(message.chat.id,
                         'Пожалуйста, выберете дисциплину для которой нужно выполнить подбор сноуборда.'
                         '\n\n'
                         'Если вы просто катаетесь по склонам выберете "Любитель"',
                         reply_markup=markup)
    elif message.text.lower() == 'фристайл(трамплин)' or message.text.lower() == 'любитель' \
            or message.text.lower() == 'карвинг' or message.text.lower() == 'флэт фристайл' \
            or message.text.lower() == 'фрирайд' or message.text.lower() == 'джиббинг':
        a = telebot.types.ReplyKeyboardRemove()
        answers[-1] = message.text.lower()
        bot.send_message(message.chat.id, 'Укажите ваш рост в сантиметрах.\n'
                                          '(Пример: 170 или 167)', reply_markup=a)

    elif message.text.isdigit() or is_number(message.text.replace(',', '.')):
        if len(answers) == 2:
            answers.append(float(message.text.replace(',', '.')))
            bot.send_message(message.chat.id, 'Укажите ваш вес в КГ\n'
                                              '(Пример: 45 или 70')
        elif len(answers) == 3:
            answers.append(float(message.text.replace(',', '.')))
            bot.send_message(message.chat.id, 'Укажите ваш размер ноги в Российском стандарте\n'
                                              ' (Пример, 42.5 или 38).')
        elif len(answers) == 4:
            answers.append(float(message.text.replace(',', '.')))
            global d
            d = raschet.raschet_nov(answers)
            markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
            #btn1 = types.KeyboardButton('Подобрать в магазине')
            btn2 = types.KeyboardButton('Выполнить новый подбор')
            #markup.row(btn1)
            markup.row(btn2)

            bot.send_message(message.chat.id, f'Вот варианты досок которые мы рекомендуем вам\n\n{d[0]}',
                             parse_mode='html', reply_markup=markup, disable_web_page_preview=True)


    elif message.text.lower() == 'подобрать в магазине':
        d = raschet.raschet_nov(answers)
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('Подобрать в магазине')
        btn2 = types.KeyboardButton('Выполнить новый подбор')
        markup.row(btn1)
        markup.row(btn2)
        bot.send_message(message.chat.id,
                         f'Подобрали вам оборудование в магазине канте\n\n{raschet.podborakaKANT(d[1])}',
                         parse_mode='html', disable_web_page_preview=True)
        bot.send_message(message.chat.id, f'NLI00104', reply_markup=markup)
    elif message.text.lower() == 'выполнить новый подбор':
        answers.clear()
        start_message(message)



    else:
        bot.send_message(message.chat.id,
                         'Вы не верно ответили на заданный вопрос.'
                         ' Внимательно его прочтите. '
                         'Вам следует выбрать из предложеных вариантов или написать ответ так как это указано'
                         ' в примере задоваемого вопроса. Или вы можете перезапустить бот. /start')
        answers.clear()



while True:
    try:
        bot.polling(none_stop=True)
    except Exception as e:
        print(f"Error: {e}")
        print("Restarting in 20 seconds...")
        sleep(20)
 

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
375
109
43
Возникает зависание бота, если им начинают пользоваться несколько пользователей одновременно
Для этого нужно сделать его асинхронным
 

antirock

Новичок
Пользователь
Ноя 29, 2023
4
0
1
Для этого нужно сделать его асинхронным
Ну то есть по сути полностью переписать код. Или это как то можно исправить?
 

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
375
109
43
Ну то есть по сути полностью переписать код. Или это как то можно исправить?
Ну переписывать вряд ли, надо сделать имеющиеся функции-обработчики (start_message, send_text) асинхронными - добавить ключевые слова async, await в соответствующем месте. Но лучше прежде чем браться за написание ботов изучить основы asyncio, посмотреть примеры использования telebot в его документации.
 
  • Мне нравится
Реакции: antirock

PYDEV

Пользователь
Пользователь
Авг 31, 2023
38
8
8
import telebot from telebot import types
Хотел спросить, это так принято сначала импортировать всю либу целиком а потом ее классы отдельно?) или я что-то не понимаю...
 

antirock

Новичок
Пользователь
Ноя 29, 2023
4
0
1
Хотел спросить, это так принято сначала импортировать всю либу целиком а потом ее классы отдельно?) или я что-то не понимаю...
Я художник, я так вижу.
 

antirock

Новичок
Пользователь
Ноя 29, 2023
4
0
1
Ну переписывать вряд ли, надо сделать имеющиеся функции-обработчики (start_message, send_text) асинхронными - добавить ключевые слова async, await в соответствующем месте. Но лучше прежде чем браться за написание ботов изучить основы asyncio, посмотреть примеры использования telebot в его документации.
В итоге нужно переписывать, так как нужно делать через айограмм.
 

Форум IT Специалистов