봇 응답 제한(봇이 동작 하는 채팅방 제한) 하기
1. 텔래그램 Bot 은 기본적으로 공개 입니다.
텔래그램 Bot 은 기본적으로 공개입니다. 그냥 Bot 검색 > 사용 하면 됩니다.
나의 Bot 은 비공개인데 ? 라고 혼동을 하고 있다면, Bot 을 임의 비공개 대화방 또는 채널을 참여 시켜 놓고
그 공간에서만 사용을 하고 있으니, 내 Bot 은 비공개다? 라고 생각 하는건 아닐까요?
텔래그램 > 연락처 > 검색만 해보아도, 수많은 Bot 이 나옵니다.
내껀 나만 쓰고 있는데? 다른 사람도 불러다가 사용 할 수 있습니다.


2.Bot 의 응답 제한을 위해 제공 하는 기능은 없는 것 같습니다.
자체적으로 Bot 을 제한 하는 방법은 없고 만들어야 합니다.
3.만들어 보자. Bot 의 권한/응답을 제어 하기 위해 필요 정보는?
Bot 응답, 사용 권한을 제어 하기 위한 필요 정보는 아래 2개만 있으면 됩니다.
- Bot 을 동작 시킬 (동작을 제한 할) chat id 를 알아야 합니다.
- 봇 서버 에서 > 봇이 응답할 chat id 를 검증 하는 코드를 작성 하고 넣어 주면 됩니다.
4.Bot 이 참여 되어 있는 chat id 확인 하겠습니다.
브라우저 주소 입력창에 https://api.telegram.org/bot봇Token값/getUpdates 를 입력 합니다.
[request]
https://api.telegram.org/bot봇Token값/getUpdates
[response]
..
...
{"ok":true,"result":[{"update_id":178332702,
"message":{"message_id":1,"from":{"id":879500000,"is_bot":false,"first_name"
여기서 "from":{"id":879500000, 부분의 8795로 시작하는 9자리의 숫자가 참가 되어 있는 chat id 입니다.
5.Bot 이 특정 chat id 에서만 응답하도록 코드를 만듭니다.
텔래그램 Bot 은 봇 서버를 통하여 명령어 (command) 를 받고, 명령어를 처리 하는 형태입니다.
그러므로 봇 서버에서 Bot 이 응답 할 수 있는 chat id 를 제한 하도록 코드를 작성 하면 됩니다.
코드를 구현 하는 방법은 다양하므로 정답은 없습니다.
아래는 파이썬 decorator 로 구현하여, 명령어 (command) 별로 Bot 의 응답(동작) 을 제한 합니다.
decorator 이므로, 명령어 앞에 붙여주기만 하면 끝납니다.
..
...
....
def confirm_bot_authorize(func):
@wraps(func)
def wrapped(update, context, *args, **kwargs):
user_id = update.effective_user.id
chat_id = update.effective_chat.id
if not str(chat_id) in conf.settings.ENABLES_CHAT_ROOMS:
print(f"Unauthorized access denied for {chat_id}.")
#message = 'Sorry, You Are Not Allowed to Access This Page'
message = 'Oops.!\n\n Sorry, bot has been restricted on this room (%s).' % chat_id
context.bot.send_message(chat_id=update.effective_chat.id, text=message)
return
return func(update, context, *args, **kwargs)
return wrapped
# confirm_bot_authorize 가 없으므로 누구나 사용 가능
def echo(update: Update, context: CallbackContext) -> None:
"""Echo the user message."""
update.message.reply_text(update.message.text)
# confirm_bot_authorize 가 있으므로 지정된 chat id 에서만 동작
@confirm_bot_authorize
def whoami_command(update: Update, context: CallbackContext) -> None:
run_command("whoami")
update.message.reply_text(textoutput)
@confirm_bot_authorize
def hostname_command(update: Update, context: CallbackContext) -> None:
run_command("hostname")
update.message.reply_text(textoutput)
위에서 conf.settings.ENABLES_CHAT_ROOMS 은 chat id 가 들어 있는 변수 입니다.
# Bot 이 동작할 chat id 목록
ENABLES_CHAT_ROOMS = ['-617857153', '-134005657']
이렇게 적용 하고 > Bot 서버를 재 시작 해봅니다.
그리고 Bot 을 사용이 임의 chat id (ex 신규 대화방을 만들고 Bot 추가) 에서 Bot 을 참가시킨 후
커맨드가 동작되나 확인 하면 됩니다.
지금도 잘 사용 하는 코드입니다.
끝