Как сделать так, чтобы в Telegram боте при запросе выдавалось несколько ответов?

Ребята, привет!

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

Для этого я использовала random. В двух вопросах нужно, чтобы бот вывел несколько ответов одной строкой, но он продолжает выдавать один ответ.

Код прилагаю:

import random
import telebot
from telebot import types

bot = telebot.TeleBot(token = 'TOKEN')

answers1 = ['Australia', 'Azerbaijan', 'Croatia', 'Cyprus', 'Finland', 'Iceland', 'Ireland', 'Lithuania', 'Luxembourg',
            'Moldova', 'Poland', 'Portugal', 'Serbia', 'Slovenia', 'Ukraine']
answers2 = ['Albania', 'Armenia', 'Austria', 'Belgium', 'Czechia', 'Denmark', 'Estonia', 'Georgia',
            'Greece', 'Israel', 'Latvia', 'Malta', 'The Nethrelands', 'Norway', 'San Marino', 'Switzerland']
answers3 = ['France', 'Germany', 'Italy', 'Spain', 'Sweden', 'United Kingdom']
answers4 = ['Azerbaijan', 'Croatia', 'Czech Republic', 'Finland', 'Ireland', 'Israel', 'Latvia', 'Malta',
            'Moldova', 'The Netherlands', 'Norway', 'Portugal', 'Serbia', 'Sweden', 'Switzerland', 'Albania', 'Armenia',
            'Australia', 'Austria', 'Belgium', 'Cyprus', 'Denmark', 'Estonia', 'Georgia',
            'Greece', 'Iceland', 'Lithuania', 'Poland', 'Luxembourg', 'San Marino', 'Slovenia', 'France', 'Germany',
            'Italy', 'Spain', 'Ukraine', 'United Kingdom']
answers5 = ['Sweden', 'Norway', 'Finland', 'Denmark', 'Iceland']
answers6 = ['Lithuania', 'Estonia', 'Latvia']

@bot.message_handler(content_types = ['text'])
def get_text_messages(message):
    if message.text == 'Hello':
        bot.send_message(message.from_user.id, "Привет, {0.first_name}! \n Я могу предсказать результаты Евровидения 2024.".format(message.from_user))
        keyboard = types.InlineKeyboardMarkup()
        key_1 = types.InlineKeyboardButton(text='1.The qualifiers from semifinal 1 will be', callback_data='answer1')
        keyboard.add(key_1)
        key_2 = types.InlineKeyboardButton(text='2.The qualifiers from semifinal 2 will be', callback_data='answer2')
        keyboard.add(key_2)
        key_3 = types.InlineKeyboardButton(text='3.The best country from Big 5 will be', callback_data='answer3')
        keyboard.add(key_3)
        key_4 = types.InlineKeyboardButton(text='4.Who will win the Eurovision Song Contest 2024?', callback_data='answer4')
        keyboard.add(key_4)
        key_5 = types.InlineKeyboardButton(text='5.The last place will be', callback_data='answer5')
        keyboard.add(key_5)
        key_6 = types.InlineKeyboardButton(text='6.Which Nordic country gets the best result?', callback_data='answer6')
        keyboard.add(key_6)
        key_7 = types.InlineKeyboardButton(text='7.Which Baltic country gets the best result?', callback_data='answer7')
        keyboard.add(key_7)
        bot.send_message(message.from_user.id, text='Выбери что хочешь узнать: ', reply_markup=keyboard)
    elif message.text == "/help":
        bot.send_message(message.from_user.id, "Напиши Привет")
    else:
        bot.send_message(message.from_user.id, "Я тебя не понимаю. Напиши /help.")

@bot.callback_query_handler(func=lambda call: True)
def callback_worker(call):
    if call.data == 'answer1':
        msg1 = 'The qualifiers from semifinal 1 are: ' + list(*random.sample(answers1, 10))
        bot.send_message(call.message.chat.id, msg1)
    elif call.data == 'answer2':
        msg2 = 'The qualifiers from semifinal 2 are: ' + list(*random.sample(answers2, 10))
        bot.send_message(call.message.chat.id, msg2)
    elif call.data == 'answer3':
        msg3 = 'The best country from Big 5 will be: ' + str(*random.sample(answers3, 1))
        bot.send_message(call.message.chat.id, msg3)
    elif call.data == 'answer4':
        msg4 = 'Who will win the Eurovision Song Contest 2024? '+ str(*random.sample(answers4, 1))
        bot.send_message(call.message.chat.id, msg4)
    elif call.data == 'answer5':
        msg5 = 'The last place will be: ' + str(*random.sample(answers4, 1))
        bot.send_message(call.message.chat.id, msg5)
    elif call.data == 'answer6':
        msg6 = 'Which Nordic country gets the best result? ' + str(*random.sample(answers5, 1))
        bot.send_message(call.message.chat.id, msg6)
    elif call.data == 'answer7':
        msg7 = 'Which Baltic country gets the best result? ' + str(*random.sample(answers6, 1))
        bot.send_message(call.message.chat.id, msg7)

bot.polling(none_stop=True, interval=0)

Изначально я создала несколько ответов в виде списков answers1, answers2 и тд. Для получения ответа я использовала random.sample.

В обычном коде в pycharm выводится несколько ответов при random.sample(answers1, 10). В коде для телегамм бота упорно выводится только один ответ.

Тогда я сделала так: там, где мне нужен один ответ я написала str(*random.sample(answers3, 1)), а где мне нужно было несколько ответов написала list(*random.sample(answers2, 10)). Теперь же у меня при выборе вопроса с несколькими ответами выходит ошибка:

TypeError: list expected at most 1 argument, got 10.

Гуглила, как можно решить эту проблему, но не совсем разобралась, как сделать так, что бы принимались 10 аргументов.

Подскажите, пожалуйста, нужно ли мне как-то решить эту ошибку или есть другой вариант, чтобы бот отображал несколько ответов?


Ответы (1 шт):

Автор решения: Amgarak

random.sample(answers1, 10) возвращает список:

['Croatia', 'Lithuania', 'Portugal', 'Luxembourg', 'Australia', 'Serbia', 'Slovenia', 'Cyprus', 'Moldova', 'Ukraine']

Для объединения элементов итерируемого объекта (списка в нашем случае) в одну строку, можно воспользоваться функцией join()

' '.join(random.sample(answers1, 10)) -> Australia Azerbaijan Lithuania Slovenia Ukraine Luxembourg Poland Portugal Ireland Serbia

print(type(' '.join(random.sample(answers1, 10)))) -> <class 'str'>

На вашем примере:

@bot.callback_query_handler(func=lambda call: True)
def callback_worker(call):
    if call.data == 'answer1':
        msg1 = 'The qualifiers from semifinal 1 are: ' + ' '.join(random.sample(answers1, 10))
        bot.send_message(call.message.chat.id, msg1)
    elif call.data == 'answer2':
        msg2 = 'The qualifiers from semifinal 2 are: ' + ' '.join(random.sample(answers2, 10))
        bot.send_message(call.message.chat.id, msg2)
    elif call.data == 'answer3':
        msg3 = 'The best country from Big 5 will be: ' + ' '.join(random.sample(answers3, 1))
        bot.send_message(call.message.chat.id, msg3)
    elif call.data == 'answer4':
        msg4 = 'Who will win the Eurovision Song Contest 2024? '+ ' '.join(random.sample(answers4, 1))
        bot.send_message(call.message.chat.id, msg4)
    elif call.data == 'answer5':
        msg5 = 'The last place will be: ' + ' '.join(random.sample(answers4, 1))
        bot.send_message(call.message.chat.id, msg5)
    elif call.data == 'answer6':
        msg6 = 'Which Nordic country gets the best result? ' + ' '.join(random.sample(answers5, 1))
        bot.send_message(call.message.chat.id, msg6)
    elif call.data == 'answer7':
        msg7 = 'Which Baltic country gets the best result? ' + ' '.join(random.sample(answers6, 1))
        bot.send_message(call.message.chat.id, msg7)
→ Ссылка