Добавляем кнопки
Чтобы пользователям нашего бота было удобно, покажем им сразу все знаки зодиака в виде кнопок. А потом сделаем так, что когда на них нажимаешь — появляется гороскоп для этого знака на сегодня.
Добавляем код с кнопками в раздел, который реагирует на «Привет»:
# Готовим кнопки
keyboard = types.InlineKeyboardMarkup()
# По очереди готовим текст и обработчик для каждого знака зодиака
key_oven = types.InlineKeyboardButton(text='Овен', callback_data='zodiac')
# И добавляем кнопку на экран
keyboard.add(key_oven)
key_telec = types.InlineKeyboardButton(text='Телец', callback_data='zodiac')
keyboard.add(key_telec)
key_bliznecy = types.InlineKeyboardButton(text='Близнецы', callback_data='zodiac')
keyboard.add(key_bliznecy)
key_rak = types.InlineKeyboardButton(text='Рак', callback_data='zodiac')
keyboard.add(key_rak)
key_lev = types.InlineKeyboardButton(text='Лев', callback_data='zodiac')
keyboard.add(key_lev)
key_deva = types.InlineKeyboardButton(text='Дева', callback_data='zodiac')
keyboard.add(key_deva)
key_vesy = types.InlineKeyboardButton(text='Весы', callback_data='zodiac')
keyboard.add(key_vesy)
key_scorpion = types.InlineKeyboardButton(text='Скорпион', callback_data='zodiac')
keyboard.add(key_scorpion)
key_strelec = types.InlineKeyboardButton(text='Стрелец', callback_data='zodiac')
keyboard.add(key_strelec)
key_kozerog = types.InlineKeyboardButton(text='Козерог', callback_data='zodiac')
keyboard.add(key_kozerog)
key_vodoley = types.InlineKeyboardButton(text='Водолей', callback_data='zodiac')
keyboard.add(key_vodoley)
key_ryby = types.InlineKeyboardButton(text='Рыбы', callback_data='zodiac')
keyboard.add(key_ryby)
# Показываем все кнопки сразу и пишем сообщение о выборе
bot.send_message(message.from_user.id, text='Выбери свой знак зодиака', reply_markup=keyboard)
Кнопки есть, но пока не работают. Сейчас исправим.
Добавляем обработчик кнопок
Скорее всего, вы заметили, что в каждой кнопке у нас написано callback_data='zodiac'. Это значит, что при нажатии на любую кнопку у нас будет вызываться один и тот же метод, который отвечает за гороскоп. Если вы хотите сделать честный гороскоп, придётся в каждой кнопке прописать своё название обработчика, а потом задать его поведение, тоже для каждой кнопки.
Давайте сделаем обработчик кнопок, который будет реагировать на 'zodiac' и выдавать случайный текст, как в исходной программе. Для этого добавим новый метод в программу:
# Обработчик нажатий на кнопки
@bot.callback_query_handler(func=lambda call: True)
def callback_worker(call):
# Если нажали на одну из 12 кнопок — выводим гороскоп
if call.data == "zodiac":
# Формируем гороскоп
msg = random.choice(first) + ' ' + random.choice(second) + ' ' + random.choice(second_add) + ' ' + random.choice(third)
# Отправляем текст в Телеграм
bot.send_message(call.message.chat.id, msg)
Нажимаем на кнопку — получаем текст гороскопа.
Убираем лишнее
Теперь у нас есть готовый бот, и нам осталось только убрать лишний код, который раньше отвечал за вывод знаков зодиака в консоли. После чистки получаем готовую программу:
# Подключаем модуль случайных чисел
import random
# Подключаем модуль для Телеграма
import telebot
# Указываем токен
bot = telebot.TeleBot('токен')
# Импортируем типы из модуля, чтобы создавать кнопки
from telebot import types
# Заготовки для трёх предложений
first = ["Сегодня — идеальный день для новых начинаний.","Оптимальный день для того, чтобы решиться на смелый поступок!","Будьте осторожны, сегодня звёзды могут повлиять на ваше финансовое состояние.","Лучшее время для того, чтобы начать новые отношения или разобраться со старыми.","Плодотворный день для того, чтобы разобраться с накопившимися делами."]
second = ["Но помните, что даже в этом случае нужно не забывать про","Если поедете за город, заранее подумайте про","Те, кто сегодня нацелен выполнить множество дел, должны помнить про","Если у вас упадок сил, обратите внимание на","Помните, что мысли материальны, а значит вам в течение дня нужно постоянно думать про"]
second_add = ["отношения с друзьями и близкими.","работу и деловые вопросы, которые могут так некстати помешать планам.","себя и своё здоровье, иначе к вечеру возможен полный раздрай.","бытовые вопросы — особенно те, которые вы не доделали вчера.","отдых, чтобы не превратить себя в загнанную лошадь в конце месяца."]
third = ["Злые языки могут говорить вам обратное, но сегодня их слушать не нужно.","Знайте, что успех благоволит только настойчивым, поэтому посвятите этот день воспитанию духа.","Даже если вы не сможете уменьшить влияние ретроградного Меркурия, то хотя бы доведите дела до конца.","Не нужно бояться одиноких встреч — сегодня то самое время, когда они значат многое.","Если встретите незнакомца на пути — проявите участие, и тогда эта встреча посулит вам приятные хлопоты."]
# Метод, который получает сообщения и обрабатывает их
@bot.message_handler(content_types=['text'])
def get_text_messages(message):
# Если написали «Привет»
if message.text == "Привет":
# Пишем приветствие
bot.send_message(message.from_user.id, "Привет, сейчас я расскажу тебе гороскоп на сегодня.")
# Готовим кнопки
keyboard = types.InlineKeyboardMarkup()
# По очереди готовим текст и обработчик для каждого знака зодиака
key_oven = types.InlineKeyboardButton(text='Овен', callback_data='zodiac')
# И добавляем кнопку на экран
keyboard.add(key_oven)
key_telec = types.InlineKeyboardButton(text='Телец', callback_data='zodiac')
keyboard.add(key_telec)
key_bliznecy = types.InlineKeyboardButton(text='Близнецы', callback_data='zodiac')
keyboard.add(key_bliznecy)
key_rak = types.InlineKeyboardButton(text='Рак', callback_data='zodiac')
keyboard.add(key_rak)
key_lev = types.InlineKeyboardButton(text='Лев', callback_data='zodiac')
keyboard.add(key_lev)
key_deva = types.InlineKeyboardButton(text='Дева', callback_data='zodiac')
keyboard.add(key_deva)
key_vesy = types.InlineKeyboardButton(text='Весы', callback_data='zodiac')
keyboard.add(key_vesy)
key_scorpion = types.InlineKeyboardButton(text='Скорпион', callback_data='zodiac')
keyboard.add(key_scorpion)
key_strelec = types.InlineKeyboardButton(text='Стрелец', callback_data='zodiac')
keyboard.add(key_strelec)
key_kozerog = types.InlineKeyboardButton(text='Козерог', callback_data='zodiac')
keyboard.add(key_kozerog)
key_vodoley = types.InlineKeyboardButton(text='Водолей', callback_data='zodiac')
keyboard.add(key_vodoley)
key_ryby = types.InlineKeyboardButton(text='Рыбы', callback_data='zodiac')
keyboard.add(key_ryby)
# Показываем все кнопки сразу и пишем сообщение о выборе
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):
# Если нажали на одну из 12 кнопок — выводим гороскоп
if call.data == "zodiac":
# Формируем гороскоп
msg = random.choice(first) + ' ' + random.choice(second) + ' ' + random.choice(second_add) + ' ' + random.choice(third)
# Отправляем текст в Телеграм
bot.send_message(call.message.chat.id, msg)
# Запускаем постоянный опрос бота в Телеграме
bot.polling(none_stop=True, interval=0)
Как видно, большую часть кода занимает тупое перечисление всех знаков зодиака. Мы могли бы автоматизировать это через циклы, но на улице такая хорошая погода, что мы это отложим.
Что дальше
Впереди — безграничные возможности:
можно сделать индивидуальный гороскоп для каждого знака;
научить бота новым командам;
присылать свежий гороскоп каждое утро;
наладить непрерывную работу на веб-сервере.
Напишите в комментариях, что бы вы хотели от такого бота? Что должен уметь идеальный бот с гороскопом?
Любишь Python? Зарабатывай