안경잡이개발자

728x90
반응형

다이얼로그 플로우(Diaolg Flow)와 플라스크(Flask)를 카카오톡 플러스친구에 연동하기


  지난 시간에는 다이얼로그 플로우(Dialog Flow)와 플라스크(Flask) 웹 서버와 연동하는 방법에 대해 알아보는 시간을 가졌습니다. 이번 시간에는 플라스크 웹 서버와 카카오톡 플러스 친구를 연동하는 방법을 알아보도록 하겠습니다.


※ 카카오톡 플러스친구 만들기 ※


  ▶ 플러스친구 관리자 센터: https://center-pf.kakao.com/


  당연히 카카오톡 플러스친구부터 만들어야 합니다. 위 사이트에 접속한 뒤에 로그인을 하시고 '플러스친구 만들기'를 누르시면 됩니다.



  기본적으로 플러스친구 관리자로 가입을 하셔야 자신의 플러스친구를 제대로 관리할 수 있습니다.




  이후에 저는 다음과 같이 'my_flask_test'라는 이름으로 플러스친구를 개설보았습니다.



  위와 같이 간단하게 이름만 설정하고 바로 생성할 수 있습니다.



  이후에 기본적으로 플러스친구는 비공개 설정이 되어 있으므로 '공개 설정하러 가기'를 눌러 공개 설정을 해주셔야 합니다.



  이후에 위와 같이 '홈 공개'와 '검색 허용'ON으로 설정해주시면 됩니다.



  이제 '스마트채팅' 탭에서 'API형'으로 설정해주시면 됩니다. API 형으로 설정하면 자유자재로 우리가 원하는 형태로 카카오톡 플러스 친구를 개발할 수 있습니다. 대신 우리의 전용 웹 API를 직접 개발해야 하지만 그만큼 활용도가 매우 높아집니다. 즉, 지난 시간에 만들었던 것과 같이 플라스크(Flask) 웹 서버 등을 직접 만들 수 있는 사람이 사용할 수 있는 선택지입니다.


※ 구름 IDE에서 플라스크 웹 서버 구현하기 ※


  구름 IDE 서비스: https://ide.goorm.io/


  구름 IDE 서비스는 제가 현재 알고 있는 클라우드 서비스 중에서 가장 쉽고 빠르게 테스트 목적의 웹 서버를 구축할 수 있는 서비스입니다. 실제로 사용해 보시면 순식간에 일정 시간 동안 사용할 수 있는 공인 IP 주소와 웹 서비스를 구축할 수 있습니다. (무료 버전에서는 시간 제한이 있습니다.)


  바로 구름 IDE 서비스에 접속하신 이후에 회원가입 및 로그인을 하시고 'Flask 프로젝트'로 새로운 컨테이너를 생성해주시면 됩니다.



  만든 이후에는 index.py 파일이 기본적으로 생성이 되어 있습니다. 'python index.py 5000' 명령어로 서버를 구동시킬 수 있습니다. 기본적으로 플라스크는 5000번 포트로 동작시킵니다.



  그러면 다음과 같이 서버가 동작이 되고 있다는 메시지가 출력됩니다.



  이후에 구름 IDE는 '포트포워딩' 설정을 해주셔야 외부에서 공인 IP로 접속할 수 있습니다.



  저는 위와 같이 내부 포트 5000번을 열어주어서 13.124.201.44:57706으로 접속할 수 있게 되었습니다.



  실제로 위와 같이 접속해보니 환영 메시지가 출려된 것을 확인할 수 있었습니다.


※ 카카오톡 플러스친구와 연동하기 ※


  카카오톡 플러스친구를 웹 서버와 바로 연동하기 위해서는 두 가지 중요한 API 키워드만 알고 있으면 됩니다. 구체적인 내용은 다음과 같이 API 명세서에서 확인할 수 있습니다.




  요약하면 두 가지 키워드는 'keyboard'와 'message'입니다. keyboard는 이용자가 최초로 채팅방에 들어올 때 명령어의 목록을 보여줄 때 사용하는 기능입니다. message는 실질적으로 사용자가 입력한 명령어를 웹 서버가 처리하도록 해주는 기능입니다. 따라서 기존의 소스코드에 다음의 두 가지 처리 로직을 추가해주시면 됩니다.


@app.route("/keyboard")

def keyboard():


    res = {

        'type': 'buttons',

        'buttons': ['대화하기']

    }


    return jsonify(res)


@app.route('/message', methods=['POST'])

def message():


    req = request.get_json()

    content = req['content']

    user_key = req['user_key']


    if content == u"대화하기":

        res = {

            'message': {

                'text': "영어로 대화를 시작하시면 됩니다."

            }

        }

    else:

        res = {

            'message': {

                'text': get_answer(content, user_key)

            }

        }

    

    return jsonify(res)


  이후에 다시 서버를 동작시킨 뒤에 기존에 포트포워딩으로 열어 놓은 공인 IP 주소로 테스트를 해봅시다.



  위와 같이 keyboard 경로로 들어가면 '대화하기'라고 카카오톡 챗봇에 나올 메시지가 출력되는 것을 알 수 있습니다. 이제 이러한 웹 서버에 카카오톡의 크롤러가 자동으로 연동할 수 있게 된 것입니다.



  앱 URL에 우리의 웹 서버 URL을 입력하여 'API 테스트'를 해보시면 위와 같이 OK 메시지가 출력됩니다.



  이제 위와 같이 전화번호로 인증을 한 뒤에 저장하시면 됩니다.



  이제 '시작하기'를 눌러서 구동시키면 됩니다. 구동 이후에는 다음과 같이 스마트 폰에서 검색이 되는 것을 확인할 수 있습니다.



  이제 다음과 같이 카카오톡 챗봇과 자유롭게 대화를 할 수 있는 것을 알 수 있습니다.


 


