Авторизация в Telegram
Иногда нужно ограничить доступ к боту для определенного круга лиц.
Есть два способа реализовать это:
- Создать логин и пароль, которые будут вводить пользователи
- Ограничить доступ для определенного списка пользователей. Именно эту опцию мы рассмотрим в статье
Чтобы собрать список пользователей, для которых доступен бот, нужно собрать их username.
Username пользователя Telegram – это уникальный идентификатор аккаунта. Посмотреть его можно в настройках Telegram (Настройки –> Изменить профиль –> Имя пользователя). Либо вы можете попросить пользователей написать чат-боту. Так вы автоматически соберете их юзернеймы, отправив их себе в Telegram сообщением либо в Google Таблицу с помощью сервиса IFTTT.
Обратите внимание: Username – это не имя пользователя
Внимание! Если у вас в сценарии есть глобальный блок Интенты, то бот будет предоставлять пользователю информацию согласно реакциям из этого глобального блока. Решение – каждый раз после глобального блока проверять юзернейм пользователя.
Ограничить доступ средствами сценария
Вы можете настроить бот так, чтобы доступ к нему имели только определенные пользователи. Например те, username которых прописан в сценарии. Для этого в блоке Условия пропишите: $rawRequest.message.from.username === «username»
вместо username укажите юзернейм нужного пользователя (идентификатор аккаунта Telegram)
Если их username входит в список, то бот будет приветствовать их, а если нет, то сообщит, что доступ запрещен:

Также вы можете отправлять данные о том, что определенный пользователь воспользовался ботом, сообщением в Telegram по примеру этой статьи.
Либо можете отправлять данные в Google Таблицу с помощью сервиса IFTTT.
Используем Google Таблицы
Если у вас много пользователей Telegram, которым нужно предоставить доступ к боту, а остальным пользователям доступ запретить, вы можете хранить данные этих пользователей в Google Таблице.
Создайте Google Таблицу со списком юзернеймов
Первым делом создайте Google Таблицу со списком юзернеймов пользователей, которые будут иметь доступ к боту:

В таблице нужно перечислять именно юзернеймы пользователей (идентификаторы их аккаунтов), а не имена или телефоны
Опубликуйте таблицу
Чтобы опубликовать Google Таблицу, откройте меню Файл → Поделиться → Опубликовать в интернете (File → Share → Publish to web). Откроется окно, в котором нужно просто нажать на кнопку Опубликовать (Publish).
Создайте новый блок Условия
Создайте блок Условия со следующим содержимым:
Свяжите блок Условия с HTTP-запросом
Свяжите блок Условия с HTTP-запросом:

Содержимое HTTP-запроса
Укажите URL вида:
- Параметр указан внизу таблицы на вкладке листа таблицы.
- Параметр вы можете получить из URL таблицы:

На вкладке RESPONSE добавьте переменную $users со значением _.findWhere($httpResponse, ) .

Создайте новую связь с блоком Условия
Создайте связь с блоком Условия, в котором написано просто: $users .
Если в переменной $users что-то будет, то бот будет приветствовать пользователя, если нет – «Доступ запрещен». Вот как будет выглядеть цепочка экранов:

