Как ограничить доступ к боту Telegram
Когда я отправляю сообщение своему Telegram-боту, он отвечает без проблем.
Я хочу ограничить доступ таким образом, чтобы я и только я могли отправлять ему сообщения.
Как я могу это сделать?
E.B 12 Фев 2016 в 20:18
7 ответов
Поскольку этот вопрос связан с python-telegram-bot, информация ниже связана с ним:
Когда вы добавляете обработчики в диспетчер вашего бота, вы можете указать различные предварительно созданные фильтры (подробнее читайте на странице документы, github), или вы можете создать собственные фильтры для фильтрации входящих обновлений.
Чтобы ограничить доступ конкретному пользователю, вам нужно добавить Filters.user(username=»@telegramusername») при инициализации обработчика, например:
dispatcher.add_handler(CommandHandler(«start», text_callback, Filters.user(username=»@username»)))
Этот обработчик примет команду /start только от пользователя с именем пользователя @username .
Вы также можете указать идентификатор пользователя вместо имени пользователя, что я настоятельно рекомендую, так как последнее непостоянно и может быть изменено с течением времени.
gyunter 22 Мар 2018 в 17:06
Фильтровать сообщения по полю update.message.from.id
ihoru 13 Фев 2016 в 04:54
На основе python-telegram-bot фрагментов кода, можно создать простую оболочку вокруг обработчика:
def restricted(func): """Restrict usage of func to allowed users only and replies if necessary""" @wraps(func) def wrapped(bot, update, *args, **kwargs): user_id = update.effective_user.id if user_id not in conf['restricted_ids']: print("WARNING: Unauthorized access denied for <>.".format(user_id)) update.message.reply_text('User disallowed.') return # quit function return func(bot, update, *args, **kwargs) return wrapped
Где conf[‘restricted_ids’] может быть списком идентификаторов, например. [11111111, 22222222] .
Таким образом, использование будет выглядеть так:
@restricted def bot_start(bot, update): """Send a message when the command /start is issued""" update.message.reply_text('Hi! This is <> speaking.'.format(bot.username))
Приведенное выше решение нельзя использовать для методов внутри классов (изменяются позиционные аргументы). Какое-то время я только что создал дополнительный декоратор для методов. Однако всегда нужно помнить, какой декоратор использовать, когда.
На основе этого решения можно создать следующий класс декоратора:
class restricted(object): """ Decorator class used to restrict usage of commands. Sends a "disallowed" reply if necessary. Works on functions and methods. """ def __init__(self, func): self._func = func self._obj = None self._wrapped = None def __call__(self, *args, **kwargs): if not self._wrapped: if self._obj: self._wrapped = self._wrap_method(self._func) self._wrapped = partial(self._wrapped, self._obj) else: self._wrapped = self._wrap_function(self._func) return self._wrapped(*args, **kwargs) def __get__(self, obj, type_=None): self._obj = obj return self def _wrap_method(self, method): # Wrapper called in case of a method @wraps(method) def inner(self, *args, **kwargs): # `self` is the *inner* class' `self` here user_id = args[0].effective_user.id # args[0]: update if user_id not in cfg.RESTRICTED_IDS: print(f'Unauthorized access denied on ' \ f'for : .') args[0].message.reply_text('User disallowed.') return None # quit handling command return method(self, *args, **kwargs) return inner def _wrap_function(self, function): # Wrapper called in case of a function @wraps(function) def inner(*args, **kwargs): # `self` would be the *restricted* class' `self` here user_id = args[0].effective_user.id # args[0]: update if user_id not in cfg.RESTRICTED_IDS: print(f'Unauthorized access denied on ' \ f'for : .') args[0].message.reply_text('User disallowed.') return None # quit handling command return function(*args, **kwargs) return inner
Затем это работает, как и ожидалось, для функций и методов. Он не совсем СУХОЙ (см. комментарии), но, по крайней мере, автономный.
Pronex 28 Апр 2021 в 15:54
У меня работает фильтрация по update.message.chat_id . Чтобы найти свой идентификатор чата, отправьте сообщение своему боту и перейдите к
https://api.telegram.org/bot$TOKEN/getUpdates
Где $TOKEN — токен бота, предоставленный BotFather, как указано в ответе fdicarlo, где вы можете найти идентификатор чата в структуре json.
Dave Reikher 8 Янв 2019 в 12:11
Начните разговор со своим ботом и отправьте ему сообщение. Это поставит в очередь обновления для бота, содержащие сообщение и идентификатор чата для вашего разговора.
Чтобы просмотреть последние обновления, вы вызываете метод getUpdates. Это делается путем отправки HTTP-запроса GET на URL-адрес https://api.telegram.org/bot $TOKEN/getUpdates Где $TOKEN — это токен, предоставленный BotFather. Что-то типа:
"chat":< "id":12345, "first_name":"Bob", "last_name":"Jones", "username":"bjones", "type":"private">, "date":1452933785, "text":"Hi there, bot!">>]>
После того, как вы определили свой идентификатор чата, вы можете написать фрагмент кода в своем боте, например:
id_a = [111111,2222222,3333333,4444444,5555555] def handle(msg): chat_id = msg['chat']['id'] command = msg['text'] sender = msg['from']['id'] if sender in id_a: [. ] else: bot.sendMessage(chat_id, 'Forbidden access!') bot.sendMessage(chat_id, sender)
fdicarlo 16 Дек 2016 в 16:20
В моем случае эта идея помогла, на самом деле логика довольно проста, может быть, вы найдете ее полезной. Я использовал модуль телебота:
# list with an id's, type int prmssn=[ 12345678,87654321 ] @bot.message_handler(content_types=['text']) def handle_text(message): # get the user's id of a last message u_id=message.chat.id # you can use print to find out an id's of those who're trying to write to your bot print(u_id) # we use a permission list to compare id, if id is in the perm. list bot is going to answer, otherwise it keeps silence if u_id in prmssn: # get user's message u_query=message.text.strip() # echo it back bot.send_message(message.chat.id, u_query)
Denis Aronson 25 Мар 2022 в 12:45
Я сам столкнулся с этим вопросом, поэтому подумал, что могу рассказать, как я сделал это с помощью Python python-телеграмма-бот. Итак, в новом выпуске (версия 20) [некоторые классы/функции изменились] вы можете сделать что-то вроде:
async def restrict(update: Update, context: ContextTypes.DEFAULT_TYPE): await context.bot.send_message( chat_id=update.effective_chat.id, text="There is no bot in Ba Sing Se." ) # Creating the Application application = ApplicationBuilder().token(TOKEN).build() # Restrict bot to the specified user_id restrict_handler = MessageHandler(~ filters.User(USER_ID), restrict) application.add_handler(restrict_handler)
См. учебник github для остальной части скаффолдинга, но это помещает ограниченный обработчик первым, используя фильтр, чтобы эффективно отключить доступ к любому пользователю, который не соответствует USER_ID, который вы ему передаете, и поскольку это первое, все другие обработчики не попадают.
Другие ответы хорошо работают, если вы хотите специально ограничить определенные действия, но это хорошо для общего ограничения. Вы также можете просто использовать фильтр внутри каждого действия, которое вы хотите ограничить.
Авторизация в 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 .
Как ограничить доступ к боту телеграм?
Здравствуйте.
Есть некий бот, подскажите пожалуйста, каким образом разрешить ему доступ только определенным пользователям?
Интересует именно способ через белый список чат ид юзеров.
Если пишет человек, и его чат ид есть в списке, он может работать, если нет, тогда ничего не происходит, или будет ответ что у вас нет доступа к боту.
Спасибо.
- Вопрос задан более трёх лет назад
- 37129 просмотров
Комментировать
Решения вопроса 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]
Ограничение доступа к боту в Телеграм
В данной статье мы разберем как ограничить доступ к боту в телеграме, чтобы только определенные пользователи имели к нему доступ.
Инструкция по интеграции бота в телеграм есть в статье: Как добавить бота в Telegram?
Простой способ — открытие доступа через сценарий
При использовании данного способа для открытия пользователю доступа к боту придется редактировать сценарий, добавляя новое условие для каждого отдельного пользователя.
Руководство
1. В начале сценария установите блок Информация, с помощью которого можно вывести идентификатор пользователя в чат.
В поле Информационное сообщение введите системную переменную . В данной переменной хранится идентификатор пользователя телеграм.

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

