레플리
글 수 59

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

조회 수 8022 추천 수 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
제목 글쓴이 날짜sort 조회 수
Node.js로 카카오봇 만들기 깊은바다 2017-06-20 4167
AWS Lambda를 활용한 아마존 알렉사 스킬 개발 방법 깊은바다 2017-05-26 894
Api.ai로 코딩없이 챗봇만들기 깊은바다 2017-05-25 2387
Fluenty.ai 챗봇 빌더 사용기 file [2] 깊은바다 2017-05-14 2082
챗봇 시작해보기 - Node.js로 페이스북 챗봇 구현 깊은바다 2017-05-04 2013
파이썬과 Flask로 만든 간단한 페이스북 챗봇 file 깊은바다 2017-04-30 8022
슬랫봇 30분만에 만들기 깊은바다 2017-04-29 3776
1분만에 만드는 챗봇 - 플레이챗(PlayChat) file 깊은바다 2017-04-26 2180
파이썬과 Flask로 만든 간단한 카카오톡 챗봇 file [2] 깊은바다 2017-04-22 25299
파이썬과 Django로 카카오톡 챗봇 구현하기 깊은바다 2017-04-18 8328
PHP로 만든 간단한 카카오톡 챗봇 file 깊은바다 2017-04-15 12641
페이스북 날씨 챗봇 개발하기 file 깊은바다 2017-04-11 2316
ChatScript로 한국어 챗봇 개발하기 [2] 깊은바다 2017-03-21 8212
Wit.ai - 챗봇 API file 깊은바다 2017-02-28 3308