Как создать Telegram-бота с помощью Python

Автоматизированные чат-боты весьма полезны для стимулирования взаимодействия. Мы можем создавать таких ботов для Slack, Discord и других платформ. В этой статье я расскажу вам, как создать Telegram-бота, который расскажет вам ваш гороскоп. Итак, давайте приступим!

Как получить токен бота

1. Чтобы создать нового Telegram-бота, вам нужно поговорить с BotFather. Нет, это не человек: это тоже бот, и он является боссом всех ботов Telegram.

BotFather Telegram Bot

2. Начните разговор с BotFather, нажав на кнопку “Start”.

Нажмите на кнопку Start

3. Введите /newbot и следуйте подсказкам, чтобы настроить нового бота. BotFather выдаст вам токен, который вы будете использовать для аутентификации вашего бота и предоставления ему доступа к API Telegram.

Получение token доступа

Примечание: Токен нужно хранить в надежном месте. Любой человек, имеющий доступ к вашему токену, может легко манипулировать вашим ботом.

Как настроить среду для программирования

Давайте настроим среду для кодинга. Хотя для создания Telegram-ботов существует много библиотек, мы будем использовать pyTelegramBotAPI. Это простая, но расширяемая реализация Python для Telegram Bot API с синхронными и асинхронными возможностями.

Установите библиотеку pyTelegramBotAPI с помощью pip:

pip install pyTelegramBotAPI

Затем откройте ваш любимый редактор кода и создайте файл .env для хранения вашего токена, как показано ниже:

export BOT_TOKEN=your-bot-token-here

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

Как создать первого Telegram-бота

Все реализации API хранятся в одном классе под названием TeleBot. Он предлагает множество способов прослушивания входящих сообщений, а также функции send_message(), send_document() и другие для отправки сообщений.

Создайте новый файл bot.py и вставьте в него следующий код:

import os

import telebot

BOT_TOKEN = os.environ.get('BOT_TOKEN')

bot = telebot.TeleBot(BOT_TOKEN)

В приведенном выше коде мы используем библиотеку os, чтобы прочитать переменные окружения, хранящиеся в нашей системе.

Мы экспортировали переменную окружения под названием BOT_TOKEN. Значение BOT_TOKEN считывается в переменную BOT_TOKEN. Далее мы используем класс TeleBot для создания экземпляра бота и передаем ему BOT_TOKEN.

Затем нам нужно зарегистрировать обработчики сообщений. Они содержат фильтры, через которые должно пройти сообщение. Если сообщение проходит фильтр, вызывается декорированная функция, а в качестве аргумента передается входящее сообщение.

Давайте определим обработчик сообщений, который обрабатывает входящие команды /start и /hello.

@bot.message_handler(commands=['start', 'hello'])
def send_welcome(message):
    bot.reply_to(message, "Howdy, how are you doing?")

Для функции, оформленной обработчиком сообщений, допустимо любое имя, но она может иметь только один параметр (сообщение).

Добавим еще один обработчик, который эхом возвращает все входящие текстовые сообщения отправителю.

@bot.message_handler(func=lambda msg: True)
def echo_all(message):
    bot.reply_to(message, message.text)

В приведенном выше коде используется лямбда-выражение для проверки сообщения. Поскольку нам нужно передать эхом все сообщения, мы всегда возвращаем True из лямбда-функции.

Теперь у вас есть простой бот, который отвечает на команды /start и /hello статическим сообщением и повторяет все остальные отправленные сообщения. Для запуска бота добавьте в конец вашего файла bot.infinity_polling().

Вот и все! У нас готов бот для Telegram. Давайте запустим Python-файл и перейдем в Telegram, чтобы его протестировать.

Примечание редакции: о запуске файла можно почитать в статье “Как запустить скрипт Python”.

Если вы не можете найти бота, поищите по имени пользователя. Вы можете протестировать бота, отправляя команды типа /hello и /start и другие случайные тексты.

Тестирование бота

Примечание: Все обработчики сообщений тестируются в том порядке, в котором они были объявлены в исходном файле.

Для получения дополнительной информации об использовании библиотеки pyTelegramBotAPI вы можете обратиться к ее документации.

Как создать Telegram-бота для получения гороскопа

Давайте теперь перйдем к созданию нашего Horoscope Bot. В этом боте мы будем использовать цепочку сообщений. Сначала бот спросит ваш знак зодиака, затем дату, а затем ответит гороскопом на этот день.

Под капотом бот взаимодействует с API для получения данных гороскопа.

Мы будем использовать Horoscope API, который я создал в другом уроке. Если вы хотите узнать, как создать такой же, вы можете пройти этот урок. Перед началом работы обязательно изучите API.

