봇 응답 제한(봇이 동작 하는 채팅방 제한) 하기

 

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 을 참가시킨 후 

커맨드가 동작되나 확인 하면 됩니다.


지금도 잘 사용 하는 코드입니다.