Вы также можете ознакомиться с подробной инструкцией о том, как обращаться к пользователям по имени и как использовать другие значения переменной $rawRequest .
Как ограничить доступ к боту телеграм?
Здравствуйте.
Есть некий бот, подскажите пожалуйста, каким образом разрешить ему доступ только определенным пользователям?
Интересует именно способ через белый список чат ид юзеров.
Если пишет человек, и его чат ид есть в списке, он может работать, если нет, тогда ничего не происходит, или будет ответ что у вас нет доступа к боту.
Спасибо.
- Вопрос задан более трёх лет назад
- 37156 просмотров
Комментировать
Решения вопроса 1
Использовать в начале хэндлер с проверкой на наличе id в переменной(или в чем то другом)
Пример для python + telebot
@bot.message_handler(func=lambda message: message.chat.id not in users) def some(message): bot.send_message(message.chat.id, "Sorry")
Ответ написан более трёх лет назад
enabl3 @enabl3 Автор вопроса
Скорее всего что то не так сделал.
Выдает ошибку
@bot.message_handler(func=lambda message: message.chat.id not in users)
NameError: global name ‘users’ is not defined
enabl3, users — переменная(список), в примере ее нет.
задается:
users = [‘id1’, ‘id2’ и т.д]
enabl3 @enabl3 Автор вопроса
sar0ka8, написал свой чатИД, перезапустил бота, а он мне отвечает Sorry, как и всем остальным кто ему пишет. Что еще может быть не так?
Нужно посмотреть в каком типе бот получает id int или str(на сколько я помню int), и проверить совпадает ли тип с значениями списка.
Возможно, что вы добавили не id, а username.
Это из того, что я могу придумать не видя код
enabl3 @enabl3 Автор вопроса
sar0ka8, в коде бота написал так:
users = [‘271868950’]
@bot.message_handler(func=lambda message: message.chat.id not in users)
def some(message):
bot.send_message(message.chat.id, «Sorry»)
Это тот ид что отдает мне curl
(ид изменил)
Проверил, id является числом(int), сейчас элементы users это строки. Правильный вариант:
users = [271868950]
Как ограничить доступ к выполнению команд?
Всех приветствую! Подскажите, как правильно или как лучше сделать ограничение по выполнению команд? Необходимо, чтобы по выполнению команды (проверка уже реализована и работает правильно) бот молчал.
def check_id(message): record = cursor.execute('SELECT * FROM table_table WHERE user_id=?', (id, )).fetchone() if record: return True else: return False @bot.message_handler(func=lambda message: check_id(message) == False, commands=['help', 'menu', 'start']) def some(message): bot.send_message(message.chat.id, 'Нельзя') #Необходимо заменить эту строку или сделать что-то другое. #Пустое сообщение бот отправить не может.
Отслеживать
задан 23 ноя 2021 в 10:02
33 1 1 серебряный знак 10 10 бронзовых знаков
Достаточно поставить pass, и программа ничего не будет делать при нужных условиях
23 ноя 2021 в 10:17
@ProgerOffline, буду благодарен, если покажете на примере как его поставить)
23 ноя 2021 в 11:23
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
# Ставим обрботчик на команду /start @bot.message_handler(commands=['start']) def process_start(message): if message.chat.id == "1": bot.send_message(1, "У вас есть права на данную команду") else: pass
Тут можно обойтись даже без else, просто если условине не верно, то ничего не произойдет.
# Ставим обрботчик на команду /start @bot.message_handler(commands=['start']) def process_start(message): if message.chat.id == "1": bot.send_message(1, "У вас есть права на данную команду")
Отслеживать
ответ дан 23 ноя 2021 в 17:23
ProgerOffline ProgerOffline
330 1 1 серебряный знак 8 8 бронзовых знаков
Спасибо за ответ, но у меня все хранится в БД. Да и хотелось бы сделать это все в одну функцию, чтобы на каждую команду не ставить if-ы. Сейчас моя функция работает, но хочется убрать из неё ответ или сделать так, чтобы бот молчал.
23 ноя 2021 в 20:22
Тогда вам стоит предоставить больше кода, чтобы мы понимали о чем идет речь
23 ноя 2021 в 20:28
Я дополнил код полностью. Работает, но нужно просто, чтобы бот не отвечал.
24 ноя 2021 в 9:34
Для начала, тебе придется это писать во всех командах (что глупо?)
Поэтому можно обойтись фильтрами:
from aiogram import types from aiogram.dispatcher.filters import BoundFilter class IsBanned(BoundFilter): key = "is_banned" def __init__(self, is_banned): self.is_banned = is_banned async def check(self, message: types.Message): with open("db.json", "r") as file: db = json.load(file) user_id = message.from_user.id if str(user_id) in db.get("banned_users", <>): return self.is_banned return not self.is_banned
from filters import IsBanned dp.filters_factory.bind(IsBanned) # Пропускаем не забаненных в боте @dp.message_handler(IsBanned(False), CommandStart()) async def handle_all_messages(message: types.Message): . code #что будет показывать забаненным в боте @dp.message_handler(IsBanned(True)) async def banned_user_handler(message: types.Message): await message.answer("Вы забанены в боте.")
В этом коде явно показано использование фильтра. В отличии от того, чтобы указывать в коде забаненных, можно воспользоваться бд.json
> "banned_users": < "6187889732": < "reason": "Banned by admin", "banned_by": 5776777607 >> >
Таким образом фильтр будет получать тех кто находится в словаре и не пропускать.
Проставляй IsBanned(False) в хендлеры всех команд, для того, чтобы не пропускать забаненных к использованию команд и все 🙂
Как заблокировать или разблокировать участника группы или канала в Telegram
С помощью чат-ботов Telegram вы можете заблокировать или разблокировать участника группы или канала. К примеру, вы можете заблокировать участников группы, от которых не поступила оплата за заказанный товар или услугу.
Заблокировать или разблокировать участников вы можете только в тех группах и каналах, где ваш чат-бот является администратором. Вы не можете заблокировать или разблокировать владельца группы или канала.
Содержание
Какие существуют группы и каналы в Telegram
В Telegram вы можете создать группу и канал. Группы и каналы могут быть частными и публичными. Дополнительно для частных групп вы можете включить историю чата — таким образом новые пользователи могут прочитать всю историю сообщений.
В зависимости от типа группы или канала, блокировка и разблокировка работает разными способами.
В таблице рассмотрим основные отличия групп и каналов Telegram.
| Особенность | Частная группа с выключенной историей чата | Частная группа с включенной историей чата | Публичная группа | Частный канал | Публичный канал |
| Публикация сообщений | могут публиковать все участники, сообщения подписываются именем участника группы | может публиковать только администратор, сообщения подписываются названием канала или настроенной подписью администратора | |||
| Доступ к профилям других участников | участники могут видеть профили друг друга | участники не могут видеть профили друг друга | |||
| Уведомления о новых участниках | отображаются для всех участников | отображаются только для администратора | |||
| История сообщений для новых участников | закрыта | доступ к сообщениям с момента создания группы или канала | |||
| Типы ссылок | ссылка-приглашение вида https://t.me/+a12bcEd3F45gH67i : постоянная, временная или с ограничением на число использований | публичная ссылка вида t.me/group_name или ссылка-приглашение вида https://t.me/+a12bcEd3F45gH67i : временная или с ограничением на число использований | ссылка-приглашение вида https://t.me/+a12bcEd3F45gH67i : постоянная, временная или с ограничением на число использований | публичная ссылка вида t.me/channel_name или ссылка-приглашение вида https://t.me/+a12bcEd3F45gH67i : временная или с ограничением на число использований | |
| Поиск | недоступна в поиске | недоступна в поиске | доступна в поиске | недоступен в поиске | доступен в поиске |
Как изменить тип группы и канала в Telegram
Чтобы изменить тип группы в Telegram, перейдите к настройкам вашей группы. В мобильном приложении нажмите на иконку группы в правом верхнем углу и выберите «Изменить». В десктопной версии приложения нажмите на три точки в правом верхнем углу и выберите «Управление группой».
Нажмите «Тип группы». Для типа «Частный» вы увидите ссылку-приглашение, которую можно отправлять пользователям. Для типа «Публичный» введите ссылку, по которой пользователи смогут перейти или найти группу в поиске.

