안경잡이개발자

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
반응형