Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
16 Мар 2022
10 мин
14815

Как создать телеграм-бота на Python

Python — самый популярный язык программирования в феврале 2022 года.

Телеграм используют более пятисот миллионов людей по всему миру. Компании с его помощью упрощают заказ товаров или услуг, дают консультации. Для этого используют ботов — автоматические программы. Их пишут на разных языках программирования. Рассмотрим, как создать бот на самом популярном в феврале 2022 года языке — Python.

Установите интерпретатор Python

Python — динамически типизированный, интерпретируемый язык. Программы, написанные на нём, не компилируются в исполняемые файлы. Поэтому, чтобы запускать Python-программы, устанавливают его интерпретатор.

На курсе Skypro «Python-разработчик» с этого начинается первый модуль. Вся программа построена от простого к сложному и подходит даже для тех, кто не имеет опыта в программировании и технических знаний. За 10 месяцев можно освоить профессию на уровне уверенного новичка.

🖥️ Windows

  1. Перейдите на официальную страницу загрузки Python.

    как установить интерпретатор Python

    Выберите последнюю версию Python

  2. Пролистайте вниз страницы и скачайте Windows Installer.

    64-bit в интерпретаторе Python

    Выберите 64-bit

  3. Откройте установщик и поставьте галочку, нажмите Install Now.

    как установить интерпретатор Python на Windows

    Поставьте галочку перед установкой напротив Add Python to PATH

  4. После откройте командную строку cmd.exe и установите виртуальное окружение с помощью команды
pip install virtualenv

❗ Вызов интерпретатора в командной строке Windows отличается от других ОС. Используйте команду py вместо python3.

🖥️ Linux

Если вы используете ОС Linux, вероятно, Python уже установлен. Чтобы проверить, откройте терминал с помощью команды:

python3 --version

Если вы видите что-то вроде Python 3.x.x, то Python есть. В противном случае используйте установленный менеджер пакетов. В основном это apt. Введите команду:

sudo apt install python3

Установите виртуальное окружение с помощью команды:

sudo apt install python3-venv

🖥️ MacOS

На макбуках Python часто тоже уже есть. Откройте терминал и проверьте с помощью команды:

python3 --version

Ответ Python 3.x.x, а не ошибка, тоже подтверждает, что Python установлен. Если нет — используйте менеджер пакетов brew. Введите команду:

brew install python3

Установите пакет для создания виртуального окружения:

pip install virtualenv

Создайте папки проекта и виртуального окружения

Откройте терминал Linux или MacOS, командную строку Windows. Перейдите в директорию, в которой вы хотите создать проект бота. Последовательно

введите команды:

mkdir myBot
cd myBot
python3 -m venv env
# 

или, если вы используете Windows:

py -m venv env #

Эти команды создадут папку проекта myBot внутри текущей рабочей директории. А в ней — папку с виртуальным окружением.

Активируйте окружение, выберите и установите библиотеки

Чтобы активировать виртуальное окружение на MacOS или Linux, используйте команду

source ./env/bin/activate

И команду

source.\env\bin\activate.bat

для Windows.

Чтобы создавать боты, используют разные библиотеки. Самые популярные: python-telegram-bot с синхронным подходом, aiogram с асинхронным.

Асинхронность позволяет отвлекаться от задач и не ждать ввода от пользователя, поэтому мы будем использовать библиотеку aiogram. Документация по ней — на docs.aiogram.

Используйте менеджер Python-пакетов (pip). Чтобы установить библиотеку aiogram, введите команду:

pip install aiogram

Зарегистрируйте бота и получите API-ключ

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

Нажмите «Запустить».

как добавить нового бота в телеграм

как зарегистрировать бота в телеграме

Введите команду /newbot и отображаемое имя бота

Теперь введите никнейм бота. Он должен быть уникальным, в конце обязательно слово bot. Когда юзернейм пройдет валидацию, вы получите сообщение с API-ключом.

валидация бота в телеграм

Никому не сообщайте полученный токен

Примеры ботов

🤖 Эхобот

Для начала в папке проекта создайте несколько файлов.

как создать эхобота

Handlers.py будет хранить функции — обработчики сообщений и команд, main.py нужен для запуска

