본문 바로가기
개발/AWS

[AWS] AWS Lambda + API Gateway와 카카오 오픈빌더로 급식 메뉴 챗봇 만들기

by 유다110 2019. 5. 26.
반응형

서론;

카카오 오픈빌더는 현재 OBT라 사용 사례가 그닥 많지 않다. 때문에 오픈빌더 공식 문서와 함께 약간의 삽질이 필요했다.

내가 오픈빌더에서 하고자 했던 건, "사용자가 급식 메뉴를 물어보았을 때 API로 date 값을 넘겨 menu를 받아오는 것"이다. 오픈빌더에서는 스킬이라는 항목을 이용해 API POST 요청(반드시 POST)을 보낸 뒤 응답을 받아올 수 있다.

 

API를 만드는 방법은 다양하나 난 익숙한 AWS Lambda + API Gateway를 택했다. API 제작은 얼마 전 간단한 예시로 포스팅을 올린 적 있다. ([AWS] Lambda 프록시 통합을 사용하여 API Gateway로 간단한 곱셈 API 만들기)

이 글은 AWS Lambda와 API Gateway로 (혹은 다른 방법으로) API를 만들었다 가정하고 진행한다. 

 


1. 챗봇 설정

0. 카카오 오픈빌더 계정을 만들고 플러스 친구를 만든다.

오픈빌더 준비하기

카카오 플러스친구 관리자센터

 

OBT라 신청 심사를 받아야 하니 나중에 사용할 예정이라도 미리미리 신청해두자. 보통 2-3일 정도 걸리는 듯하다.

 

 

1. 카카오톡 챗봇을 생성하고 플러스친구를 연결한다.

 

챗봇 생성 뒤, '설정'에 들어가면 플러스친구 계정을 연결할 수 있다.

 

 

2. 시나리오 블록을 만들고 발화 패턴을 몇 가지 입력한다.

UI가 직관적이라 그리 어렵진 않을 것이다. 이 정도는 공식 문서를 안 보고도 대충 알 수 있다.

 

 

3. 날짜 엔티티를 적용한다.

'내일', '오늘' 등의 문자를 더블클릭하면 엔티티를 적용할 수 있다. 날짜나 도시 등은 카카오 오픈빌더에 기본 엔티티가 있어 편리하다. 엔티티를 직접 제작할 수도 있다.

 

난 '급식'이라는 단어 말고도 '밥, ㄱㅅ, 메뉴' 등에도 챗봇이 반응할 수 있도록 엔티티를 하나 추가했다.

 


 

2. API 설정

0. 오픈빌더 스킬에서 API 연동하기

URL에 내 API 주소를 입력한다. 혹 API 키가 있다면 헤더에 입력해줄것!

 

 

1. 스킬 테스트를 해보며 내 파라미터가 어떤 식으로 들어가는지 확인한다.

스킬 테스트를 해보면 오른쪽에서 request body를 볼 수 있다. 나는 날짜 데이터를 받아 급식 메뉴를 가져올 것이므로 date 파라미터를 주었는데 주의할 것은 이때 body가 

{"date": "20190502"}

이런 식으로 들어가는 게 아니라, 다음처럼 들어간다는 거다!

{
  "intent": {
    "id": "5qydt25buahtkmgk4wcd8n9u",
    "name": "블록 이름"
  },
  "userRequest": {
    "timezone": "Asia/Seoul",
    "params": {
      "ignoreMe": "true"
    },
    "block": {
      "id": "5qydt25buahtkmgk4wcd8n9u",
      "name": "블록 이름"
    },
    "utterance": "발화 내용",
    "lang": null,
    "user": {
      "id": "962656",
      "type": "accountId",
      "properties": {}
    }
  },
  "bot": {
    "id": "5cbc1c31e821270bd1ef8948",
    "name": "봇 이름"
  },
  "action": {
    "name": "12jsmof4k5",
    "clientExtra": null,
    "params": {
      "date": "20190502"
    },
    "id": "8c7nrvx9tfv5ww3dugiauf7k",
    "detailParams": {
      "date": {
        "origin": "20190502",
        "value": "20190502",
        "groupName": ""
      }
    }
  }
}

각 항목에 대한 설명은 오픈빌더 문서에서 Skill Payload를 보면 알 수 있다. 어쨌든 API에서 내가 넣은 date 파라미터에 접근하려면 무조건 action > params을 거쳐야 한다.

 

 

2. API에서 카카오 스킬 body 파라미터 받기

(아래 코드는 AWS Lambda(Python3.6) 기준이니 각 플랫폼이나 언어에 따라 코드 구현은 조금씩 다를 것이다.)

...

def lambda_handler(event, context):
    request_body = json.loads(event['body'])   # request body 받음
    params = request_body['action']['params']  # action > params로 파라미터에 접근
    date_obj = json.loads(params['date'])      # 날짜 엔티티를 적용했을 경우 date가 객체로 넘어오기 때문에 파싱
    date = date_obj["date"]                    # date 객체에서 "yyyy-mm-dd" 형식의 date 데이터 추출
    date = date.replace("-", "")
    
	...

참고로 나는 날짜 텍스트 대신 날짜 엔티티를 사용했기 때문에 한 번 더 가공 작업을 거쳐야 했다. 카카오의 엔티티를 사용하니 날짜 데이터가 다음과 같이 넘어왔기 때문이다.

{
    "year":null,
    "dateTag":"tomorrow",
    "dateHeadword":null,
    "date":"2019-05-27",
    "day":null,
    "month":null
}

만약 엔티티를 따로 사용하지 않았다면 그냥 params["my_data"] 이렇게만 받아와도 괜찮을 거다.

 

 

3. 스킬 응답하기

스킬 응답은 카카오 오픈빌더의 기준을 따라야 한다. 응답 항목은 크게 version, template, context, data 네 가지가 있다.(응답항목 문서이 중 version은 명시해주지 않을 경우 구버전으로 간주되기 때문에 반드시 포함되어야 한다. 현재 카카오 스킬의 최신 버전은 2.0이다.

나는 간단하게 메뉴 텍스트만 출력해줄 거라 data를 사용했다. 

import json

def lambda_handler(event, context):
    ...
    
    result = {
        "version": "2.0",
        "data": {
            "menu": menu
          }
    }
    
    return {
        'statusCode': 200,
        'body': json.dumps(result),
        'headers': {
          'Access-Control-Allow-Origin': '*',
        },
    }

 

4. 응답 데이터로 챗봇 응답 설정하기

{{#webhook.my_data}} 식으로 응답으로 넘겨준 data를 가져올 수 있다.

 

 

5. 테스트 및 배포

오른쪽 위의 봇테스트 버튼을 눌러 잘 작동하는지 확인한 뒤, 만족스럽다면 배포한다.

그 뒤 플러스 친구 추가를 하고 실환경에서 잘 돌아가는지 보자!

 

읽지 않아도 되는 마무리

좀 두서없이 적어서 보기 불편했을지도 모르겠다😭😭

처음부터 끝까지 튜토리얼을 만들기에는 무리가 있어 내가 헷갈렸던 부분 위주로 적었다.

나중에 짬이 나면 급식 크롤링부터 API 제작, 챗봇 연결 등을 전부 포함한 가이드를 만들어볼까 생각중이다!

반응형

댓글