Похоже, я не могу найти способ заставить моего бота Telegram ждать ввода данных пользователем

#python #telegram #genius-api

#python #telegram #genius-api

Вопрос:

Я пытаюсь создать telegram-бота, который получает тексты песен из genius API. Когда бот запрашивает исполнителя, он сразу же отправляет вопрос о названии песни, но я пытаюсь заставить бота работать как команда input() в python.

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

Вот код, о котором я говорю.

 def lyrics(update: Update, context: CallbackContext) -> None:
    update.message.reply_text("Enter artist")
    artist_name = update.message.text
    artist = genius.search_artist(artist_name, max_songs=0)
    update.message.reply_text("Enter song title")
    song_name = update.message.text
    song = artist.song(song_name)
    update.message.reply_text(song.lyrics)
 

И пример без текста песни

 update.message.reply_text("Reply something")
reply = update.message.text
update.message.reply_text("2nd answer")
reply2 = update.message.text
 

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

1. Я не понимаю, о чем вы говорите. Ваш код, похоже, выполняет всю работу, которую вы просите. после того как пользователь отправит имя исполнителя, вы отправите список песен исполнителя и так далее. чего не хватает?

Ответ №1:

Возможно, вы ищете ConversationHandler , который может обрабатывать разговоры.

Подготовка

Для начала нам нужно импортировать следующие модули и определить Dispatcher , который принимает все обработчики для вашего бота.

 from telegram import Update
from telegram.ext import (
    Updater,
    Filters,
    CommandHandler,
    MessageHandler,
    ConversationHandler,
    CallbackContext
)

updater = Updater('your token here', use_context=True)

dispatcher = updater.dispatcher
 

Обработчик разговоров

Затем мы прикрепляем обработчик разговора к диспетчеру с dispatcher.add_handler помощью . Вы можете указать состояния, подобные приведенным ниже, и определить обработчик беседы.

Обратите внимание, что состояния должны быть int , для удобства чтения, мы определяем константы ARTIST и TITLE для разных состояний.

Для получения дополнительной информации о фильтрах ознакомьтесь с документацией здесь . Нам нужно только Filters.text здесь, поскольку мы принимаем только тексты в качестве входных данных для MessageHandler .

 ARTIST, TITLE = 0, 1
dispatcher.add_handler(ConversationHandler(
    entry_points=[CommandHandler('start', intro)],
    states={
        ARTIST: [MessageHandler(Filters.text, callback=artist)],
        TITLE: [MessageHandler(Filters.text, callback=title)]
    },
    fallbacks=[CommandHandler('quit', quit)]
))
 

Обработчики для обработчика ConversationHandler

Разговор начинается с entry_points разных состояний и продолжается с разными состояниями. Для каждого из них требуется обработчик. Например, мы определяем CommandHandler вызываемый intro entry_points , который вызывается, когда пользователь вводит команду /start .

 def intro(update: Update, context: CallbackContext) -> int:
    update.message.reply_text('Enter artist')
    # Specify the succeeding state to enter
    return ARTIST
 

Другие обработчики artist title также просты и просты. Например:

 def artist(update: Update, context: CallbackContext) -> int:
    artist_name = update.message.text
    # This variable needs to be stored globally to be retrieved in the next state
    artist = genius.search_artist(artist_name, max_songs=0)
    update.message.reply_text('Enter song title')
    # Let the conversation proceed to the next state
    return TITLE
 
 def title(update: Update, context: CallbackContext) -> int:
    song_name = update.message.text
    song = artist.song(song_name)
    update.message.reply_text(song.lyrics)
    # return ConversationHandler.END to end the conversation
    return ConversationHandler.END
 

Кроме того, разговору нужен запасной обработчик. В примере кода мы определяем простую функцию quit для завершения диалога, когда пользователь вводит команду /quit .

 def quit(update: Update, context: CallbackContext):
    return ConversationHandler.END
 

Примечания

Преимущество использования ConversationHandler заключается в том, что вы можете добавлять любые новые состояния в любое время, чтобы задать дополнительные вопросы. ConversationHandler также упрощает фильтрацию сообщений.

Вы также можете взглянуть на пример разговорного бота здесь, который использует ConversationHandler .