3. В стрелке, идущей в продолжение диалога, укажите следующие параметры:
где X — ваш идентификатор. Идентификатор можно получить если интегрировать данный сценарий в телеграм бота, и запустить его. Первым сообщением бот напишет вам идентификатор.
Либо используйте этого телеграм бота с помощью команды /getid.
Во второй стрелке установите тип выходных данных По умолчанию

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

Пример работы


Продвинутый способ — открытие доступа через команду бота в Telegram
В случае, если вам необходимо иметь возможность открывать и закрывать доступ пользователям с помощью диалога с самим ботом, т.е. без редактирования сценария, понадобится собрать более сложный сценарий.
Фрагмент сценария

Параметры блоков и стрелок

1. В начале сценария создайте блок Информация, с помощью которого можно вывести идентификатор пользователя в чат. В поле Информационное сообщение введите системную переменную .
В данной переменной хранится идентификатор пользователя телеграм.
2. Установите блок Результат и выполните действия:
- Присвойте переменной uid значение: ,
- Выберите тип действия Без действия.

Это необходимо для дальнейшего использования идентификатора в операциях с фактами бота.
3. Создайте блок арифметики и выполните действия:
- Установите тип Произвольный тип,
- в поле BPL-выражение вставьте следующий код:
$reg = fact.load("userId", $uid, @botId)
- Нажмите кнопку Преобразовать BPL в AST
С помощью данной операции бот попытается загрузить факт, содержащий идентификатор пользователя, из своей базы фактов.
В случае, если идентификатор пользователя, ведущего диалог с ботом будет найден в базе фактов — в переменную reg запишется этот идентификатор.
Если в базе такого идентификатора нет — переменная reg будет пустой.

