Telegram-бот на Pyrogram (Python): Анимация message, режим эха, команда About

Telegram-бот на Pyrogram (Python): Анимация message, режим эха, команда About

Сегодня разберем как можно сделать бота, который будет работать от клиента, то есть от нас. Для чего это может пригодиться? Мы сможем дополнять наши сообщения анимациями по команде, отвечать на какой-то текст от имени пользователей или даже создавать эффект эха (отправлять в ответ то же сообщение). Этот инструмент позволит нам использовать весь функционал Telegram. 

Что нам потребуется:

  1. Компьютер или ноутбук
  2. Редактор кода (У меня PyCharm)
  3. Python версии 3.9 и выше
  4. Соединение с интернетом

Установка 

Установка для windows:

pip install pyrogram tgcrypto

Для macOS:

pip3 install pyrogram tgcrypto

Получаем ключи для аккаунта

Переходим по ссылке на сайт телеграмм https://my.telegram.org/auth и вводим свой телефон:

Нам приходит код, который нужно вставить и нажать зарегистрироваться:

Дальше выбираем API development tools и нажимаем продолжить:

После регистрации мы попадаем в окно с API_HASH и API_ID, которые нам надо скопировать для работы бота:

Pyrogram vs aiogram vs telebot: что выбрать для Telegram-бота на Python

Для разработки Telegram-бота на Python есть несколько библиотек, и выбор зависит от задачи. Pyrogram отличается от других тем, что работает через MTProto - тот же протокол, что использует официальный Telegram-клиент. Это даёт возможность не только писать обычных ботов, но и автоматизировать действия от имени пользователя (user-боты).

Сравнение основных библиотек:

Библиотека Уровень Под что заточена Кому подойдёт
Pyrogram MTProto User-боты + обычные боты Кастомные сценарии, парсинг, автоматизация
aiogram Bot API Только обычные боты Высоконагруженные production-боты
telebot (pyTelegramBotAPI) Bot API Только обычные боты Простые задачи, новички
python-telegram-bot Bot API Только обычные боты Корпоративные проекты, документация
Telethon MTProto User-боты Альтернатива Pyrogram

Если вам нужен обычный Telegram-бот с командами и ответами на сообщения - telegram bot python через Bot API (telebot, aiogram) часто проще. Но если хочется парсить чаты, эмулировать действия пользователя или работать с приватным API - pyrogram python становится лучшим выбором среди библиотек MTProto.

Особенность Pyrogram в том, что библиотека покрывает практически весь функционал Telegram - от отправки сообщений до управления каналами и работы с stories. Telegram-бот на Pyrogram может делать то, что обычные API-боты в принципе не умеют.

Установка Pyrogram и получение API ID и API Hash

Перед написанием кода нужны два шага: установка библиотеки и получение API-ключей от Telegram.

Шаг 1: установка Pyrogram через pip:

pip install pyrogram tgcrypto

tgcrypto тут опциональный, но крайне желательный - он ускоряет шифрование MTProto в 5-10 раз. Без него Pyrogram работает на чистом Python и заметно тормозит на больших объёмах сообщений.

Шаг 2: получение API ID и API Hash:

  1. Откройте сайт https://my.telegram.org и войдите под номером телефона своего Telegram-аккаунта.
  2. Перейдите в раздел API development tools.
  3. Заполните форму с названием приложения (произвольное) и URL (можно поставить http://localhost).
  4. Получите свой api_id (число) и api_hash (строка из букв и цифр).

Эти два значения - ваша уникальная идентификация приложения в Telegram API. Они нужны для любого user-бота на pyrogram python.

Важно: файл сессии (.session), который создастся после первого входа, содержит данные авторизации. Не отправляйте его никому и не коммитьте в Git - это эквивалент логина и пароля от Telegram.

Когда pip install pyrogram tgcrypto отработал и у вас на руках есть api_id и api_hash - можно переходить к написанию кода Telegram-бота на Python.

Pyrogram client vs Pyrogram bot: в чём разница

Главная фишка библиотеки pyrogram python - возможность работать в двух режимах: как клиент (user-бот) и как обычный бот через Bot API.

Pyrogram client (user-бот):

  • Авторизуется через номер телефона реального пользователя.
  • Видит всё, что видит обычный пользователь: личные чаты, группы, каналы, стикеры, сторис.
  • Может писать первым кому угодно (нет ограничения как у Bot API).
  • Подходит для парсинга, автоматизации, мониторинга чатов, рассылок.

Pyrogram bot (через Bot API):

  • Авторизуется через токен бота от BotFather.
  • Работает как обычный бот: команды, callback-кнопки, ответы на сообщения.
  • Подходит для классических ботов с командами и взаимодействием с пользователями.

Сравнение инициализации обоих режимов в pyrogram python:

# User-бот - через номер телефона
user_app = Client("my_account", api_id=api_id, api_hash=api_hash)

# Обычный бот - через токен BotFather
bot_app = Client("my_bot", api_id=api_id, api_hash=api_hash, bot_token="123:abc...")

В этой статье разбираем создание user-бота (Pyrogram client) - первый вариант. Авторизуемся через номер телефона и сессию, получаем доступ ко всему функционалу Telegram-аккаунта.

Пишем код

Мы получили всё для запуска бота. Приступим!

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

from pyrogram import Client

api_hash = "412379786ba59"
api_id = "112312398"

with Client(name="my_account", api_hash=api_hash, api_id=api_id) as app:
    app.send_message("me", "Это я бот")

Как только мы запустили программу, нам предлагается ввести номер телефона, потом код, только после мы сможем пользоваться всеми благами. Как вы могли заметить, у нас появился непонятный файл с расширением session. При подключении к любому сайту, сервису итд, у нас создается сессия. Это удобно - нам не нужно постоянно вводить пароль, мы просто предоставляем сертификат и входим.

После всех действий в избранном появляется сообщение «это я бот»:

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

Разрабатываем функционал телеграм-бота

Анимация текста

Чтобы обрабатывать команды на постоянной основе, конструкция with as не поможет. Она больше подходит для постоянной обработки сообщений. Здесь же мы прибегнем к структуре, похожей на используемую в aiogram:

import time

from pyrogram import Client, filters
from pyrogram.types import Message
from pyrogram.errors import FloodWait

api_hash = "412379786ba59"
api_id = "112312398"

# with Client(name="my_account", api_hash=api_hash, api_id=api_id) as app:
#     app.send_message("me", "Это я бот")

client = Client(name="my_account", api_hash=api_hash, api_id=api_id)


@client.on_message(filters.command("type", prefixes='!') & filters.me)
def type(client_object, message: Message):
    input_text = message.text.split("!type ", maxsplit=1)[1]
    temp_text = input_text
    edited_text = ""
    typing_symbol = "⁂"

    while edited_text != input_text:
        try:
            message.edit(edited_text + typing_symbol)
            time.sleep(0.05)
            edited_text = edited_text + temp_text[0]
            temp_text = temp_text[1:]
            message.edit(edited_text)
            time.sleep(0.05)
        except FloodWait:
            print("Превышен лимит сообщений")

client.run()

 

Выносим в отдельную переменную объект клиента. Дальше с помощью декоратора обрабатываем все сообщения.

Декоратор срабатывает на команду type с префиксом восклицательного знака (выглядит так !type) и реагирует на сообщения, отправленные именно нам. Первый аргумент - объект клиента, к которому мы можем обращаться как глобальному клиенту. А message – само сообщение (подробнее про message в официальной документации телеграмма тут). Чтобы получить подсветку синтаксиса, мы указываем тип сообщения через двоеточие. 

[TGBLOCK]

Вначале мы берем текст отправленного сообщения и разделяем его на команду и сам текст для анимации. Дальше сохраняем во временную переменную для работы. Edited_text – текст сообщения для изменения. В него мы будем добавлять новые символы и анимацию со спец символом. Typing_symbol – символ для анимации. 

Дальше создаем цикл while с проверкой пока изменяемое сообщение не будет равное исходному. Оборачиваем все в try except, чтобы отслеживать ошибку FloodWait от телеграмма (о слишком частых запросах к телеграмму). 

Мы обращаемся к методу сообщения edit, как понятно из названия для изменения сообщения. Добавляем к edited_text по одному символу из изначального сообщения и спец символ и делаем задержку на 500 миллисекунд, чтобы не словить FloodWait.

Как это выглядит в чате:

Режим эхо в Telegram

Разберем простую функцию «эхо».

@client.on_message(filters.private)
def echo(client_object, message: Message):
    client_object.send_message(message.chat.id, f"вы сказали: {message.text}")

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

Дальше мы получаем ID чата по сообщению и отправляем в ответ тоже сообщение с припиской «вы сказали:». Это самая проста функция реализации.

Выполнение команды About

@client.on_message(filters.command("about", prefixes='!') & filters.private)
def about(client_object, message: Message):
    text = """
    Я программист, котрый разработывает бот для разных меседжеров.\nНапример этого бота для моего аккаунта.
    """
    client_object.send_message(message.chat.id, text)

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

Filters.private – этот фильтр будет пропускать через себя только сообщения из приватных чатов (чатов между пользователями).

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

Как это выглядит:

Деплой Telegram-бота на Pyrogram на сервер: systemd и Docker

Локальный бот живёт только пока работает ваш компьютер. Для production-режима Telegram-бот на Python нужно задеплоить на VPS. Два проверенных способа:

Вариант 1: systemd на Linux-сервере. Самый простой путь. Покупаете VPS за 200-300 рублей в месяц, кидаете туда скрипт и сессию Pyrogram, настраиваете systemd-юнит:

[Unit]
Description=Telegram bot on Pyrogram
After=network.target

[Service]
WorkingDirectory=/opt/pyrogram_bot
ExecStart=/usr/bin/python3 /opt/pyrogram_bot/main.py
Restart=always
User=botuser

[Install]
WantedBy=multi-user.target

Сохраняете как /etc/systemd/system/pyrogram_bot.service, запускаете systemctl enable --now pyrogram_bot. Бот автоматически перезапускается при падении и при ребуте сервера.

Вариант 2: Docker. Удобно для изоляции и масштабирования:

FROM python:3.11-slim
WORKDIR /app
RUN pip install --no-cache-dir pyrogram tgcrypto
COPY main.py session.session .
CMD ["python", "main.py"]

Собираете docker build -t pyrogram_bot . и запускаете docker run -d --restart=always pyrogram_bot. Telegram bot python теперь работает в контейнере с автоматическим перезапуском.

Важный момент: для user-бота на Pyrogram файл сессии надо переносить осторожно. После первого входа Telegram запомнит устройство как авторизованное. Если попытаетесь использовать сессию из другого IP-адреса другой страны - Telegram может потребовать повторную верификацию.

Типичные ошибки при работе с Pyrogram в Python

Из реальной практики - вот что чаще всего ломает Telegram-бота на Pyrogram:

  1. FloodWait error. Telegram ограничивает скорость отправки сообщений. Если шлёте слишком быстро - получите FloodWait и должны будете ждать N секунд. Решение: добавьте await asyncio.sleep(1) между сообщениями или используйте встроенный механизм Pyrogram с retry.
  2. SessionPasswordNeeded. Если у аккаунта включена двухфакторная аутентификация (облачный пароль) - при первом входе Pyrogram попросит его. Обработайте через app.check_password(password).
  3. AuthKeyUnregistered. Сессия аннулирована - например, вы вышли из Telegram-клиента или Telegram её сбросил. Удаляете файл .session и проходите авторизацию заново.
  4. tgcrypto не установлен. Без tgcrypto Pyrogram работает в 5-10 раз медленнее. Если бот тормозит на простых задачах - проверьте что pip install tgcrypto отработал успешно.
  5. Pyrogram + asyncio внутри Jupyter. Стандартный app.run() не работает в Jupyter из-за уже запущенного event loop. Используйте await app.start() и await app.stop() напрямую.
  6. UpdateMode не работает в user-боте. Декораторы @app.on_message() ловят апдейты только если клиент активно слушает. Не забудьте app.run() или idle() в конце скрипта.
  7. Парсинг каналов через user-бота нарушает ToS Telegram. Массовый парсинг или сбор данных без согласия пользователей нарушает правила. Аккаунт могут заблокировать. Используйте Pyrogram только для законных задач.

FAQ: Pyrogram и Telegram-боты на Python

Чем Pyrogram отличается от aiogram и telebot?

Pyrogram python работает через MTProto - тот же протокол, что и официальный Telegram. Это даёт возможность писать user-ботов от имени реального аккаунта. aiogram и telebot работают через Bot API, и могут создавать только обычных ботов. Если нужна автоматизация действий от имени пользователя - выбирайте Pyrogram.

Можно ли создать обычного Telegram-бота через Pyrogram?

Да. Достаточно при инициализации Client передать bot_token от BotFather - и telegram bot python на Pyrogram будет работать как стандартный бот через Bot API.

Зачем нужен tgcrypto?

Это библиотека на C, которая ускоряет шифрование MTProto в 5-10 раз. Без неё Pyrogram работает на чистом Python и заметно тормозит. Для production-проектов tgcrypto обязателен.

Безопасно ли давать api_id и api_hash?

api_id и api_hash сами по себе не дают доступа к вашему аккаунту - они идентифицируют приложение. Опасность представляет только файл сессии (.session) - его никому не передавайте. Это эквивалент логина и пароля.

Можно ли бесплатно деплоить Telegram-бот на Pyrogram?

Да, есть бесплатные варианты: Railway, Fly.io, Render (в рамках бесплатных тарифов). Для маленького Telegram-бота на Python этого достаточно. Для серьёзного продакшена лучше брать VPS от 200 руб/мес.

Pyrogram работает с асинхронным кодом?

Да, Pyrogram изначально асинхронный. Все методы возвращают корутины и работают через async/await. Это делает библиотеку быстрой даже под нагрузкой.

Заключение 

Сегодня мы разобрали библиотеку pyrogram для работы с аккаунтом Telegram. Теперь вы можете выйти на новый уровень взаимодействия с этим месседжером. 

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

Полезные ссылки:

Документация Pyrogram: https://docs.pyrogram.org/
Примеры использования: https://github.com/ColinShark/Pyrogram-Snippets