Напишите в main.py код:

from aiogram import Bot, Dispatcher, executor
import handlers

API_TOKEN = 'вставьте сюда ваш токен'

# создаем экземпляры бота и диспетчера
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

# запускаем программу
if __name__ == '__main__':
# указание skip_updates=True
# пропустит команды,
# которые отправили
# до старта бота
executor.start_polling(dp, skip_updates=True)

Разберем построчно:

from aiogram import Bot, Dispatcher, executor
import handlers

Здесь из библиотеки aiogram мы импортируем классы Bot, Dispatcher — класс, который регистрирует, на какие команды/сообщения и какой функцией отвечать. И executor — он запускает бота и выполняет функции, зарегистрированные в диспетчере. На второй строке мы импортируем модуль handlers.py — в нём хранят обработчики.

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

Далее откройте файл handlers.py и напишите в нём пару команд, которые будут обрабатывать запросы:

from aiogram import types

# функция, обрабатывающая команду /start
async def start(message: types.Message):
await message.answer("Привет!\nНапиши мне что-нибудь!")

# функция, которая отвечает на сообщение
# текстом
async def echo(message: types.Message):
await message.answer("Сам ты: " + message.text)

Здесь из модуля aiogram импортируем типы, с помощью которых преобразуем текст сообщения или файлы в структуру данных. Это может быть Message — сообщение, Audio — аудиозапись, Animation — анимация.

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

Зарегистрируйте эти функции в диспетчере. Для этого в файле main.py добавьте перед запуском программы:

# регистрируем функции
dp.register_message_handler(h.start, commands=["start"])
dp.register_message_handler(h.echo)

В итоге файл main.py выглядит так:

from aiogram import Bot, Dispatcher, executor
import handlers

API_TOKEN = 'вставьте сюда ваш токен'

# создаем бота и диспетчер
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

# регистрируем функции
dp.register_message_handler(handlers.start, commands=["start"])
dp.register_message_handler(handlers.echo)

# запускаем программу
if __name__ == '__main__':
# указание skip_updates=True
# пропустит команды,
# которые отправили
# до старта бота
executor.start_polling(dp, skip_updates=True)
ка запустить Эхобот в телеграме

Чтобы проверить работу, введите в терминале python3 main.py или py main.py на Windows. Откройте бота в телеграме и запустите его

🤖 Криптобот

Чтобы написать криптобота, который будет сообщать текущую цену BTC, LTC и DASH, используйте бесплатный API-сервис SoChain. Еще потребуется дополнительная библиотека, чтобы создать асинхронные запросы aiohttp, но ее устанавливают вместе с aiogram.

Создайте новый модуль utils.py. Добавьте в него url-адрес API-сервиса. Чтобы узнавать цену, используйте метод Get Prices. Он возвращает json-объект с данными о цене из нескольких источников. Поэтому напишите функцию, которая вычисляет среднее значение:

BASE_URL = "https://sochain.com/api/v2/" # API URL

# функция, чтобы рассчитать цену
def calculate_price(data):
prices = [float(entity["price"]) for entity in data["data"]["prices"]]
return f"{(sum(prices) / len(prices)):.2f} USD"

Далее откройте файл handlers.py и напишите код:

from aiogram import types

# импортируем библиотеку aiohttp
import aiohttp

# импортируем из utils все данные
from utils import *

# обработчик команды /start
async def start(message: types.Message):
await message.answer("Привет!\nНапиши мне акроним криптовалюты, чтобы узнать текущую цену")

# обработчик команды /help
async def help(message: types.Message):
await message.answer("Доступные сети:\n" + "\n".join(networks))

# обработчик запроса цены
async def get_price(message: types.Message):
session = aiohttp.ClientSession()

# создаем GET запрос по закрепленному за методом get_price url
async with session.get(BASE_URL + f"get_price/{message.text}/USD") as resp:

# получаем ответ в формате json
data = await resp.json()

# если статус запроса — успешно
if data["status"] == "success":

# рассчитываем цену и отправляем пользователю
price = calculate_price(data)
await message.answer(price)
else:
# сообщаем о том, что произошла ошибка
await message.answer("Произошла ошибка")

Теперь измените main.py файл: зарегистрируйте функции. Затем протестируйте бота:

from aiogram import Bot, Dispatcher, executor
import handlers

API_TOKEN = 'вставьте сюда ваш токен'

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

dp.register_message_handler(handlers.start, commands=["start"])
dp.register_message_handler(handlers.help, commands=["help"])
dp.register_message_handler(handlers.get_price)

if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
как запустить криптобота в телегараме

Когда пользователь укажет неподдерживаемую сеть ETH, бот вернет цену биткоина, потому что так устроен API-сервис. Если он не распознал сеть, то использует BTC

Чтобы исправить ошибку, создайте клавиатуру, которая возвращает нужные значения. Напишите специальный класс Middleware: в нём описываются проверки до и после обработки запроса. Либо проверьте вхождение внутри функции. Последний вариант проще и легче.

Если пользователь отправит неподдерживаемый акроним криптосети, вы сообщите ему об этом. Для этого в файле utils.py определите список поддерживаемых сетей:

networks = ["BTC", "LTC", "DASH"] # <-- поддерживаемые сети
BASE_URL = "https://sochain.com/api/v2/" # API URL

def calculate_price(data):
prices = [float(entity["price"]) for entity in data["data"]["prices"]]
return f"{(sum(prices) / len(prices)):.2f} USD"

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

async def get_price(message: types.Message):
network = message.text.upper() # приводим сообщение к верхнему регистру

# выполняем проверку вхождения
if network not in networks:
await message.answer("Вы указали неподдерживаемую криптовалюту")
return

session = aiohttp.ClientSession()

async with session.get(BASE_URL + f"get_price/{message.text}/USD") as resp:
data = await resp.json()
if data["status"] == "success":
price = calculate_price(data)
await message.answer(price)
else:
await message.answer("Произошла ошибка")

Когда пользователь укажет неподдерживаемую сеть ETH, бот сообщит об этом

Код всех файлов

utils.py

networks = ["BTC", "LTC", "DASH"] # поддерживаемые сети
BASE_URL = "https://sochain.com/api/v2/" # API URL

def calculate_price(data):
prices = [float(entity["price"]) for entity in data["data"]["prices"]]
return f"{(sum(prices) / len(prices)):.2f} USD"

handlers.py

import aiohttp
from aiogram import types
from utils import *

async def start(message: types.Message):
await message.answer("Привет!\nНапиши мне акроним криптовалюты, чтобы узнать текущую цену")

async def help(message: types.Message):
await message.answer("Доступные сети:\n" + "\n".join(networks))

async def get_price(message: types.Message):
network = message.text.upper()

if network not in networks:
await message.answer("Вы указали неподдерживаемую криптовалюту")
return

session = aiohttp.ClientSession()

async with session.get(BASE_URL + f"get_price/{message.text}/USD") as resp:
data = await resp.json()
if data["status"] == "success":
price = calculate_price(data)
await message.answer(price)
else:
await message.answer("Произошла ошибка")

main.py

from aiogram import Bot, Dispatcher, executor
import handlers

API_TOKEN = 'вставьте сюда ваш токен'

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

dp.register_message_handler(handlers.start, commands=["start"])
dp.register_message_handler(handlers.help, commands=["help"])
dp.register_message_handler(handlers.get_price)

if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)

Главное о телеграм-боте на Python

  • Чтобы создать бота, установите интерпретатор Python. На Linux и MacOS он часто уже есть.
  • Создайте папку с проектом myBot, в ней — папку с окружением, активируйте его, установите библиотеку aiogram. Она позволяет обрабатывать запросы, даже если вы ждете, пока пользователь введет информацию.
  • Регистрируйте бота и управляйте его настройками с помощью @BotFather.

В онлайн-университете Skypro обучаем профессии Python-разработчика за 10 месяцев. Узнаете, как писать чистый код, серверы для магазина, приложения, сервиса или игры, разрабатывать сложную архитектуру сервисов. Выполните практические задания с реальными инструментами и сделаете четыре проекта для портфолио. Развиваем только нужные навыки, необходимые для старта в профессии.

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

Добавить комментарий