Ответы пользователя по тегу Python
  • Не срабатывает callback у inline keyboard в telegram боте. В чем может быть причина?

    @AndrewPythonBuilder
    Новичок Питонист
    Замените:
    update.message.reply_text('Please choose:', reply_markup=reply_markup)

    На:
    bot.send_message(update.message.chat.id,'Please choose:', reply_markup=reply_markup)

    И если вы хотите, чтобы отвечало, замените функцию button на:
    def button(bot, update):
        query = update.callback_query
    
        # query.edit_message_text(text="Selected option: {}".format(query.data))
    
        print(query)
    
        bot.send_message(query.message.chat_id, str(query.data))
    Ответ написан
    Комментировать
  • Как сделать последовательное появление кнопок python-telegram-bot?

    @AndrewPythonBuilder
    Новичок Питонист
    Доброго времени суток!
    Предыстория.
    Мне недавно дали задание сделать бота опросника. Я понятия не имел, как его сделать, единственное, что я умел на тот момент - пользоваться бд и создавать обычные кнопки. Поэтому и придумал такой немного кривой способ:
    1) создаем строку, в которой будет содержаться весь путь наших вопросов и ответов на них, разделяя такими знаками, которые никогда(возможно) не встретятся у вас в сообщениях. Например есть у вас вопрос "Сколько вам лет?" и предполагаемые ответы: "2", "10", "22".
    И мы записываем их в строку <<Сколько вам лет?№№№№2$$$10$$$22^^^^^>>
    Знаками '^^^^^' мы отделяем вопросы.
    Знаками '№№№№' отделяем вопрос от предполагаемых ответов и '$$$' разделяет предполагаемые ответы
    2) Логично, что при создании вопроса мы сплитуем эту строку, и callback_data присваиваем номер вопроса. Чтобы ориентироваться по нашей строке.

    Вот код создание вопроса:
    elif message.text == 'Опрос':
            opros = True
            bot.send_message(message.chat.id, 'Напишите текст опроса')
    elif opros == True:
            opros  = False
            text = message.text
            bot.send_message(message.chat.id, 'Все ответы через $$$')
            opros1 = True
    elif opros1 == True:
                opros1 = False
                answers = message.text.split('$$$')
                bottons = []
                for i in range(len(answers)):
                    botton = [InlineKeyboardButton(answers[i], callback_data='sale+' + answers[i])] 
                    bottons.append(botton)
                reply_markup = InlineKeyboardMarkup(bottons)
                bot.send_message(message.chat.id, text=text, reply_markup=reply_markup)
                base_w.save(text + '№№№№' + message.text + '^^^^') #сохраняем в бд
                message.text = 'Опрос'
                answer_questions(bot, update) #запускаем заново

    Это код инициализации опроса:
    elif message.text == 'Инициализация':
            l = base_w.upload() #достаем из бд нашу строку
            te = l.split('^^^^')
            I = 0 # создаем счетчик
            u = te[I].split('№№№№') #делим вопрос и ответы
            text = u[0]
            answers = u[-1].split('$$$')
            bottons = []
            for i in range(len(answers)):
                botton = [InlineKeyboardButton(answers[i], callback_data=str(I) + '+' + answers[i])] # важная часть, где мы callback_data присваиваем номер вопроса
                bottons.append(botton)
            reply_markup = InlineKeyboardMarkup(bottons)
            bot.send_message(message.chat.id, text=text, reply_markup=reply_markup)


    И функция обработчика:
    def button(bot, update):
        I = int(str((query.data).split('+')[0])) + 1 #увеличиваем счетчик
        l = base_w.upload()
        te = l[-2].split('^^^^')
        # и повторяем...


    Если что-то не понятно, или просто код нужно будет скинуть, напиши в telegram @andrew_2046
    Удачи!
    Ответ написан
    Комментировать