※ 전체 플라스크 소스코드 ※


# -*- encoding: utf-8 -*-

import requests

import json


from flask import Flask, request, jsonify


def get_answer(text, user_key):

    

    data_send = { 

        'query': text,

        'sessionId': user_key,

        'lang': 'ko',

    }

    

    data_header = {

        'Authorization': 'Bearer CLIENT ACCESS TOKEN',

        'Content-Type': 'application/json; charset=utf-8'

    }

    

    dialogflow_url = 'https://api.dialogflow.com/v1/query?v=20150910'

    

    res = requests.post(dialogflow_url, data=json.dumps(data_send), headers=data_header)


    if res.status_code != requests.codes.ok:

        return '오류가 발생했습니다.'

    

    data_receive = res.json()

    answer = data_receive['result']['fulfillment']['speech'] 

    

    return answer


app = Flask(__name__)

app.config['JSON_AS_ASCII'] = False


@app.route('/', methods=['POST', 'GET'])

def webhook():


    content = request.args.get('content')

    userid = request.args.get('userid')


    return get_answer(content, userid)


@app.route("/keyboard")

def keyboard():

    res = {

        'type': 'buttons',

        'buttons': ['대화하기']

    }

    return jsonify(res)


@app.route('/message', methods=['POST'])

def message():

    

    req = request.get_json()

    content = req['content']

    user_key = req['user_key']


    if content == u"대화하기":

        res = {

            'message': {

                'text': "영어로 대화를 시작하시면 됩니다."

            }

        }

    else:

        res = {

            'message': {

                'text': get_answer(content, user_key)

            }

        }

    

    return jsonify(res)

    

if __name__ == '__main__':

    app.run(host='0.0.0.0')

728x90
반응형

728x90
반응형

  다이얼로그 플로우(Dialog Flow)로 챗봇(Chat Bot)을 개발한 뒤에 이를 실제 상용 서비스에서 활용하기 위해서는 웹 서버와 함께 사용하는 것이 가장 효과적입니다. 웹 서버 중에서는 가장 가벼우면서도 빠르게 구현할 수 있는 플라스크(Flask)를 이용하면 효율적입니다. 따라서 아래 과정을 차근차근 따라하면서 자신만의 플라스크 웹 서버에서 다이얼로그 플로우를 사용할 수 있도록 하세요.


※ 다이얼로그 플로우 API V1 테스트하기 ※


  먼저 자신이 사용하고자 하는 에이전트(Agent) 프로젝트의 클라이언트 액세스 토큰(Client Access Token)을 확인합니다.



  이후에 API를 어떻게 사용할 수 있는지 확인해 봅시다.


  Dialog Flow API V1 문서: https://dialogflow.com/docs/reference/agent/query


  기본적으로 다이얼로그 플로우는 매우 간단하게 초기 버전의 API를 사용할 수 있습니다. 가장 중요한 부분만 추출하면 다음과 같습니다.



  먼저 POST 방식 전송 예제는 위와 같습니다. 헤더에 CLIENT ACCESS TOKEN을 넣은 뒤에 아래쪽에 'query'로 실질적인 질의문을 넣는 것을 알 수 있습니다. 이제 이를 파이썬을 이용해 동일하게 동작하는 클라이언트를 작성하면 됩니다. 전체 Flask 웹 서버의 소스코드는 다음과 같습니다.



  위 사진은 결과 예제 사진입니다. 보시면 JSON 형태로 'result' -> 'fulflilment' -> 'speech'에 결과 값이 담겨 오는 것을 알 수 있습니다. 따라서 요청 데이터를 보낸 이후에 결과 값에서 이를 파싱하도록 소스코드를 작성하면 됩니다.


※ Flask 웹 서버의 소스코드


# -*- encoding: utf-8 -*-

import requests

import json


from flask import Flask, request, jsonify


def get_answer(text, user_key):

    

    data_send = { 

        'query': text,

        'sessionId': user_key,

        'lang': 'ko',

    }

    

    data_header = {

        'Authorization': 'Bearer CLIENT ACCESS TOKEN',

        'Content-Type': 'application/json; charset=utf-8'

    }

    

    dialogflow_url = 'https://api.dialogflow.com/v1/query?v=20150910'

    

    res = requests.post(dialogflow_url, data=json.dumps(data_send), headers=data_header)


    if res.status_code != requests.codes.ok:

        return '오류가 발생했습니다.'

    

    data_receive = res.json()

    answer = data_receive['result']['fulfillment']['speech'] 

    

    return answer


app = Flask(__name__)

app.config['JSON_AS_ASCII'] = False


@app.route('/', methods=['POST', 'GET'])

def webhook():


    content = request.args.get('content')

    userid = request.args.get('userid')


    return get_answer(content, userid)


if __name__ == '__main__':

    app.run(host='0.0.0.0')    


  위와 같이 API 문서의 내용을 그대로 따라 작성한 것을 알 수 있습니다. 대신에 자신의 웹 서버에서는 'content'와 'userid'라는 두 파라미터로 값을 받습니다. 이후에 해당 소스코드를 실행하고 자신의 로컬 환경에서 테스트를 진행하면 됩니다.


728x90
반응형