- AI Dev - 인공지능 개발자 모임
- 정보공유
- 챗봇 개발
챗봇이 가장 많이 개발되고 인기 있는 플랫폼은 역시 페이스북입니다. 현재까지 10만개 이상의 챗봇이 페이스북에서 서비스중이라고 합니다. 한국어로 된 챗봇도 어렵지 않게 찾아볼 수 있습니다. 여러가지 방법으로 페이스북 챗봇을 만들 수 있는데 여기서는 파이썬과 Flask를 사용하여 구현해보겠습니다. 아마존 리눅스와 파이썬 2.7을 기반으로 하였습니다.
파이썬 / Flask 설치 및 아파치 연동
아래의 링크를 참조하여 설치해주세요.
-> http://aidev.co.kr/chatbot/1268
SSL(Secure Sockets Layer) 설치
페이스북의 webhook 서버는 https만 지원합니다. 먼저 다음과 같이 openSSL을 설치합니다.
1
2
3
|
sudo yum install openssl-devel
sudo yum install pyOpenSSL
sudo python -m pip install pyopenssl
|
cs |
만약 자신의 웹서버에 SSL 인증서가 없다면 별도로 발급받아 설치를 해야합니다. 처음에 자체 인증서를 만들어 해보았는데 페이스북에서 승인이 되지 않았습니다. 인증서를 받기 위해서는 CA(Certificate Authority)에 요금을 내야 합니다. 다행히 아래와 같이 무료로 제공하는 곳이 있어서 그것을 사용하였습니다.
Let's Encrypt의 인증서 자동설치 사이트
1
2
3
4
5
6
|
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
./certbot-auto certonly --standalone -d <your.domain.name>
cp /etc/letsencrypt/live/도메인주소/fullchain.pem ./server.crt
cp /etc/letsencrypt/live/도메인주소/privkey.pem ./server.key
|
cs |
위와 같이 프로그램을 실행하고 생성된 인증서와 키를 원하는 폴더로 복사합니다.
소스 코드
아래 링크의 프로그램을 조금 수정하여 구현하였습니다.
-> https://github.com/Marsan-Ma/fb_messenger
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
# -*- coding: utf-8 -*-
from flask import Flask, request
from OpenSSL import SSL
import os, json, requests
app = Flask(__name__)
#----------------------------------------------------
# 챗봇 클래스
#----------------------------------------------------
class ChatBot(object):
#--------------------------------
# 초기화
#--------------------------------
def __init__(self):
self.FACEBOOK_TOKEN = 'Facebook Page Token'
self.VERIFY_TOKEN = 'Test Token String'
self.FBM_API = "https://graph.facebook.com/v2.6/me/messages"
self.fbm_processed = []
#--------------------------------
# 메시지 처리
#--------------------------------
def process_fbm(self, payload):
for sender, msg in self.fbm_events(payload):
resp = self.gen_response(msg)
self.fbm_api({"recipient": {"id": sender}, "message": {"text": resp}})
#--------------------------------
# 메시지 생성
#--------------------------------
def gen_response(self, msg):
return msg
#--------------------------------
# 메시지 이벤트 처리
#--------------------------------
def fbm_events(self, payload):
data = json.loads(payload.decode('utf8'))
for event in data["entry"][0]["messaging"]:
if "message" in event and "text" in event["message"]:
q = (event["sender"]["id"], event["message"]["seq"])
if q in self.fbm_processed:
continue
else:
self.fbm_processed.append(q)
yield event["sender"]["id"], event["message"]["text"]
#--------------------------------
# 페이스북 API로 메시지 전송
#--------------------------------
def fbm_api(self, data):
r = requests.post(self.FBM_API,
params={"access_token": self.FACEBOOK_TOKEN},
data=json.dumps(data),
headers={'Content-type': 'application/json'})
if r.status_code != requests.codes.ok:
print("fb error:", r.text)
#----------------------------------------------------
# 검증 함수
#----------------------------------------------------
@app.route('/', methods=['GET'])
def Verify():
if request.args.get('hub.verify_token', '') == bot.VERIFY_TOKEN:
return request.args.get('hub.challenge', '')
else:
return 'Error, wrong validation token'
#----------------------------------------------------
# Webhook 함수
#----------------------------------------------------
@app.route('/', methods=['POST'])
def Webhook():
payload = request.get_data()
bot.process_fbm(payload)
return "ok"
#----------------------------------------------------
# 메인 함수
#----------------------------------------------------
if __name__ == "__main__":
bot = ChatBot()
contextSSL = ('server.crt', 'server.key')
app.run(host='0.0.0.0', port = 5000, ssl_context = contextSSL)
|
cs |
프로그램을 실행시킵니다. 아파치 같은 웹서버에서 돌리기 위해서는 발급받은 SSL 인증서를 해당 웹서버에 별도로 설치를 해야합니다.
1
2
|
$ python quizbot.py
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
|
cs |
페이스북 페이지 및 앱 생성
페이스북 왼쪽 메뉴에서 페이지를 선택하고 페이지 만들기로 새로 생성합니다.
https://developers.facebook.com/ 에서 '새 앱 추가'를 선택합니다.
왼쪽의 메뉴에서 제품 추가를 누르고 Messenger의 시작하기 버튼을 클릭합니다.
방금 만들었던 페이지를 선택하면 페이지 액세스 토큰이 생성됩니다. 이 문자열을 소스 코드의 FACEBOOK_TOKEN 변수에 입력합니다.
Webhooks 설정을 선택합니다.
콜백 URL에 서버 주소를 입력합니다. https 서버가 실행중에 있는지 자동으로 검사를 합니다. 확인 토큰에 아무 문자열을 넣고 소스 코드의 VERIFY_TOKEN 변수에 설정합니다. 받아보기 필드를 위와 같이 선택합니다. 페이지 액세스 토큰과 확인 토큰을 수정하였다면 서버를 재시작합니다.
앱 검증
현재는 관리자와 테스트 사용자만 챗봇을 이용할 수 있습니다. 사용자들에게 공개를 하기 위해서는 먼저 페이스북에서 검증을 받아야 합니다.
pages_messaging을 제출에 추가합니다. pages_messaging_subscriptions는 유저가 사용중이 아니라도 서버에서 먼저 메시지를 보낼 수 있는 권한입니다. 이 항목이 추가되면 검수가 까다롭다고 해서 저는 첫번째 것만 제출하였습니다.
노트 수정을 클릭합니다.
페이지를 선택합니다. Messager 환경에 자동 답장 기능이 있습니다를 선택하고 테스트를 위한 질문 / 답변을 추가합니다. 저장하고 검수를 위한 제출을 선택합니다. 리뷰 기간은 최대 5일이라고 나오는데 저는 하루만에 통과되었습니다.
마지막으로 앱 검수 메뉴에서 앱을 공개로 변경합니다. 이 메뉴에서 따로 승인을 위해 제출할 필요는 없습니다. 여기서는 메신저가 아니라 다른 API를 사용하기 위한 검수입니다.
테스트
챗봇을 사용하기 위해서는 메신저나 페이스북 사이트에서 페이지 이름을 검색하시면 됩니다. 제가 만들었던 챗봇은 아래 링크에서 확인하실 수 있습니다. 아직 퀴즈 기능은 개발하지 않았고 일상적인 대화만 가능합니다.
< 챗봇 개발자 모임 >
- 페이스북 그룹에 가입하시면 챗봇에 대한 최신 정보를 쉽게 받으실 수 있습니다.