Перейти к содержимому
Socialift
Руководство

Управление группами и каналами 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_linkrevoke_invite_link
Заявки на вступлениеupdate chat_join_request + approve_join_request / decline_join_requestjoin_requests + approve_join_request(..., approved=...)
Назначение и снятие админовpromote_member, demote_member, set_admin_titlepromote, demote
Ограничение (mute)restrict_memberrestrict, mute_member
Исключение и банban_member, unban_memberkick, ban, unban
Права для всех участниковset_chat_permissionsset_default_permissions
Медленный режимМетода нетset_slowmode
Опросsend_poll, stop_pollsend_poll
Отложенное сообщениеНетsend_message(..., schedule=...), scheduled
Участникиget_chat_administrators, get_chat_member, get_chat_member_countparticipants, admins, banned
Статистика каналаНетstats

Закрытая группа с заявками: настройка через бота

  1. Сделайте бота администратором

    Дайте боту как минимум право приглашать пользователей (can_invite_users) — без него бот не видит заявки и не может их одобрять.

  2. Создайте ссылку с заявками

    create_invite_link(..., creates_join_request=True). В этом режиме нельзя задать member_limit — выберите что-то одно. Для срока действия добавьте expire_date (unix-время).

  3. Принимайте обновления

    Бот получает update chat_join_request. Если вы вручную ограничивали allowed_updates, добавьте туда chat_join_request.

  4. Проверьте заявку

    Через user_chat_id из update бот может писать пользователю 5 минут, пока заявка не обработана, — например, чтобы задать короткий вопрос. Сверьтесь с CRM или базой оплат.

  5. Примите решение

    Вызовите approve_join_request или decline_join_request. Ненужную ссылку отзовите через revoke_invite_link.

Бот: срочная ссылка и одобрение заявок

join_requests.py
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. Со ссылками, созданными другими админами, бот работать не может.

Бот: ограничение, бан и назначение модератора

moderation.py
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 для всех прав).

Аккаунт: медленный режим, опрос и отложенный пост

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

account_admin.py
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.

channel_stats.py
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=...) у аккаунта.

Источники

  1. Telegram Bot API
  2. Telegram: Invite links and join requests
  3. Telegram: Channels, supergroups and basic groups
  4. Telegram: Scheduled messages
  5. Telegram: Channel statistics
  6. Telegram: Creating your Telegram Application

Связанные страницы