Python으로 텔레그램 챗봇 만들기

1 minute read

Python으로 텔레그램 챗봇 만들기

포스팅 시간 기준 아래 버전들로 테스트 하였습니다.

( Windows 10 , Python 3.7.7 )
PS C:\Users\KWON> python --version
Python 3.7.7

텔레그램 봇 만들기

텔레그램 봇 만들기에 대한 방법들은 여러 블로그에서 소개 되고 있기 때문에 이 부분은 생략하고자 합니다.

최종적으로 만든 챗본은 SRT 예약 챗봇입니다. SRT 챗봇

사용한 모듈은 telepot, SRTrain이며 실제 구현 예를 가지고 설명하도록 하겠습니다.


챗봇 구성 요소

챗봇을 구현하기 위해 기본적으로 telepot의 glance함수를 이해해야 합니다.

glance 함수는 텔레그램 Bot API의 getUpdates로 받은 아래 응답값을 사용자가 컨트롤 하기 쉽게 만들어 줍니다.

[
    {'message': 
        {'chat': '
            {   'first_name': 'Nick',
                'id': 999999999,
                'type': 'private'},
                'date': 1465283242,
                'from': 
                    {'first_name': 'Nick', 'id': 999999999},
                'message_id': 10772,
                'text': 'Hello'},
        'update_id': 100000000}
]

glance 기본

glance 기본은 사용자가 입력하는 Text를 처리합니다.

봇을 부른다거나 어떤 입력값을 입력 해야할 때 사용합니다.

SRT 봇을 예로들면 사용자 ID를 입력받아 오브젝트에 저장하는 경우

ID/PW 조합은 정형화 되기 어렵기 때문에 사용자의 입력을 요구하게 됩니다.

login_pattern = re.compile(r"[a-zA-Z0-9-.@]+[/].+")
reserve_pattern = re.compile(r"[\u3131-\u3163\uac00-\ud7a3]+[/][\u3131-\u3163\uac00-\ud7a3]+[/]\d{8}[/]\d{6}")

content_type, chat_type, chat_id = telepot.glance(msg)
if content_type == 'text':
    if login_pattern.match(msg['text']):
        ...
    elif reserve_pattern.match(msg['text']):
        ...

ID_12345/PW_12345 와 같이 사용자에게 텍스트로 입력을 요청합니다.

해당 입력값들을 정규식에 맞게 입력했는지 확인후에 값을 처리하도록 구현하면 됩니다.


glance callback

glance callback은 질문에 대한 답이 고정적일때 사용합니다.

사용자 예약사항을 입력받아 시간표를 한다고 하면

시간표 배열에서 몇번째 선택 처럼 입력을 특정 할 수 있습니다.

그런 경우 사용자 callback 데이터를 처리 하도록 구현 하면 됩니다.

물론 모든 경우를 다 callback으로 구현 할 수 있지만 앱이 아니기 때문에

사용자 입력을 하나하나 처리하는게 쉽지 않습니다.

# 사용자 선택을 데이터로 넘겨줄 키보드 구현
startKeyboard = 
    InlineKeyboardMarkup(inline_keyboard=[
            [InlineKeyboardButton(text='1. 예약', callback_data='reserve')]
        })

# 사용자에게 응답 메시지와 callback 값을 전달할 키보드 전달
bot.sendMessage(chat_id,startMsg, reply_markup=startKeyboard)

glance callback 처리

callback 데이터 처리를 위해 glance에 flavor 옵션을 주어

callback으로 넘어온 데이터를 따로 처리합니다.

def reserve_query(msg): 
    query_id, from_id, query_data = telepot.glance(msg, flavor='callback_query')

    if query_data == 'reserve':
        ...
    elif query_data == 'refers':
        ...

결론

결론적으로 현재 챗봇의 구현 방법을 보면

  1. 봇 시작
  2. 예약, 조회 등 메뉴 선택 ( callback 쿼리 )
  3. 선택 메뉴 callback 데이터 받아서 처리 ( ID/PW 입력, 예약할 기차 정보 사용자에게 요청 )
  4. 입력받은 텍스트 처리, 데이터 저장 ( 세션 생성, 시간표 조회 등 )
  5. 예약, 조회 한 내용 처리에 대한 전달 ( callback 쿼리 )
  6. callback 쿼리 처리
  7. 반복

위 단계로 구성하여 SRT 기차를 예약하는 챗봇을 만들어 봤습니다.

챗봇과 관련된 궁금증은 언제든 telegram : chocodotz로 연락 주시기 바랍니다.

Leave a comment