Как я могу ввести () с помощью TeleBot?

#python #python-3.x #bots #telegram-bot #python-telegram-bot

#python #python-3.x #боты #telegram-бот #python-telegram-бот

Вопрос:

Мне было интересно, могу ли я создать input() зависимость с помощью TeleBot.

например, консольный способ:

 POL = float(input("Enter your POL: ))
  

Есть ли способ сделать это с помощью Telebot, например:

 bot.send_message(message.chat.id, "Enter your POL")
## Get message.text into POL variable. 
  

Ответ №1:

Насколько я понимаю, прямого способа сделать это не существует, но вы можете посмотреть сообщение, на которое пользователь ответил с

 replied_message = message.reply_to_message.message_id
  

Если он соответствует идентификатору отправленного вами сообщения, то это будет ответ на ваше сообщение. Вы можете получить идентификатор вашего отправленного сообщения из

 sent_message = bot.send_message(message.chat.id, "Enter your POL")
sent_message_id = sent_message.message_id
  

Комментарии:

1. не могли бы вы, пожалуйста, подробнее описать это?

2. Да, конечно. Когда пользователь отвечает на сообщение, объект message, который передается в качестве аргумента в функцию обработчика сообщений, будет сохранять идентификатор сообщения, на которое он ответил, так что вы можете использовать это для отслеживания сообщения, на которое ответил пользователь. Другой способ обойти это — просто сохранить запись последнего сообщения, которое вы отправили пользователю, и сопоставить следующий ответ пользователя, в этом случае пользователю не нужно отвечать на какое-либо сообщение, которое может быть похоже на input ()

3. Таким образом, вы могли бы создать обработчик сообщений, просто просматривающий сообщение с атрибутом reply_to_message.message_id, который совпадает с вашим sent_message_id, или тот, который просто перехватывает следующее сообщение после вашего сообщения «Введите свой POL», чтобы перехватить ввод от пользователя

Ответ №2:

 import telebot


TELEGRAM_TOKEN = '<TOKEN>'

bot = telebot.TeleBot(TELEGRAM_TOKEN)
user_register_dict = {}

@bot.message_handler(commands=['start'])
def start(message):
    bot.reply_to(message , 'now send your name')
    user_register_dict[message.chat.id] = {}
    bot.register_next_step_handler(message , start_step2)

def start_step2(message):
    user_register_dict[message.chat.id]['name'] = message.text
    bot.reply_to(message , 'now send your age')
    bot.register_next_step_handler(message , start_step3)

def start_step3(message):
    user_register_dict[message.chat.id]['age'] = message.text
    bot.reply_to(message , 'your name is {} and you are {} years old!'
    .format(user_register_dict[message.chat.id]['name'] , 
    [message.chat.id]['age'] ))

    start(message = message)
  

Создайте dict для обработки данных, что важно, потому что если вы используете lists (например.), возможно, 2 человека начнут регистрироваться одновременно, и данные будут сброшены!

Разница между create bot.register_next_step_handler (например, строка 13) с подключением напрямую, например, start(message = message) в конечной строке, заключается в том, что register_next_step_handler бот ожидает нового сообщения и при получении помещает его в сообщение и запускает дезертирство, но при прямом запуске дезертирства бот не ждет сообщения пользователя и начинает дезертирство с текущего сообщения start(message = message)