Управление группами и каналами Telegram через API
Управлять группой и каналом Telegram через API можно двумя способами. В Bot API бот-администратор создаёт инвайт-ссылки, одобряет заявки на вступление, ограничивает и банит участников. Пользовательский аккаунт (MTProto) дополнительно даёт список участников, медленный режим, отложенные посты, которые отправит сам Telegram, и статистику канала. Для каждого действия нужны соответствующие права администратора.
Обновлено:
Коротко: что и чем делается
Для повседневной модерации достаточно бота-администратора: инвайт-ссылки, заявки на вступление, ограничения, баны, назначение админов, права по умолчанию и опросы есть в Bot API. То, чего в Bot API нет, — полный список участников, включение медленного режима, отложенные сообщения и статистика канала — делается через MTProto от имени аккаунта, который является администратором.
Методы под задачи: бот и аккаунт
Названия методов в SDK Socialift: слева Telegram (Bot API), справа TelegramAccount (MTProto).
| Задача | Bot API (Telegram) | Аккаунт (TelegramAccount) |
|---|---|---|
| Дополнительная инвайт-ссылка | create_invite_link (name, expire_date, member_limit, creates_join_request) | create_invite_link (title, expire_date, usage_limit, request_needed) |
| Основная ссылка | export_invite_link — отзывает предыдущую | invite_link |
| Отзыв ссылки | revoke_invite_link | revoke_invite_link |
| Заявки на вступление | update chat_join_request + approve_join_request / decline_join_request | join_requests + approve_join_request(..., approved=...) |
| Назначение и снятие админов | promote_member, demote_member, set_admin_title | promote, demote |
| Ограничение (mute) | restrict_member | restrict, mute_member |
| Исключение и бан | ban_member, unban_member | kick, ban, unban |
| Права для всех участников | set_chat_permissions | set_default_permissions |
| Медленный режим | Метода нет | set_slowmode |
| Опрос | send_poll, stop_poll | send_poll |
| Отложенное сообщение | Нет | send_message(..., schedule=...), scheduled |
| Участники | get_chat_administrators, get_chat_member, get_chat_member_count | participants, admins, banned |
| Статистика канала | Нет | stats |
Закрытая группа с заявками: настройка через бота
Сделайте бота администратором
Дайте боту как минимум право приглашать пользователей (can_invite_users) — без него бот не видит заявки и не может их одобрять.
Создайте ссылку с заявками
create_invite_link(..., creates_join_request=True). В этом режиме нельзя задатьmember_limit— выберите что-то одно. Для срока действия добавьтеexpire_date(unix-время).Принимайте обновления
Бот получает update
chat_join_request. Если вы вручную ограничивалиallowed_updates, добавьте туда chat_join_request.Проверьте заявку
Через
user_chat_idиз update бот может писать пользователю 5 минут, пока заявка не обработана, — например, чтобы задать короткий вопрос. Сверьтесь с CRM или базой оплат.Примите решение
Вызовите
approve_join_requestилиdecline_join_request. Ненужную ссылку отзовите черезrevoke_invite_link.
Бот: срочная ссылка и одобрение заявок
import time
from socialift import Telegram
async def make_link(bot: Telegram, chat: str) -> str:
link = await bot.create_invite_link(
chat, name="Акция сентября",
expire_date=int(time.time()) + 7 * 86400, # 7 дней
creates_join_request=True, # не вместе с member_limit
)
return link["invite_link"]
async def on_update(bot: Telegram, update: dict) -> None:
req = update.get("chat_join_request")
if not req:
return
chat_id, user_id = req["chat"]["id"], req["from"]["id"]
if await is_paid_customer(user_id): # ваша проверка
await bot.approve_join_request(chat_id, user_id)
else:
await bot.decline_join_request(chat_id, user_id)Название ссылки — 0–32 символа. member_limit (1–99999) — сколько пришедших по ссылке участников может одновременно состоять в чате.
export_invite_link пересоздаёт основную ссылку и отзывает предыдущую. Чтобы ссылка из рекламы внезапно не перестала работать, выдавайте кампаниям отдельные ссылки через create_invite_link. Со ссылками, созданными другими админами, бот работать не может.
Бот: ограничение, бан и назначение модератора
import time
async def moderate(bot, chat_id: int, spammer_id: int, moderator_id: int) -> None:
# Запрет писать на 1 час (только в супергруппах)
await bot.restrict_member(chat_id, spammer_id, {"can_send_messages": False},
until_date=int(time.time()) + 3600)
# Полный бан: без until_date — навсегда
await bot.ban_member(chat_id, spammer_id)
# Модератор: бот может выдать только те права, что есть у него самого
await bot.promote_member(chat_id, moderator_id, can_delete_messages=True,
can_restrict_members=True, can_pin_messages=True)
await bot.set_admin_title(chat_id, moderator_id, "Модератор")Если until_date меньше чем через 30 секунд или больше чем через 366 дней от текущего момента, Telegram считает ограничение или бан бессрочным.
unban_member по умолчанию вызывается с only_if_banned=True: иначе Telegram исключит из группы и участника, который в ней состоит. Снять права админа — demote_member (в Bot API это то же, что передать False для всех прав).
Аккаунт: медленный режим, опрос и отложенный пост
Для этих действий аккаунт должен быть администратором группы или канала с нужными правами.
from datetime import datetime, timedelta, timezone
from socialift import TelegramAccount
async def weekly_setup() -> None:
async with TelegramAccount.from_env() as tg:
await tg.set_slowmode("@my_group", 30) # 0 — выключить
await tg.send_poll("@my_group", "В какой день провести вебинар?",
["Вторник", "Четверг"])
when = datetime.now(timezone.utc) + timedelta(hours=18)
await tg.send_message("@my_channel", "Утренний дайджест", schedule=when)
queue = await tg.scheduled("@my_channel")Отложенное сообщение попадает в очередь на сервере Telegram и отправляется самим Telegram в указанное время — ваше приложение в этот момент может быть выключено. У каждого чата своя очередь.
Медленный режим работает только в супергруппах, и Telegram принимает лишь фиксированные интервалы; на неверное значение вернётся SECONDS_INVALID. Администраторов с правом управления чатом медленный режим не ограничивает. promote() в SDK по умолчанию выдаёт много прав (кроме add_admins) — лишние передавайте как False.
Список участников: что можно, а что нет
Bot API не отдаёт полный список участников группы. Бот получает только список админов (get_chat_administrators), статус одного пользователя (get_chat_member, надёжно — если бот админ) и число участников. Чтобы отслеживать входы и выходы, бот должен быть админом и явно указать chat_member в allowed_updates — по умолчанию это обновление не приходит.
Через аккаунт participants() возвращает список, но с ограничениями: подписчиков канала видят только админы, админы супергруппы могут скрыть список участников, а в очень больших группах полный список не гарантируется. aggressive=True собирает больше, но число запросов растёт вместе с риском FLOOD_WAIT.
Для ориентира по размерам: супергруппа поддерживает до 200 000 участников, старые обычные группы — не больше 200. Число подписчиков канала не ограничено.
Статистика канала
Подробную статистику Telegram показывает только админам каналов от определённого размера. Точный порог — серверная настройка, поэтому не зашивайте число в код, а проверяйте флаг can_view_stats.
async def channel_report(tg, channel: str) -> dict | None:
full = await tg.chat_full(channel)
if not full.full_chat.can_view_stats:
return None # канал пока мал или не хватает прав
stats = await tg.stats(channel)
return {
"followers": stats.followers.current,
"views_per_post": stats.views_per_post.current,
}В ответе — динамика подписчиков, просмотры, репосты и реакции на пост, доля подписчиков с включёнными уведомлениями и другие показатели.
Этика и антиспам-правила Telegram
API групп и каналов — для работы с аудиторией, а не для спама. Нарушения могут стоить аккаунта навсегда.
- Не добавляйте незнакомых людей в группу массово. Если пользователь запретил это в настройках приватности, Telegram вернёт USER_PRIVACY_RESTRICTED — отправляйте инвайт-ссылку только тем, кто сам попросил.
- Не пишите и не приглашайте людей из купленных или спарсенных в других группах баз.
- Не накручивайте подписчиков и просмотры: за такое использование API Telegram банит навсегда.
- Не автоматизируйте действия, о которых владелец аккаунта не знает и на которые не соглашался, — это нарушает API Terms of Service.
- Соблюдайте лимиты: бот может отправлять в группу не больше 20 сообщений в минуту, а на аккаунте выжидайте время из FLOOD_WAIT.
- Вместо открытого входа используйте ссылки с заявками — они отсекают и спам-ботов, и случайных людей.
Частые вопросы
Можно ли через бота получить всех участников группы?
Нет. Bot API отдаёт только список админов, статус одного участника и число участников. Для полного списка нужен аккаунт-администратор и MTProto, но и там подписчиков канала видят только админы.
Можно ли задать у инвайт-ссылки и лимит участников, и заявки?
В Bot API — нет: при creates_join_request=True параметр member_limit указать нельзя. Выберите открытую ссылку с лимитом или ссылку с заявками; срок действия (expire_date) можно добавить к любой из них.
Может ли бот включить медленный режим?
В Bot API нет метода для установки медленного режима — бот может только прочитать текущее значение в информации о чате. Включается он через MTProto от имени аккаунта-админа: в SDK это set_slowmode("@group", 30), выключение — 0.
Почему exportChatInviteLink отключил старую ссылку?
Этот метод пересоздаёт основную ссылку бота и отзывает предыдущую. Если нужно несколько активных ссылок, используйте create_invite_link: он создаёт дополнительную ссылку и не трогает существующие.
Почему не приходит статистика канала?
Telegram показывает статистику только админам каналов от определённого размера, и порог задаётся на сервере. Проверьте флаг can_view_stats в ответе chat_full() и убедитесь, что аккаунт — администратор канала.
Может ли бот публиковать посты в канале?
Да, если бот — администратор канала с правом публикации. В качестве chat_id подойдёт @username канала. А вот отложенной публикации в Bot API нет — для неё нужен send_message(..., schedule=...) у аккаунта.