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