티스토리 뷰

development/django

[django] kakaotalk chatbot 구현

burningrizen 2018. 4. 15. 19:13


[api]

장고로 카카오 플러스친구 챗봇 구현을 해보자.


일단 카카오에서 제공하는 API 스펙부터 확인하자


https://github.com/plusfriend/auto_reply




[urls.py]

urlpatterns = [
url(r'^plusfriend/', include('kakao.urls')),
]


mysite/mysite/urls.py 에 위 코드를 추가하고


urlpatterns = [
url(r'^keyboard$', views.on_init),
url(r'^friend$', views.on_added),
url(r'^friend/(?P<user_key>[\w-]+)$', views.on_block),
url(r'^chat_room/(?P<user_key>[\w-]+)$', views.on_leave),
url(r'^message$', views.on_message),
]



mysite/kakao/urls.py 에 위와 같이 추가하자



프로젝트 이름이 mysite 이고 kakao 란 장고 앱에 플러스친구 관련 기능을 구현 하였다.


플러스친구와 유저가 각 상황마다 서버에 rest api 요청을 보내는 경우를 다 정의 해줘야 한다. 

 


- view.on_init : 최초 채팅방 진입시 호출


- view.on_added: 친구추가시 호출


- view.on_block: 친구차단시 호출


- view.on_leave: 채팅방 나갈때 호출



[decorators.py]

import json
from functools import wraps
from django.contrib.auth import get_user_model
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt

User = get_user_model()

def bot(view_fn):
@wraps(view_fn)
@csrf_exempt
def wrap(request, *args, **kwargs):
if request.method == 'POST':
request.JSON = json.loads(request.body.decode('utf8'))
else:
request.JSON = {}

user_key = request.JSON.get('user_key')
user_key = kwargs.get('user_key',user_key)
if user_key:
username = 'kakao-' + user_key
try:
request.user = User.objects.get(username=username)
except User.DoesNotExist:
request.user = User.objects.create_user(username=username)


return JsonResponse(view_fn(request, *args, **kwargs) or {})
return wrap



view.py 에서 사용할 @bot 을 decorators.py 에서 정의 한다. 플러스친구를 통해 접


속하는 유저의 해시값을 알수 있다. 이것으로 유저를 구분할 수 있다.



[view.py]

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.shortcuts import render
from os.path import basename
import requests
from django.core.files import File
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .decorators import bot

@bot
def on_init(request):
return {
'type':'buttons',
'buttons': ['시작하기']
}

@bot
def on_message(request):
user_key = request.JSON['user_key']
type = request.JSON['type'] # text, photo, audio(m4a), video(mp4)
content = request.JSON['content'] # photo 타입일때 이미지 URL
pass

@bot
def on_added(request):
pass

@bot
def on_block(request, user_key):
if request.method == 'DELETE' :
pass

@bot
def on_leave(request, user_key):
if request.method == 'DELETE' :
pass


urls.py 에서 정의한 urlpatterns 에 정의된 경로들에 대한 함수를 view.py 에 정의해보자


request 를 통해서 유저를 구분 할수 있다.


최초를 on_init 함수가 실행되고 이후에 각 이벤트 친구추가, 차단, 채팅방 떠나


기에 맞는 함수들이 각각 호출된다.


type 에는 사진이나 텍스트 를 정의할수 있고 content 에는 photh 일때는 이미지 


url, 텍스트 일때는 텍스트가 들어가면 된다.




[plusfirend]


django 에서 코드를 설정 하였으면 플러스 친구 관리자에서 설정해야 한다.


https://center-pf.kakao.com/login


계정을 만들고 관리자 로그인을 해보자



새로운 플러스 친구를 생성하자






그러면 왼쪽 사이드 바에 스마트채팅 이라고 보일 것이다.




우측에 API 형을 선택해서 들어가 보자





여기서 제일 중요한건 앱 URL 인데  여기에는 


http://your_server_address/plusfriend 를 입력하자


그리고 api 테스트 버튼을 누르면


view.py 에 정의한 on_init 함수가 호출된다.



Required*

keyboard OK
{"type":"buttons","buttons":["시작하기"]}


이렇게 나오면 정상 동작이다. 이제 세부적인 코드는 django 에서 구현하면 된다.











'development > django' 카테고리의 다른 글

[django] admin.py 알아보자!  (0) 2018.04.18
[django] apache2 연동  (0) 2018.04.13
[django] 장고 설치하기  (0) 2018.04.13
댓글