Бот обещает подарок за подписку, человек жмёт «Я подписался», а бот отвечает, что подписки нет. Или наоборот: подарок забрали и сразу вышли из канала. Проверка подписки на канал в боте устроена просто, но держится на нескольких условиях Telegram. Ниже о том, как она работает, какие права нужны боту и что делать с закрытым каналом, заявками и отпиской.
Как бот проверяет подписку
Бот спрашивает у Telegram, в каком статусе человек состоит в канале. Ответ приходит сразу и описывает состояние в момент запроса.
Статусов шесть: владелец, администратор, подписчик, ограничен, вышел и удалён. Статус «ограничен» в документации относится только к группам. Для канала подпиской считаются первые три: владелец, администратор и обычный подписчик. «Вышел» и «удалён» значат, что человека в канале сейчас нет.
Штатной галочки «пускать в бота только подписчиков» в Telegram нет. Проверку подписки на канал делает сам бот: в нужный момент он запрашивает статус и решает, что ответить.
Отсюда главное следствие. Бот проверки подписки знает о человеке только то, что Telegram сообщил ему в момент запроса. Он не помнит, был ли человек подписан вчера, и не следит за каналом между проверками. Всё, что происходит до и после нажатия кнопки, нужно продумать в сценарии заранее: когда проверять, что выдавать и как быть, если человек уйдёт.
Две кнопки: «Подписаться» и «Я подписался»
Обычно под сообщением бота стоят две кнопки. Первая открывает канал. О нажатии такой кнопки бот не узнаёт: она просто ведёт по ссылке.
Вторая кнопка, «Я подписался», отправляет боту сигнал. Бот видит, кто именно её нажал, и проверяет статус этого человека в канале.
Если подписки нет, ответ удобно показать всплывающим окном вверху экрана. Тогда в чате не копятся одинаковые сообщения «вы ещё не подписаны». Ждать минуту перед проверкой не нужно: статус виден сразу после подписки. Пауза имеет смысл, только если вы хотите дать человеку время прочитать пост.
Какие права нужны боту в канале
Telegram гарантирует, что проверка работает, только если бот администратор этого канала. Поэтому первым делом бота добавляют в администраторы.
Все права подряд ему давать не нужно. Публиковать посты, удалять сообщения и назначать других администраторов для проверки не требуется. Если канал работает по заявкам и бот должен их принимать, нужно право приглашать пользователей. Какие права дать боту под каждую задачу, разобрано в статье про боты для телеграм канала.
Без прав администратора результат не гарантирован. Бот может получить ошибку или неверный ответ, и человек не получит обещанное.
Публичный и закрытый канал
У публичного канала есть @имя, по нему бот и обращается к каналу. У закрытого канала @имени нет, туда попадают только по ссылке-приглашению. Бот проверяет такой канал по числовому номеру, который начинается с минуса.
Проверка подписки на закрытый канал работает так же, как на публичный, если бот в нём администратор. Частые поломки здесь две: бота забыли добавить в канал или номер канала указали без минуса. В обоих случаях бот отвечает, что канал не найден.
Канал по заявкам: подписка начинается после одобрения
Если вход в канал идёт через заявки, человек сначала просится в канал и ждёт. Пока заявка не одобрена, он ещё не участник, и проверка подписки на канал «да» не даст. Отдельного статуса «ждёт одобрения» в ответе Telegram нет.
Решений два. Первое: бот сам принимает заявки, тогда человек становится подписчиком почти сразу. Второе: подарок выдаётся только после одобрения, и человеку честно пишут, что придётся подождать.
Заявка даёт боту ещё одну возможность: написать человеку в личку в течение 5 минут, даже если тот ещё не запускал бота. Как это устроено, описано в статье про автоприём заявок.
Подписка на канал партнёра
Иногда подарок дают за подписку на канал партнёра или на несколько каналов сразу. Правило то же: бот должен быть администратором в каждом канале, который проверяет.
Добавить вашего бота в администраторы может только тот, кто управляет каналом. Значит, о таком условии договариваются с владельцем партнёрского канала заранее. Если каналов несколько, бот проверяет каждый по отдельности, и подписка засчитывается, только когда человек есть во всех.
Человек забрал подарок и отписался
Выданное вернуть нельзя. Файл, ссылка или промокод, которые бот отправил в чат, остаются у человека, даже если он вышел из канала через минуту.
Узнать о выходе бот может, но не сам по себе. Нужны два условия: бот администратор канала и он включил получение событий о входе и выходе участников. По умолчанию Telegram такие события боту не присылает.
Написать ушедшему можно, если он раньше запускал бота и не остановил его. Лучше одно спокойное сообщение со ссылкой обратно на канал. Серия напоминаний похожа на спам, а правила Telegram запрещают боту докучать людям непрошеными сообщениями. Если человек остановил бота, Telegram сообщит об этом, и писать ему больше нельзя.
Повторная проверка и выдача частями
Проверка показывает только то, что есть сейчас. Подписался человек вчера или ушёл час назад, бот узнает только при следующем запросе.
Если вам важно, чтобы человек остался в канале, а не только зашёл, выдавайте ценное частями. Первую часть сразу после подписки, следующие через день или два, и перед каждой проверяйте подписку снова. Такую цепочку удобно собрать как воронку в боте с паузами и условиями.
Второй вариант: вместо файла дать ссылку-приглашение в закрытый канал с материалами. Кто выйдет, перестанет видеть новые посты, а вернуться сможет только по новой ссылке.
Почему бот пишет «не подписан» подписчику
Если человек подписан, а бот твердит обратное, почти всегда причина одна из этих:
- Бот не администратор канала. Без прав администратора ответ не гарантирован.
- Не тот канал. В настройках указан другой канал, или у закрытого канала номер без минуса.
- Заявка ещё не одобрена. Человек нажал «Подписаться», подал заявку, но в канал его пока не пустили.
- Проверяют не того человека. В самописном боте вместо нажавшего кнопку проверяют автора сообщения, то есть самого бота.
- Кнопку нажали раньше времени. Человек нажал «Я подписался», не дойдя до кнопки «Подписаться» в канале.
Первые три причины решаются настройками канала. Четвёртая только правкой кода, поэтому в конструкторах её обычно нет.
Проверка подписки в Конструкторе ботов SocialTraff
В Конструкторе ботов SocialTraff вы подключаете своего бота: создаёте его у BotFather и вставляете токен. Бот остаётся вашим, и подписчики остаются в вашем боте. Как получить токен, описано в статье про токен бота.
Для подарка за подписку в Конструкторе есть заготовка «Подписка на канал». Она проверяет подписку и только потом отдаёт подарок. Заготовка открывается схемой, её можно поправить: поменять текст, добавить паузу, условие или предложение. По правилам Telegram надёжная проверка подписки на канал работает, когда ваш бот администратор этого канала, так что добавьте его в администраторы до запуска.
Если после подарка нужно собрать имя или телефон, к сценарию добавляют анкету, как в статье про бот для заявок.
Частые вопросы
Может ли бот проверить подписку без прав администратора?
Telegram гарантирует работу проверки, только если бот администратор канала. Без этого результат не гарантирован, поэтому бота добавляют в администраторы.
Какие права дать боту для проверки подписки?
Достаточно сделать его администратором, публиковать посты ему не нужно. Если канал по заявкам и бот их принимает, добавьте право приглашать пользователей.
Работает ли проверка подписки на закрытый канал?
Да, если бот администратор этого канала. Проверка идёт по числовому номеру канала, а не по @имени.
Засчитается ли подписка, если человек подал заявку?
Пока заявка не одобрена, человек ещё не в канале. Подарок стоит выдавать после одобрения или принимать заявки ботом.
Что будет, если человек отпишется после подарка?
Выданное вернуть нельзя. Бот-администратор может узнать о выходе и, если человек раньше запускал бота, написать ему со ссылкой обратно.
Можно ли проверить подписку на чужой канал?
Только если ваш бот администратор и в нём. Это решает владелец того канала.