Чтобы включить историю чата для частной группы, в настройках вашей группы нажмите «История чата» и выберите «Видна».

Чтобы изменить тип канала в Telegram, в настройках вашего канала нажмите «Изменить» и выберите «Тип канала». Для типа «Частная» вы увидите ссылку-приглашение, которую можно отправлять пользователям. Для типа «Публичная» введите ссылку, по которой пользователи смогут перейти или найти канал в поиске.

Как заблокировать участника группы или канала Telegram
Перетащите элемент «Действие» с левой панели в рабочую область. Соедините его с элементом, после выполнения которого нужно заблокировать участника. В нашем примере это «Фильтр».
Укажите действие «Заблокировать в группе или канале» и выберите группу или канал из списка.

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

Частная группа с включенной историей чата
Заблокированные участники частной группы с включенной историей чата будут удалены из группы и не смогут зайти по ссылке-приглашению или найти группу в поиске.

Публичная группа
Заблокированные участники публичной группы будут удалены из группы, не смогут зайти по публичной ссылке или ссылке-приглашению. Они смогут найти группу в поиске, но не смогут на нее подписаться.

Частный канал
Заблокированные участники частного канала будут удалены из канала и не смогут зайти по ссылке-приглашению или найти канал в поиске.

Публичный канал
Заблокированные участники публичного канала будут удалены из канала, не смогут зайти по публичной ссылке или ссылке-приглашению. Они смогут найти канал в поиске, но не смогут на него подписаться.

Как разблокировать участника группы или канала Telegram
Чтобы разблокировать участника, укажите действие «Разблокировать в группе или канале» и выберите группу или канал из списка.

Рекомендуем добавить блок «Сообщение» с публичной ссылкой или ссылкой-приглашением для входа в группу или канал после действия «Разблокировать в группе или канале», чтобы пользователь мог зайти в него после разблокировки.

Как работает разблокировка для группы и канала в Telegram
Частная группа
Разблокированные участники частной группы смогут зайти в группу по ссылке-приглашению и найти группу в поиске после подписки. Они не смогут просмотреть историю сообщений за тот период, когда были заблокированы.

Частная группа с включенной историей чата
Разблокированные участники частной группы с включенной историей чата смогут зайти в канал по ссылке-приглашению, найти группу в поиске после подписки, а также просмотреть историю сообщений за тот период, когда были заблокированы.

Публичная группа
Разблокированные участники публичной группы смогут зайти в группу по публичной ссылке или ссылке-приглашению, найти группу в поиске и подписаться, а также смогут просмотреть историю сообщений за тот период, когда были заблокированы.

Частный канал
Разблокированные участники частного канала смогут зайти в канал по ссылке-приглашению и просмотреть историю сообщений за тот период, когда были заблокированы, но не смогут найти канал в поиске до подписки.

Публичный канал
Разблокированные участники публичного канала смогут зайти в канал по публичной ссылке или ссылке-приглашению и просмотреть историю сообщений за тот период, когда были заблокированы, а также найти канал в поиске и подписаться.