4. Создайте блок условия с двумя ветками — первая ветка идет на блок Информация, вторая — на блок Вопрос.

В стрелке, идущей на блок Информация, установите тип По умолчанию.

В стрелке, идущей на блок вопроса, выберите:
С помощью данного условия выполняется проверка наличия содержимого переменной reg.
Если она не пустая, значит идентификатор пользователя был найден в базе фактов, и доступ к дальнейшему диалогу с ботом открыт.

5. Из блока Вопрос создайте еще две ветки к двум новым блокам Вопрос — данные ветки нужны для команд открытия и закрытия доступа для определенного пользователя.

В первой ветке нужно обработать команду открытия доступа. Для этого в параметрах стрелки необходимо выбрать тип выходных данных Ключевые слова, и в поле ключевых слов добавить команду /adduser.
Таким образом переход в эту ветку будет осуществлен только при вводе этой команды.

Во второй стрелке все аналогично первой, но в поле ключевых слов необходимо ввести команду /deluser.

6. Ветки с командами идентичны, и состоят из блока Вопрос, блока Арифметическая операция и блока Информация.
В блоке Вопрос запрашивается идентификатор пользователя, которому необходимо открыть или закрыть доступ.

В стрелке, идущей после блока Вопрос, сохраните введенный пользователем идентификатор, поставив галочку Сохранить ответ, и введя поле Название переменной переменную user.

В блоке арифметики необходимо установить тип Произвольный тип, и в поле BPL-выражение внести следующие выражения:
В ветке для открытия доступа:
fact.save("userId", $user, $user, @botId)
Данная операция сохраняет идентификатор в базу фактов бота.

В ветке для закрытия доступа: