레플리
글 수 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 조회 수
한국어 챗봇 빌더 패키지, KoML onion 2022-12-01 679
AI 스마트 스피커 작동 방법 해부하기 깊은바다 2022-02-16 926
챗봇빌더 비교 - 단비Ai vs Dialogflow vs 카카오i 오픈빌더 file 깊은바다 2021-06-26 2653
Doc2Vec 유사도 비교로 FAQ 챗봇 만들기 깊은바다 2021-03-19 911
Rasa와 TMDb를 이용한 영화 챗봇 만들기 깊은바다 2020-03-12 2162
MS의 파워 버추얼 에이전트(Power Virtual Agents) 핸즈온 file 깊은바다 2020-02-10 539
챗봇, 일주일이면 아무개 만큼 한다! file [1] Dope 2020-01-21 2622
카카오i 오픈빌더를 안쓰고 자체 엔진으로 카톡 챗봇을 만드는 방법 깊은바다 2019-12-31 1353
Dialogflow에서 Universal Sentence Encoder로 문장의 유사도 측정 깊은바다 2019-08-07 1018
왕초보, 코딩없이 챗봇 만들기 깊은바다 2019-03-02 3016
DIY 챗봇 - 유사도 방식의 의도 파악 file 깊은바다 2019-01-27 1711
카카오i 오픈빌더로 피자챗봇 만들기 깊은바다 2018-12-19 4521
카카오i 오픈빌더에서 자체엔진 사용방법 [1] 깊은바다 2018-12-13 2714
NUGU Play Kit 사용기 - 명상 서비스 개발 [1] 깊은바다 2018-12-13 600
빅스비와 시작하기 file 깊은바다 2018-12-04 2023