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

Обновление участника чата

Обновление участника чата — это событие Bot API, которое сообщает об изменении статуса человека в чате: вступление, выход, бан, повышение до администратора. Оно приходит как объект ChatMemberUpdated со старым и новым статусом участника, временем изменения и, для вступления по пригласительной ссылке, самой ссылкой. Telegram не присылает его по умолчанию, поэтому бот должен запросить тип обновления chat_member и быть администратором чата.

Что содержит обновление

Объект ChatMemberUpdated содержит чат, пользователя, выполнившего действие, дату изменения в Unix-времени, прежнюю запись участника и новую запись участника. Два необязательных поля описывают, как человек пришёл: invite_link называет ChatInviteLink, которым он воспользовался, а via_join_request равно true, когда администратор одобрил прямой запрос на вступление. Запись участника имеет один из шести типов: владелец, администратор, участник, ограниченный, вышедший и заблокированный. Вступление — это переход из статуса «вышел» или от отсутствия записи к статусу «участник». Сравнение старого и нового статуса позволяет отличить вступление от повышения или исключения.

Оно выключено, пока его не запросить

Когда бот регистрирует вебхук или опрашивает getUpdates с пустым списком allowed_updates, Telegram присылает все типы обновлений, кроме chat_member, message_reaction и message_reaction_count. Чтобы получать chat_member, бот должен явно указать chat_member в allowed_updates и быть администратором чата. Бот, который зарегистрировал вебхук до того, как запросил этот тип, ничего не получает и не видит ошибки, поэтому признак отсутствующей подписки — нулевое число вступлений, похожее на тихую неделю. Связанное обновление my_chat_member сообщает об изменении статуса самого бота, например когда его добавили администратором или удалили.

Как это использует Autogram

Autogram подписывает свой вебхук Telegram на обновления message, my_chat_member и chat_member. Он читает chat_member, чтобы относить вступления к именованным пригласительным ссылкам. Он игнорирует каждое обновление без invite_link — это вступления через публичный username канала, выходы, исключения и повышения — и отбрасывает обновления для чатов, которые ни один пользователь Autogram не подключал. Человека он считает присутствующим, когда новый статус — member, administrator или creator. Время вступления он берёт из поля date обновления, а не из момента получения запроса, поэтому обновление, которое Telegram повторно доставил после сбоя, всё равно показывает, когда человек действительно вступил.

Ограничения, которые стоит учесть

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

Примените эти понятия на практике

Автоматизируйте публикацию в Telegram с помощью AI-контента, оценки качества и умного планирования.