글 수 51

파이썬과 Flask로 만든 간단한 페이스북 챗봇

조회 수 3342 추천 수 0 2017.04.30 04:58:09


챗봇이 가장 많이 개발되고 인기 있는 플랫폼은 역시 페이스북입니다. 현재까지 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의 인증서 자동설치 사이트

-> https://certbot.eff.org/

 

 

 

1
2
3
4
5
6
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
./certbot-auto certonly --standalone -<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

 


 

페이스북 페이지 및 앱 생성

 

K-001.jpg

 

페이스북 왼쪽 메뉴에서 페이지를 선택하고 페이지 만들기로 새로 생성합니다.

 

 

 

K-002.jpg

https://developers.facebook.com/ 에서 '새 앱 추가'를 선택합니다.

 

 

 

K-005_1.jpg

 

왼쪽의 메뉴에서 제품 추가를 누르고 Messenger의 시작하기 버튼을 클릭합니다.

 

 

 

K-006_1.jpg

 

방금 만들었던 페이지를 선택하면 페이지 액세스 토큰이 생성됩니다. 이 문자열을 소스 코드의 FACEBOOK_TOKEN 변수에 입력합니다.

 

 

 

K-007_1.jpg

 

Webhooks 설정을 선택합니다.

 

 

 

K-008_1.jpg

콜백 URL에 서버 주소를 입력합니다. https 서버가 실행중에 있는지 자동으로 검사를 합니다. 확인 토큰에 아무 문자열을 넣고 소스 코드의 VERIFY_TOKEN 변수에 설정합니다. 받아보기 필드를 위와 같이 선택합니다. 페이지 액세스 토큰과 확인 토큰을 수정하였다면 서버를 재시작합니다.

 

 


앱 검증

 

현재는 관리자와 테스트 사용자만 챗봇을 이용할 수 있습니다. 사용자들에게 공개를 하기 위해서는 먼저 페이스북에서 검증을 받아야 합니다.

 

 

 

K-009_1.jpg

 

pages_messaging을 제출에 추가합니다. pages_messaging_subscriptions는 유저가 사용중이 아니라도 서버에서 먼저 메시지를 보낼 수 있는 권한입니다. 이 항목이 추가되면 검수가 까다롭다고 해서 저는 첫번째 것만 제출하였습니다.

 

 

 

K-010_1.jpg

 

노트 수정을 클릭합니다.

 

 

 

K-011_1.jpg

 

페이지를 선택합니다. Messager 환경에 자동 답장 기능이 있습니다를 선택하고 테스트를 위한 질문 / 답변을 추가합니다. 저장하고 검수를 위한 제출을 선택합니다. 리뷰 기간은 최대 5일이라고 나오는데 저는 하루만에 통과되었습니다.

 

 

 

K-002.png

 

마지막으로 앱 검수 메뉴에서 앱을 공개로 변경합니다. 이 메뉴에서 따로 승인을 위해 제출할 필요는 없습니다. 여기서는 메신저가 아니라 다른 API를 사용하기 위한 검수입니다.

 

 

 

테스트

 

챗봇을 사용하기 위해서는 메신저나 페이스북 사이트에서 페이지 이름을 검색하시면 됩니다. 제가 만들었던 챗봇은 아래 링크에서 확인하실 수 있습니다. 아직 퀴즈 기능은 개발하지 않았고 일상적인 대화만 가능합니다.

 

 

 

K-001.png

 

https://m.me/virtualtalkbot

 

 

 

< 챗봇 개발자 모임 >

- 페이스북 그룹에 가입하시면 챗봇에 대한 최신 정보를 쉽게 받으실 수 있습니다.

https://www.facebook.com/groups/ChatbotDevKR/

List of Articles
제목 글쓴이 날짜 조회 수
Python으로 챗봇 만들어보기 - 영화 정보 / 음료 주문 깊은바다 2017-12-22 5202
자바 스프링으로 카카오톡 챗봇 만들기 깊은바다 2017-11-26 4644
Api.ai로 Telegram 연동 챗봇 만들기 깊은바다 2017-10-02 2412
Chatfuel로 코딩없이 타로 챗봇 만들기 file 깊은바다 2017-09-26 2998
MS의 Bot Framework로 30분 안에 챗봇 만들기 깊은바다 2017-09-17 958
Watson으로 쉽게 만드는 카카오톡 ChatBot 깊은바다 2017-08-31 1460
Node.js로 LINE Bot 만들기 깊은바다 2017-07-10 1206
Node.js로 카카오봇 만들기 깊은바다 2017-06-20 3435
AWS Lambda를 활용한 아마존 알렉사 스킬 개발 방법 깊은바다 2017-05-26 642
Api.ai로 코딩없이 챗봇만들기 깊은바다 2017-05-25 2069
Fluenty.ai 챗봇 빌더 사용기 file [2] 깊은바다 2017-05-14 1780
챗봇 시작해보기 - Node.js로 페이스북 챗봇 구현 깊은바다 2017-05-04 1124
파이썬과 Flask로 만든 간단한 페이스북 챗봇 file 깊은바다 2017-04-30 3342
슬랫봇 30분만에 만들기 깊은바다 2017-04-29 2879
1분만에 만드는 챗봇 - 플레이챗(PlayChat) file 깊은바다 2017-04-26 1636