Ответы пользователя по тегу Telegram
  • Конечный автомат, в чем ошибка?

    Ranc58
    @Ranc58
    Backend python developer
    Вы не обяъвили STATE_DICT )

    В Вашем случае :
    import config
    import telebot
    
    bot = telebot.TeleBot(config.token)
    STATE_DICT = {}


    Во вторых не надо везде хендлить. Для этого вам и нужен конечный автомат - он отслеживает состояние и сам перекидывает на нужную функцию.

    Ниже полный пример. Должен работать(не уверен так как писал на память, но логика верная)

    import config
    import telebot
    from telebot import types
    
    bot = telebot.TeleBot(config.token)
    STATE_DICT = {}
    
    
    @bot.message_handler(commands=['start'])
    def start(message):
        markup = types.ReplyKeyboardMarkup(
            one_time_keyboard=False,
            resize_keyboard=True
        )
        markup.add('Кнопка1')
        markup.add('Кнопка2')
        question = 'Выбери'
        chat_id = message.chat.id
        STATE_DICT[chat_id] = 'START'
        bot.send_message(chat_id, question, reply_markup=markup)
    
    
    def start_work(message):
        chat_id = message.chat.id
        markup = types.ReplyKeyboardMarkup(
            one_time_keyboard=False,
            resize_keyboard=True
        )
        if message.text == 'Кнопка1':
            STATE_DICT[chat_id] = 'VAR1'
            markup.add('Кнопка3')
            markup.add('Кнопка4')
            bot.send_message(chat_id, 'Вы выбрали ответ 1', reply_markup=markup)
        else:
            STATE_DICT[chat_id] = 'VAR2'
            markup.add('Кнопка5')
            markup.add('Кнопка6')
            bot.send_message(chat_id, 'Вы выбрали ответ 2', reply_markup=markup)
    
    
    def var1(message):
        chat_id = message.chat.id
        if message.text == 'Кнопка3':
            bot.send_message(chat_id, 'Конец с кнопкой3')
        else:
            STATE_DICT[chat_id] = 'VAR2'
            bot.send_message(chat_id, 'Конец с кнопкой2')
    
    
    def var2(message):
        chat_id = message.chat.id
        if message.text == 'Кнопка5':
            bot.send_message(chat_id, 'Конец с кнопкой5')
        else:
            STATE_DICT[chat_id] = 'VAR2'
            bot.send_message(chat_id, 'Конец с кнопкой6')
    
    
    @bot.message_handler(func=lambda message: True)
    def start_finite_machine(message):
        states = {
            'START': start_work,
            'VAR1':  var1,
            'VAR2':  var2,
        }
        chat_id = message.chat.id
        states[STATE_DICT[chat_id]](message)
    
    
    if __name__ == '__main__':
      bot.polling(none_stop=True)
    Ответ написан
    1 комментарий
  • Почему зависает бот при отправке сообщения в подменю telegram?

    Ranc58
    @Ranc58
    Backend python developer
    По поводу вопроса 2:
    Реализуйте конечный автомат и отслеживайте состояние.
    Совсем упрощенный пример:
    @bot.message_handler(func=lambda message: True)
    def start_finite_machine(message):
        if STATE_DICT[chat_id] == 'position_1':
            position_1(message)
        elif STATE_DICT[chat_id] == 'position_2':
             position_2(message)
        elif STATE_DICT[chat_id] == 'position_3':
            position_3(message)
    Ответ написан
    1 комментарий
  • Бот повторно отправляет сообщение?

    Ranc58
    @Ranc58
    Backend python developer
    Была аналогичная проблема, бот на питоне. Искал в свое время решение и не смог ничего толкового найти. Добавил перед отправкой сообщения del msg и вроде перестало.
    Ответ написан
  • Telegram bot. Как реализовать параллельное выполнение задач?

    Ranc58
    @Ranc58
    Backend python developer
    Реализовывал подобное таким способом:
    В базе хранятся нужные значения, раз в минуту(например) в celery запускается таск, который ищет в БД ID людей, которым бот должен выслать некое уведомление. Если таковые имеются - то по API передается боту список этих ID, и бот устраивает рассылку.
    Сам бот реализован был по такой схеме:
    https://github.com/eternnoir/pyTelegramBotAPI/blob...
    Просто добавил еще одну ручку, которая принимает POST запрос со списком ID пользователей.
    Ответ написан
    Комментировать
  • Как сделать корректным вывод при нажатии кнопки в телеграм боте на Python?

    Ranc58
    @Ranc58
    Backend python developer
    Я бы сделал например конечный автомат для отслеживания состояния, и уже исходя из него вызывал бы нужный обработчик сообщений пользователя.

    Если совсем-cовсем упрощенно:
    @bot.message_handler(func=lambda message: True)
    def start_finite_machine(message):
        if STATE_DICT[chat_id] == 'tomsk_supplies':
            handle_tomsk_suplies(message)
        elif STATE_DICT[chat_id] == 'novosibirsk_supplies':
             handle_novosibirsk_supplies(message)
        elif STATE_DICT[chat_id] == 'novosibirsk_roses':
            handle_novosibirsk_roses(message)


    и в каждой функции менять этот `STATE_DICT`. Например:
    def  handle_novosibirsk_supplies(message):
        user_markup = telebot.types.ReplyKeyboardMarkup(True)
        user_markup.row('Цветы2')
        user_markup.row('Главное меню')
        chat_id = message.chat.id
        STATE_DICT[chat_id] = 'novosibirsk_roses'
        bot.send_message(message.from_user.id, 'Город: <b>Новосибирск</b> \n\nВыберите товар:',
                                 reply_markup=user_markup, parse_mode='html')
    Ответ написан
    Комментировать
  • Как написать Telegram бота без Bot API?

    Ranc58
    @Ranc58
    Backend python developer
    https://github.com/LonamiWebs/Telethon
    Как вариант. Использует telegram api for developers
    Ответ написан
    Комментировать