Как получить данные гороскопа

Давайте создадим служебную функцию для получения данных гороскопа на определенный день.

import requests

def get_daily_horoscope(sign: str, day: str) -> dict:
    """Get daily horoscope for a zodiac sign.

    Keyword arguments:
    sign:str - Zodiac sign
    day:str - Date in format (YYYY-MM-DD) OR TODAY OR TOMORROW OR YESTERDAY
    Return:dict - JSON data
    """
    url = "<https://horoscope-app-api.vercel.app/api/v1/get-horoscope/daily>"
    params = {"sign": sign, "day": day}
    response = requests.get(url, params)

    return response.json()

Здесь мы создали функцию, которая принимает два строковых аргумента – sign и day – и возвращает данные в формате JSON. Мы отправляем GET-запрос на URL API и передаем sign и day в качестве параметров запроса.

Если вы протестируете функцию, то получите результат, аналогичный приведенному ниже:

{
   "data":{
      "date": "Dec 15, 2022",
      "horoscope_data": "Lie low during the day and try not to get caught up in the frivolous verbiage that dominates the waking hours. After sundown, feel free to speak your mind. You may notice that there is a sober tone and restrictive sensation today that leaves you feeling like you will never be able to break free from your current situation. Don't get caught in this negative mindset."
   },
   "status": 200,
   "success": true
}

Как добавить обработчик сообщений

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

@bot.message_handler(commands=['horoscope'])
def sign_handler(message):
    text = "What's your zodiac sign?\\nChoose one: *Aries*, *Taurus*, *Gemini*, *Cancer,* *Leo*, *Virgo*, *Libra*, *Scorpio*, *Sagittarius*, *Capricorn*, *Aquarius*, and *Pisces*."
    sent_msg = bot.send_message(message.chat.id, text, parse_mode="Markdown")
    bot.register_next_step_handler(sent_msg, day_handler)

Приведенная выше функция немного отличается от тех, которые мы определили ранее. Функциональность гороскопа бота будет вызываться командой /horoscope. Мы отправляем пользователю текстовое сообщение, но обратите внимание, что при отправке сообщения мы установили режим parse_mode в Markdown.

Поскольку мы будем использовать цепочку сообщений, мы применили метод register_next_step_handler(). Этот метод принимает два параметра: сообщение, отправленное пользователем, и функцию обратного вызова, которая должна быть вызвана после сообщения. Таким образом, мы передаем переменную sent_msg и новую функцию day_handler, которую мы определим далее.

Давайте определим функцию day_handler(), принимающую сообщение.

def day_handler(message):
    sign = message.text
    text = "What day do you want to know?\\nChoose one: *TODAY*, *TOMORROW*, *YESTERDAY*, or a date in format YYYY-MM-DD."
    sent_msg = bot.send_message(
        message.chat.id, text, parse_mode="Markdown")
    bot.register_next_step_handler(
        sent_msg, fetch_horoscope, sign.capitalize())

Мы получаем знак зодиака из атрибута message.text. Как и предыдущая функция, она также спрашивает день, на который вы хотите узнать гороскоп.

В конце мы используем тот же метод register_next_step_handler() и передаем sent_msg, функцию обратного вызова fetch_horoscope и sign.

Теперь определим функцию fetch_horoscope(), которая принимает сообщение и знак.

def fetch_horoscope(message, sign):
    day = message.text
    horoscope = get_daily_horoscope(sign, day)
    data = horoscope["data"]
    horoscope_message = f'*Horoscope:* {data["horoscope_data"]}\\n*Sign:* {sign}\\n*Day:* {data["date"]}'
    bot.send_message(message.chat.id, "Here's your horoscope!")
    bot.send_message(message.chat.id, horoscope_message, parse_mode="Markdown")

Это последняя функция, в которой мы получаем знак из параметра функции и день из атрибута message.text.

Затем мы получаем гороскоп с помощью функции get_daily_horoscope() и создаем наше сообщение. В конце мы отправляем сообщение с данными гороскопа.

Демонстрация бота

Запустив файл Python, вы можете протестировать эту функциональность. Вот демонстрационный пример:

Рекомендуемые дальнейшие шаги

На данный момент бот перестает работать, как только мы останавливаем наше Python-приложение. Для того чтобы он работал всегда, вы можете развернуть его на таких платформах, как Heroku, Render и так далее.

Вот ссылка на репозиторий GitHub для этого проекта – не стесняйтесь проверить его.

Вы также можете добавить в бота дополнительные функции, изучив API Telegram.

Перевод статьи Ashutosh Krishna “How to Create a Telegram Bot using Python”.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *