User-боты в Telegram: Простая автоматизация с Python (Pyrogram). Первые шаги
Друзья, приветствую! Надеюсь, что вы соскучились.
Давно хотел рассказать вам о такой интересной теме, как User-боты в Telegram, и, наконец-то, мои руки дошли до этого. Сегодня мы разберемся, что это за зверь такой, как его приручить, и, самое главное, познакомимся с мощным Python фреймворком для работы с юзер-ботами — Pyrogram.
Что такое User-бот в Telegram?
Итак, что же такое User-бот в Telegram? Проще говоря, это бот, который ведет себя как обычный пользователь, используя ваш личный аккаунт, а не официальный API Telegram. Такой бот может участвовать в чатах, отправлять и получать сообщения, управлять группами и каналами, делать рассылки и даже выполнять административные задачи.
Это как если бы вы сами сидели за компьютером или телефоном, но все действия выполняет запрограммированный бот.
User-боты позволяют автоматизировать любой авторизованный в Telegram аккаунт, предоставляя вам полный контроль над его действиями. Вы можете настроить автоматические ответы на сообщения, отслеживание определенных событий, массовые рассылки и даже управлять контентом в реальном времени.
Вот только краткий перечень того, что могут делать юзер-боты:
Отправка и получение сообщений.
Управление группами и каналами (например, добавление или удаление участников).
Автоматические ответы на определенные сообщения.
Мониторинг активности в чатах.
Массовые рассылки и уведомления.
Выполнение административных задач в каналах и группах.
Перехват и обработка задач от обычных ботов (в Bot Api телеграмм стоит ограничение на взаимодействие между обычными ботами и в этом случае на помощь приходят User‑боты, выступающие связующим звеном между User Api и Bot Api)
Все это делает User-ботов мощным инструментом для автоматизации рутинных задач и повышения эффективности работы в Telegram. И сегодня мы шаг за шагом разберемся, как создать такого бота и настроить его работу с помощью Pyrogram.
Дисклеймер
Прежде чем мы приступим к разработке такого бота, важно обсудить один ключевой момент. Для работы с User-ботом вам понадобится любой аккаунт в Telegram, к которому у вас есть доступ. Но вот что я настоятельно рекомендую: используйте для этого отдельный, новый аккаунт, а не свой основной. Сейчас объясню почему.
К сожалению, у User-ботов в Telegram сложилась не самая хорошая репутация. Некоторые разработчики использовали их не для конструктивных целей, а для создания бомберов, ботоферм, спам-хабов и других проектов, нарушающих правила платформы. В результате, Telegram серьезно ужесточил проверки, и если ваш аккаунт будет замечен в подозрительной активности, вы рискуете получить временный или даже вечный бан.
Так что, если вы собираетесь использовать знания из этой или прочих моих публикаций по данной теме для спама или других сомнительных схем, я вас предупреждаю — это плохая идея. Вы просто потеряете деньги на заблокированных аккаунтах, а сервисы, где вы их будете размещать, вполне себе законно смогут сносить ваши учетные записи с заморозкой всех денежных средств.
И, конечно, если вы решите применять полученные знания не в конструктивном направлении, ответственность за последствия будет полностью на вас. Я лишь делюсь информацией в образовательных целях.
Надеюсь, этот момент мы прояснили.
Подготавливаем аккаунт
Я, со своей стороны, под данную статью зарегистрирую отдельный аккаунт в Telegram. Для этого можно воспользоваться любым сервисом для получения смс-сообщений, магазином аккаунтов или зарегистрировать на обычную сим-карту.
Я воспользуюсь сервисом.
Устанавливаем на мобильное устройство Telegram если ещё не было установлено
Запрашиваем номер на любом сервисе / просто подготавливаем если он у вас есть
В приложении Telegram вводим подготовленный номер для получения на него смс-сообщения
Вводим смс-сообщение для входа
Даем имя аккаунту (фамилию и аватарку по желанию)
Далее, добавим в аккаунт «Облачный пароль» и «Код пароль». Это необходимо и для надежности аккаунта и упростит нам авторизацию в Pyrogram. Для этого заходим в раздел «Конфиденциальность» из настроек
Далее советую немного «прогреть» аккаунт. Отправьте пару сообщений, установите пару фото, добавьте описание и прочее. Чем больше прогрев, тем больше шансов на большую жизнеспособность аккаунта.
Регистрация приложения
В отличие от обычных ботов в Telegram, где достаточно было получить токен через BotFather, для работы с User-ботами нам потребуется доступ к клиентскому API Telegram. Это значит, что необходимо зарегистрировать приложение и получить API-ID и API HASH. Эти ключи вы получите один раз, и я покажу, как их удобно использовать на разных устройствах, аналогично токену из бот API.
Следуйте простой инструкции:
Введите номер телефона, на который зарегистрирован ваш Telegram‑аккаунт. После этого вы должны будете получить сообщение в Telegram от службы поддержки с кодом авторизации. Вводим полученный код.
Далее, на новом экране, нажмите на «API development tools».
Заполните поля App title, Short name и выберите платформу Desktop (с ней проще всего работать). Пример заполнения данных будет показан на скриншоте ниже.
Если имя и короткое имя введены корректно, вы получите api_id и api_hash. Сохраните эти данные в надежном месте, так как они будут использоваться для программной автоматизации вашего аккаунта.
Теперь у нас есть все необходимое чтоб приступить к разработке нашего User-бота, при помощи Python фреймворка Pyrogram.
Начнем писать код
Я, как обычно, буду использовать IDE Pycharm для написания кода.
Создаю отдельный проект. Далее, нам необходимо будет установить Pyrogram. Для того, чтоб проблем с версиями дальше не было — я использую requirements.txt файл.
Заполним файл requirements.txt
следующим образом:
pyrogram==2.0.106
python-decouple==3.8
python-decouple
, как обычно, я буду использовать для работы с переменными окружения (например api_hash, api_id).
Далее, для установки пропишем в терминале, с корня проекта, следующее:
pip install -r requirements.txt
Теперь создадим, а после заполним, файл .env
. Вот пример заполнения:
API_ID=0000000
API_HASH=iudjjhdyeqkkkkksssss
PHONE=+3980000000
LOGIN=yakvenalex_habr
Теперь получим куки авторизации (файл сессии), которые, в дальнейшем, мы сможем использовать для запуска с разных устройств (серверов, хостингов).
Для этого я создам файлик start_work.py и заполню его следующим образом:
from pyrogram import Client
from decouple import config
api_id = config('API_ID')
api_hash = config('API_HASH')
phone = config('PHONE')
login = config('LOGIN')
bot = Client(name=login, api_id=api_id, api_hash=api_hash, phone_number=phone)
bot.run()
Client из Pyrogram используется для создания и управления Telegram клиентом.
config из библиотеки decouple позволяет безопасно загружать конфиденциальные данные, такие как API_ID, API_HASH, и другие параметры из файла .env, что упрощает управление настройками и повышает безопасность.
Получение конфигурационных данных:
api_id = config('API_ID')
api_hash = config('API_HASH')
phone = config('PHONE')
login = config('LOGIN')
Эти строки загружают значения для переменных api_id
, api_hash
, phone
и login
из файла .env
.
bot = Client(name=login, api_id=api_id, api_hash=api_hash, phone_number=phone)
При помощи этой записи мы создали первый экземпляр клиента бота.
Далее мы выполняем запуск клиента (бота).
bot.run()
Тут я продемонстрировал простой код подключения. Технически, данный код выполнит всего одно действие — авторизацию. Конечная цель данного действия — получения файла сессии (куки), который, в дальнейшем, мы будем использовать для повторного входа в аккаунт через Pyrogram.
Запускаем.
Вводим код, полученный в Telegram.
Затем вводим облачный пароль, если вы его устанавливали.
Если после ввода пароля вы не получили никаких ошибок, то можно остановить выполнения скрипта.
В результате работы данного скрипта я получил файл сессии.
Как работает Pyrogram
В контексте User-ботов Pyrogram может функционировать двумя основными способами:
Режим ожидания обновлений: В этом режиме Pyrogram постоянно отслеживает события и обновления, поступающие от Telegram, что напоминает стандартный подход поллинга из Telegram Bot Api. Бот остается активным и реагирует на события, такие как получение новых сообщений, добавление пользователей в группы и т.д. Этот подход позволяет создавать интерактивных ботов, которые могут автоматически реагировать на различные события в реальном времени.
Режим выполнения конкретных действий: В этом режиме Pyrogram используется для выполнения конкретных задач по запросу, таких как отправка сообщения, управление группами или получение информации о пользователях. Бот выполняет одноразовые команды и завершает свою работу. Этот подход подходит для сценариев, где требуется выполнение определенного действия без необходимости поддержания постоянного соединения с сервером Telegram.
Как вы понимаете, режим выполнения конкретных действий не будет требовать постоянного онлайн для бота. Тут вы просто, когда вам это нужно, запускаете «одноразовый» скрипт. К примеру, отправка вам отчета.
В случае же с режимом ожидания обновлений, тут, без постоянного режима онлайн, суть бота будете теряться.
Так, как статья, скорее, ознакомительная, сегодня я коротко рассмотрю эти два способа взаимодействия с юзер-ботами через Pyrogram. Далее, если вам будет интересно, и я увижу активность под данной темой, рассмотрим конкретно, подробно и глубоко тему разработки юзер-ботов в телеграмм через Pyrogram.
Примеры работы в режиме выполнения конкретных действий
Сейчас я продемонстрирую вам каким образом можно отправить сообщение:
Себе (в «Избранное»)
Пользователю по логину
Пользователю по телеграм айди
Отправлять сегодня буду только текстовые сообщения.
В данном формате работы общий принцип строится вокруг того, чтоб открыть сессию с ботом и перед закрытием выполнить необходимые действия. Вот так, например, выглядит отправка сообщения себе в режиме выполнения конкретной задачи.
from pyrogram import Client
from decouple import config
bot = Client(name=config('LOGIN'),
api_id=config('API_ID'),
api_hash=config('API_HASH'),
phone_number=config('PHONE'))
bot.start()
bot.send_message(chat_id='me', text='Тестируем отправку сообщения себе')
bot.stop()
Тут объект bot обычно импортируется с файла настроек, но для демонстрации я описал все в одном файле.
В данном примере для открытия сессии бота мы использовали bot.start(),
, а для завершения bot.stop()
. В промежутке между открытием и закрытием мы можем выполнять необходимые действия.
bot.send_message(chat_id='me', text='Тестируем отправку сообщения себе')
Этой строкой кода я отправил себе сообщение. Все интуитивно понятно. Передаем chat_id (это или строка или целое число, в случае telegram_id). Text — это текст сообщения.
Аналогично этой строке сработала бы отправка себе сообщения, с указанием своего логина.
bot.send_message(chat_id=config('LOGIN'), text='Тестируем отправку сообщения себе (логин)')
Запускаю код и вижу, что сообщения отправлены.
Теперь обратите внимание на один важный момент. Оправка личных сообщений незнакомым аккаунтам (когда у вашего юзер-бота не было открытого личного чата с пользователем) имеет очень много ограничений.
И, если вы, например, собрали 100 телеграмм айди, логинов или номеров телеграмм, то не стоит думать что вы сможете всем выполнить отправку сообщений каждому. На свежем аккаунте, буквально, после отправки 5–6 сообщений подряд вы улетите во временный или постоянный бан. Так что давайте без фанатизма.
Как я говорил выше, отправка сообщений возможна по номеру телефона, логину и телеграмм айди.
Отправку по номеру телефона настоятельно рекомендую НЕ использовать. Под собой она подразумевает обязательное наличие номера в контактах, наличие чата и прочие подводные камни. Но, если надумаете, то в user_id, строкой, передавайте номер телефона в международном формате.
Логин необходимо передавать строкой без @, телеграмм айди (как пользователя, так и чата/группы) передаем целым числом.
Вот пример всех отправок сообщений:
from pyrogram import Client
from decouple import config
bot = Client(name=config('LOGIN'),
api_id=config('API_ID'),
api_hash=config('API_HASH'),
phone_number=config('PHONE'))
bot.start()
bot.send_message(chat_id='me', text='Отправка сообщения себе')
bot.send_message(chat_id='user_login', text='Отправка сообщения по логину другому пользователю')
bot.send_message(chat_id="+70000000", text='Отправка сообщения по номеру телефона')
bot.send_message(chat_id=122334566, text='Отправка сообщения по телеграмм айди')
bot.stop()
С дополнительными методами можно будет ознакомиться в официальной документации Pyrogram (она достаточно неплохая).
А теперь к более интересному работа в режиме ожиданий (хендлеров).
Подробно о режиме ожиданий
В данной архитектуре вся логика приложения строится вокруг обновлений (Update). Каждое такое обновление для User-бота выступает в качестве триггера, который активирует выполнение определённых действий.
Нас будут интересовать следующие типы обновлений:
MessageHandler — обработка любого полученного сообщения.
EditedMessageHandler — обработка редактирования сообщения.
DeletedMessageHandler — обработка удаления сообщения.
ChatMemberUpdateHandler — обработка изменений статуса участника чата.
UserStatusHandler — обработка изменения статуса пользователя (например, переход в онлайн).
Таким образом, User-бот отслеживает события, такие как получение нового сообщения, добавление пользователя в канал, изменение или удаление сообщения и другие. Для него эти события служат триггерами, к которым мы, как разработчики, можем привязать собственную логику.
В данном примере логика работы напоминает работу обычных Telegram-ботов. О том, как создавать таких ботов, я подробно писал в серии публикаций по разработке на Aiogram 3 — более 10 крупных статей.
Пример работы в режиме ожиданий (хендлеров)
Сейчас мы научим нашего бота реагировать на входящие события, тем самым, превратив его не в простой скрипт, а именно в полноценного User-бота, который может работать 24/7 и выполнять необходимые нам действия в бесконечном цикле асинхронно.
Сегодня, в качестве демонстрации работы я покажу вам как научить бота: отвечать на сообения, копировать его и пересылать сообщения в другой чат.
В дальнейших публикациях, если они будут, мы создадим с вами уже более полноценного бота.
Синтаксис, для удобства, я выберу похожим на написание ботов через Aiogram 3. Мы будем вешать некие обрабочики (хендлеры) через специальные декораторы, а после их разом запустим (bot.run ()). В дальнейшем, если будет вам интересно, я покажу как я организовываю структуру «боевых» user-ботов.
Напишем простого эхо-бота в асинхронном режиме. Его задача будет повторять каждое входящее в него текстовое сообщение.
from pyrogram import Client, filters
from decouple import config
from pyrogram.types import Message
# Инициализация клиента
bot = Client(name=config('LOGIN'),
api_id=config('API_ID'),
api_hash=config('API_HASH'),
phone_number=config('PHONE'))
# Обработчик входящих сообщений
@bot.on_message(filters.text)
async def echo_handler(client: Client, message: Message):
# Отправка ответа в тот же чат
await client.send_message(chat_id=message.chat.id, text=f'Повторяю: {message.text}')
# Запуск клиента
bot.run()
Для тех кто уже имел опыт в написании простых ботов, например, через aiogram 3 тут должно быть все понятно. Так как синтаксис достаточно похожий.
Начали мы с того, чтоб повесили декоратор (обработчик текстовых сообщений).
@bot.on_message(filters.text)
В качестве фильтра мы повесили filters.text (некий аналог F.text из aigram 3), тем самым указав что обрабатывать мы будем только текстовые сообщения.
Из отличий можно указать на отсутствие диспетчера и роутера. Тут мы вешаем обработчик на сам экземпляр клиента (бот).
Для того чтоб не передавать каждый раз user_id пользователя мы можем использовать другую запись.
@bot.on_message(filters.text)
async def echo_handler(client: Client, message: Message):
# Отправка ответа в тот же чат
await message.reply(text=f'Повторяю: {message.text}')
Тут обратите внимание, что мы, даже если не используем отдельно методы самого клиента обязаны все равно его передавать в качестве одного из аргументов.
И, раз уж мы коснулись метода reply сейчас я покажу вам как ответить на сообщение.
Для этого достаточно указать во флаге quote — True (по умолчанию False).
@bot.on_message(filters.text)
async def echo_handler(client: Client, message: Message):
# Отправка ответа в тот же чат
await message.reply(text=f'Повторяю без цитаты: {message.text}')
await message.reply(text=f'Повторяю с цитатой: {message.text}', quote=True)
Теперь напишем обработку на команды. Давайте сделаем, чтоб на команду /start бот отправлял приветствие, а на команду /help показывал доступные команды.
@bot.on_message(filters.command(['start', 'help']))
async def command_handler(client: Client, message: Message):
if message.text == '/start':
await message.reply("Привет! Я ваш помощник-бот. Введите /help для получения списка команд.")
elif message.text == '/help':
await message.reply(
"Доступные команды:\n"
"/start - Приветственное сообщение\n"
"/help - Список команд")
Я прописал все в одном обработчике для примера, но для удобства можно было разбить на несколько хендлеров.
Тут есть важный момент с фильтрами. Если вы используете дважды один и тот-же фильтр, то нижние обработчики будут игнорироваться.
Так-же, эхо-хендлер всегда должен идти в конце, так как он может начать перекрывать все прочие фильтры.
И по этому же примеру повесим обработчик на определенные слова / фразы. Давайте сделаем, чтоб если пользователь пишет фразу «Который сейчас час» бот отправлял текущее московское время.
Для начала я напишу функцию, которая будет возвращать сообщение с московским временем.
from datetime import datetime
import pytz
def get_time_msg():
# Получение текущего московского времени
moscow_tz = pytz.timezone('Europe/Moscow')
current_time = datetime.now(moscow_tz).strftime('%H:%M:%S')
return f"Текущее московское время: {current_time}"
Предварительно устанавливаем модуль pytz.
pip install pytz
@bot.on_message(filters.text)
async def time_handler(client: Client, message: Message):
if 'который сейчас час' in message.text.lower():
await message.reply(text=get_time_msg())
Тут я воспользовался подходом из echo-хендлера, но предварительно отфилтровал по содержанию в сообщении текста «который сейчас час».
Да, поздно…
Как видите, и тут все сработало.
По этой же логике вам ничего не мешает подключить внешнее API к вашему User-боту, например того-же ChatGPT и тогда бот ничем не будет отличаться от обычного пользователя.
Теперь давайте научим нашего бота копировать и пересылать отдельные сообщения с одного чата в другой / в «Избранное». И, так как мы уже научились пользоваться фильтрами, сделаем чтоб:
Пересылал сообщение в избранное если в сообщении видит «в избранное»
Пересылал сообщение в указанный чат по телеграмм айди если видел там конструкцию «Перешли это в чат:{}»
Копировал сообщение в указанный чат по телеграмм айди если видел там конструкцию «Скопируй это в чат:{}»
При пересылке сообщения сохраняется изначальный автор и действует ограничение на пересылку сообщения.
При копировании сообщения ограничения не распространяются, и изначальный автор не сохраняется.
Далее, чтоб сработала вся заложенная в бота логика, я напишу один общий хендлер, который будет срабатывать на все текстовые сообщения с необходимой нам логикой.
@bot.on_message(filters.text)
async def handle_message(client: Client, message: Message):
text = message.text.lower()
# Обработка команд /start и /help
if text == '/start':
await message.reply("Привет! Я ваш помощник-бот. Введите /help для получения списка команд.")
elif text == '/help':
await message.reply(
"Доступные команды:\n"
"/start - Приветственное сообщение\n"
"/help - Список команд"
)
# Обработка запроса времени
elif 'который сейчас час' in text:
await message.reply(text=get_time_msg())
# Пересылка сообщения в избранное
elif "в избранное" in text:
await client.forward_messages(
chat_id="me", # Идентификатор чата для "Избранных сообщений"
from_chat_id=message.chat.id,
message_ids=message.id
)
await message.reply("Сообщение переслано в избранное.")
# Пересылка сообщения в указанный чат
elif "перешли это в чат:" in text:
try:
target_chat_id = text.split("перешли это в чат:")[1].strip()
await client.forward_messages(
chat_id=target_chat_id,
from_chat_id=message.chat.id,
message_ids=message.id
)
await message.reply(f"Сообщение переслано в чат с ID {target_chat_id}.")
except Exception as e:
await message.reply(f"Ошибка при пересылке сообщения: {e}")
# Копирование сообщения в указанный чат
elif "скопируй это в чат:" in text:
try:
target_chat_id = text.split("скопируй это в чат:")[1].strip()
await client.copy_message(
chat_id=target_chat_id,
from_chat_id=message.chat.id,
message_id=message.id
)
await message.reply(f"Сообщение скопировано в чат с ID {target_chat_id}.")
except Exception as e:
await message.reply(f"Ошибка при копировании сообщения: {e}")
# Эхо-ответ
else:
await message.reply(text=f'Повторяю без цитаты: {message.text}')
await message.reply(text=f'Повторяю с цитатой: {message.text}', quote=True)
Конечно, можно было бы добавить больше фильтров, организовать код более структурированно и прочее, но, для первого знакомства с технологией информации более чем достаточно.
Удалённый запуск User-бота (деплой)
Как и обещал, давайте рассмотрим на простом примере, как развернуть User-бота на удалённом сервере. В данном случае, я буду использовать сервис Amvera Cloud, который идеально подходит для этих целей благодаря своей простоте и удобству, особенно для начинающих.
Я продемонстрирую, как выполнить деплой бота на Amvera Cloud. Этот сервис выбран мною не случайно — его интерфейс интуитивно понятен, а процесс запуска приложения сводится к нескольким простым шагам: достаточно загрузить файлы вашего проекта (бота, user-бота, FastAPI или любого другого скрипта на Python) вместе с файлом настроек, который можно сгенерировать прямо на сервисе Amvera или через Dockerfile.
Загрузку можно осуществить через GIT или напрямую через встроенную консоль сервиса. Для наглядности я выберу второй способ, а для запуска буду использовать сгенерированный файл настроек.
После того как файлы вашего приложения вместе с файлом настроек или Dockerfile окажутся на Amvera, сервис автоматически соберет и запустит ваше приложение. Это действительно удобно и быстро.
Кроме того, каждый новый пользователь получает 111 рублей на счёт для тестирования возможностей платформы. Давайте приступим.
Зарегистрируйтесь на Amvera Cloud, если у вас ещё нет аккаунта.
Перейдите в раздел проектов.
Создайте новый проект, указав его название и выбрав подходящий тариф. Для нашего бота подойдёт один из базовых тарифов.
На следующем экране нажмите «Через интерфейс» и загрузите в проект следующие файлы:
requirements.txt
— для автоматической установки всех необходимых зависимостей и библиотек;Сессионный файл для запуска бота без необходимости ввода пароля при авторизации;
Файл или файлы Python (.py), связанные с запуском бота. В моем случае ключевым и единственным является файл
example_echo_bot.py
.
На следующем экране вам необходимо будет сгенерировать файл настроек бота. Заполняем данные как на сриншоте ниже:
После заполнения всех данных нажмите «Завершить». Впоследствии настройки можно будет изменить в файле, если потребуется.
Теперь, если все было выполнено без ошибок, нам остается только подождать пока произойдет сборка и запуск проекта. Как правило, это занимает несколько минут.
Начало сборки
Буквально через 3 минуты
Проверим все ли работает.
Заключение
Друзья, сегодня мы познакомились с интересной и достаточно многогранной технологией написания user-ботов в Telegram с помощью Python-фреймворка Pyrogram.
Вы узнали, как получить api_id
и api_hash
, как их использовать и в каких режимах можно писать user-ботов через Pyrogram. Если вам интересна тема написания user-ботов для Telegram, я подготовлю для вас ещё несколько объемных публикаций на эту тему, так как существует множество аспектов, которые ещё не были раскрыты. Возможности user-ботов гораздо шире, чем это могло показаться на первый взгляд.
Полный исходный код из статьи, которую вы прочитали, а также дополнительный эксклюзивный контент, который я не публикую на Хабре, вы можете найти в моем Telegram-канале «Легкий путь в Python».
Если вам была интересна данная статья, оставляйте комментарии, подписывайтесь и ставьте лайки. Это очень важно для меня, ведь именно это мотивирует меня писать такие объемные статьи и делиться своим опытом.
На этом у меня пока всё. До скорого!