#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)