ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • '잡'개발자의 고군분투 챗봇(Somenaeil) 만들기 1부
    취미로 하는 개발:D/Somenaeil(챗봇) 2017.10.08 06:27

    안녕하세요! '잡'개발자 JAY입니다.


    지금부터 제가 현재 개발하고 있는 챗봇 서비스에 대해서 포스팅하려고 합니다.


    챗봇을 만드는 과정부터 어떤 서비스를 할 것인지에 대해 순서대로 차근차근 정리하도록 해보겠습니다.


    1. 챗봇 개발환경 정하기

    챗봇 관련 API를 제공하는 서비스들은 다양한데요. 예를들어 카카오톡, 라인 등 메신저 애플리케이션에서 이런 API들을 제공합니다. 

    저같은 경우 가장 쉽게 접근할 수 있고 친근한 카카오톡을 사용하기로 했습니다.


    - 개발환경

    • 언어 : python
    • 웹프레임워크(서버) : Django
    • 서버 : AWS(아마존 웹 서비스)

    python을 사용한 이유는 그냥 평소에 제가 python 이라는 언어에 관심이 있었고, Django라는 웹프레임워크가 python으로 사용할 수 있기 때문에 Django를 서버쪽 웹프레임워크로 정했습니다. AWS는 1년동한 한달에 750시간이라는 프리티어를 이용할 수 있기 때문에 사용하였습니다.(역시 갓마존:D)



    2. 카카오톡 플러스친구 아이디 만들기(구 옐로우아이디)

    러스 친구 홈페이지 : https://center-pf.kakao.com/login


    카카오톡 계정으로 간단히 플러스친구를 만들수 있습니다. 그리고 카카오 자동응답 API를 사용하기 위해서는 별도의 서버가 필요합니다.


    AWS 사이트 : https://aws.amazon.com/ko/?nc2=h_lg  에 들어가셔서 가입하고 Amazon EC2 시작하기를 누르면 됩니다.


    그리고 아래 두 사이트를 참고하여 인스턴스 생성 후, Putty로 접속하면 사전준비는 끝입니다.


    - 참고 사이트 


    3. Django 설치 및 가상환경 실행


    프로젝트를 관리할 디렉토리를 하나 생성하고 들어간 뒤

    • mkdir Django --> cd Django

    python3 -m venv myvenv로 가상환경을 만듭니다. 가상환경을 만드는 이유는 필요한 경우 한 개발머신 안에 여러 개의 가상 환경을 만들고 각 가상 환경에서 다른 파이썬 버전이나 다양한 패키지들을 독립적으로 설치 사용할 수 있기 때문입니다. 요약하자면, 관리가 쉽도록 하기 위하여 만드는 것 입니다.


    이후, source myvenv/bin/activate를 치시면 가상환경을 실행할 수 있습니다.



    mkdir Django 했을때, 저는 이미 폴더가 만들어져 있기 때문에 에러가 뜨네요ㅎㅎ

    다음은  Django와 Apache 그리고 둘을 연동할 mod_wsgi를 설치합니다. 


    • pip install Django
    • sudo apt-get install appache2
    • sudo apt-get install libapache2-mod-wsgi-py3


    mode_wsgi는 Django와 같은 WSGI 인터페이스를 지원하는 파이썬 어플리케이션을 웹에 호스팅 할 수 있게 해주는 apache 모듈입니다. 


    WSGI 인터페이스 설명 : http://brownbears.tistory.com/350


    위 블로그에 가시면 WSGI, WAS, CGI에 대한 설명이 잘 나와있습니다!!


    4. Django 프로젝트 및 앱 생성

    • django-admin startproject bot(프로젝트 이름)
    • python manage.py startapp inform(앱 이름)  

    앱이름을 Somenaeil로 했어야 했는데 처음에는 어떠한 서비스를 할 지 몰라서 그냥 information을 줄여서 infrom이라고 했습니다.



    명령어를 다 치시면 이렇게 프로젝트와 앱 폴더가 생성된 걸 확인할 수 있습니다.(저는 이것저것 해보느라 폴더가 많이있네요..ㅎㅎ)


    프로젝트, 앱 폴더가 만들어진게 확인 되면, 프로젝트 폴더에가서 settings.py를 수정해줍니다.


    ALLOWED_HOSTS 부분을 '*'로 바꿔주어 모든곳에서 접근이 가능하도록 해줍니다.


    INSTALLED_APPS 에 자신이 만든 앱의 이름을 적어줍니다.



    TIME_ZONE 부분을 'Asis/Seoul'로 바꿔 줍니다.



    다음으로  프로젝트 폴더에 wsgi.py 파일을 들어가 경로를 추가해줍니다.



    마지막으로 apache 설정만 하면 됩니다. /etc/apache2/sites-available/000-default.conf에 들어가 가상환경(Virtualenv)을 설정하면 됩니다. 다른 것들은 건드리지 마시고 아래 표시한 부분을 추가하시면 됩니다.



    추가한 내용을 보시면 Require all granted라고 해서 모든요청을 허가하는 코드입니다.


    이제, sudo apachectl -k restart로 아파치를 재시작해줍니다.


    AWS에서 할당받은 인스턴스 아이피로 들어가 It worked! 라는 화면이 나오면 정상 실행 되는 것 입니다.

    (죄송합니다 캡처를 못했네요 ㅠ)


    만약 에러가 뜬다면 /var/log/apache2/error.log를 참고하시면 됩니다.


    5. 카카오 플러스친구(자동응답) API 형식에 맞게 Django 파일 설정

    카카오 플러스친구 API 깃헙 주소 : https://github.com/plusfriend/auto_reply


    첫번째로 Home Keyboard API 를 구현합니다.  이용자가 최초로 채팅방에 들어올 때 기본으로 키보드 영역에 표시될 자동응답 명령어의 목록을 호출하는 API입니다.


    API의 내용을 살펴보면



    Json 형식으로 예제와 같이 구현하면 됩니다.


    프로젝트 폴더에 있는 urls.py를 아래와 같이 변경합니다.

    다음은 앱 폴더의 urls.py 파일을 변경합니다.


    코드를 보면 http(s)://:your_server_url/keyboard로 요청이 왔을 때, views.py 파일의 keyboard함수를 부르게 하였습니다.


    다음은 views.py 파일을 수정합니다. 호출된 views.py 에서 그에따른 출력을 내야겠죠?!

    저는 제가 만들 서비스에 맞게 버튼을 추가하였습니다. 버튼의 내용을 보시면 알겠지만 제가 만들 챗봇 서비스의 주제는 '썸'입니다! ㅋㅋㅋ


    서비스 관련 내용은 챗봇만들기 포스팅을 하면서 천천히 설명드리도록 하겠습니다.


    항상 파일을 수정하면 sudo apachectl -k restart 로 아파치를 재시작 해줍니다. 그래야 변경된 사항이 적용됩니다.


    이제 플러스친구 홈페이지 메뉴중 '스마트 채팅'을 클릭하신 후, 


    API형 선택 그리고 앱 URL 부분에 자신의 서버 IP를 기입하여 API테스트를 진행하시면 됩니다.


    만약 Fail이 난다면 무언가 잘못 설정해주었기 때문입니다. 다시한번 코드를 확인하시길 바랍니다.


    여기까지 됬으면 실제로 카카오톡에서 챗봇이 동작하나 확인해 보겠습니다.



    카카오 이모티콘에 대한 이미지 검색결과

    (아주 잘나옵니다!! ㅋㅋㅋ)



    6. 플러스친구 버튼 클릭시 내용 출력

    이번에는 버튼을 클릭시 내용을 출력해보도록 하겠습니다.


    프로젝트 폴더의 urls.py 파일에 message url을 추가합니다.

    views.py 파일에 message 함수를 추가합니다.

    저는 한글을 입력받고 한글을 출력하기위해 'UTF-8' 인코딩, 디코딩 둘 다 사용하였지만 단순히 버튼테스트를 하실 분들은 아래처럼만 해주시면 됩니다. 추후 아주 짜증이나는 'UTF-8'에 관해서도 포스팅을 하도록 하겠습니다.

    *csrf_exempt는 middleware에 의해 자동으로 csrf portect 기능이 있는경우 이를 dissable 시켜주는 기능입니다. 특정 view에 csrf를 적용시키고 싶지 않을때 사용합니다.


    자! 이제 sudo apachectl -k restart 명령어로 아파치를 재시작 한 후, 플러스 친구 채팅창에서 제대로 응답하는지 확인하도록 해보겠습니다.



    와웈ㅋㅋ 정말 잘 됩니다!! 사실 챗봇이라는게 처음에는 엄청 어려울 것이라고 생각했는데, 개발환경 셋팅만 제대로 되면 API가 잘 되어있어서 구현 자체는 어렵지 않네요 ㅎㅎ(이러고 개발환경 셋팅만 이틀 헤멘건 안비밀ㅠㅠ ㅋㅋㅋ)


    다음 포스팅에서는 제가 구현할 '썸내일' 챗봇에 추가할 서비스를 만들어 보도록하겠습니다.


    네이버 검색API 사용하기, python에서 file open, static file 사용(AWS의 S3이용) 등에 대하여 설명드릴게요!


    처음 이렇게 길게 글을 써보는거라 정리가 많이 안된 것 같아요 ㅠㅠ 혹시라도 궁금하신 점 있으시면 언제든지 댓글이나 메일 주시면 답변드리겠습니다!!


    여러분 그럼 즐거운 코딩, 재밌는 코드 생산하세요~~:D

    * 아 그리고, 저는 웹개발자도 아니고 아직 신입개발자이며 취미로 웹쪽 개발을 해보는 거라 많이 부족합니다!ㅜ 혹시라도 제 글에 잘못된 점이나 고쳐야할 부분이 있으시면 언제든지 주저 마시고 말씀해주세요! 감사합니다:D



    댓글 17

    • blueriver 2017.12.29 15:18

      감사합니다 잘봤어요.

    • inter 2018.01.08 11:25

      안녕하세요. 정리해주신 내용으로 챗봇 개발에 많은 도움이 되었습니다.

      한가지 여쭤볼 것이 있는데요, 저의 경우 views.py에서
      return_json_str = json.loads(message) 라는 것을 치면 아래와 같은 에러가 뜹니다.

      JSONDecodeError at /message
      Expecting value: line 1 column 1 (char 0)

      message도 정상적으로 받아지는 것을 확인했는데, 이러한 에러는 어떻게 해결할 수 있을까요?

      • JAY-JI 2018.01.09 23:40 신고

        안녕하세요! 도움이 되셨다니 다행이네요. 해당 에러는 jsonDecodeError인데 views.py에 import json 하시고 다시 서버 재실행 해보세요~ 제가 json 모듈을 import 한걸 설명에 못 올렸네요 ㅠㅠ 아마 json 모듈 import 하시면 될겁니다!!

    • 고한솔 2018.04.05 14:19

      유용한 정보 잘 봤습니다!

      저도 계속 해매면서 카카오톡 API형까지는 왔는데, '앱 url' 입력하는 단계에서 인증에 계속 실패하네요ㅠ

      앱 url 입력시에, 할당받은 ip를 입력하라는데 그게 뭔지를 모르겠어요ㅠㅠㅠ

    • 서원석 2018.04.14 13:00

      안녕하세요. 글 잘 봤습니다.
      저는 대학교 캡스톤디자인 쳇봇 수업을 진행중인 학생입니다.
      3번의
      Django와 Apache 그리고 둘을 연동할 mod_wsgi를 설치하는 과정을 모르겠습니다 . 어떤 명령어를 쳐야하는지 도와주세요.


    • 2018.05.11 11:31

      비밀댓글입니다

    • 건건건 2018.05.11 11:33

      안녕하세요 죄송한데 위에 비밀글이 제글인데 여기에좀 답장해주실수있나요?? 제가 실수로 이름을 까먹어 버렸네요ㅠㅠㅠㅠ 부탁드립니다

      • JAY-JI 2018.05.15 14:52 신고

        안녕하세요!
        1번에 대한 답변은 상관없다입니다! AWS에서 만들어주는 서버에 접속을 해서 사용하는거기때문에(ex.Telnet) 자신의 운영체제랑은 상관없습니다.
        2. 'manage.py'파일이 확실히 있는지요? 확인해보시는게.;;

        저도 전공자가 아니라 잘 모르지만, 일단 질문자님께서는 서버의 개념이랑 파이썬에 대해 잘 모르시는거 같아요ㅎㅎ 기본 개념부터 이해하고 시작하는게 좋을 것 같습니다!:D

    • 뉴비 2018.05.27 19:31

      안녕하세요 글 잘보고 있습니다.
      카카오 플친에 챗봇을 만들어보고 싶어서 따라하고 있는데 , 어려움이 있어 질문 올립니다.

      "마지막으로 apache 설정만 하면 됩니다. /etc/apache2/sites-available/000-default.conf에 들어가 가상환경(Virtualenv)을 설정하면 됩니다. 다른 것들은 건드리지 마시고 아래 표시한 부분을 추가하시면 됩니다."

      이 부분에서 저는
      vi /etc/apache2/sites-available/000-default.conf 명령어를 치고 들어가면

      <VirtualHost *:80>
      # The ServerName directive sets the request scheme, hostname and port that
      # the server uses to identify itself. This is used when creating
      # redirection URLs. In the context of virtual hosts, the ServerName
      # specifies what hostname must appear in the request's Host: header to
      # match this virtual host. For the default virtual host (this file) this
      # value is not decisive as it is used as a last resort host regardless.
      # However, you must set it for any further virtual host explicitly.
      #ServerName www.example.com

      ServerAdmin webmaster@localhost
      DocumentRoot /var/www/html

      # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
      # error, crit, alert, emerg.
      # It is also possible to configure the loglevel for particular
      # modules, e.g.
      #LogLevel info ssl:warn

      ErrorLog ${APACHE_LOG_DIR}/error.log
      CustomLog ${APACHE_LOG_DIR}/access.log combined

      이러한 글이 뜨고 위 포스트에 추가하라고 한것을 추가하려고 해도 읽기 전용이라 써지지가 않네요ㅜ
      어떤게 문제 일까요,,?
      aws 인스턴스 생성과 푸티는 모두 위에서 하라는데로 똑같이 했습니다.
      답변 부탁드릴게요ㅜㅜ





      • JAY-JI 2018.05.27 22:57 신고

        sudo 명령어로 한번들어가서 수정해보세요! ex) sudo vi xxx
        아마 수정하려는 파일 중요하거나 그러면관리자권한?에서만 실행되게 되있는 거 같더라고요! 저도 자세히는 모르지만 아마 sudo로 하면 수정이 쓰기모드로 될겁니다!

      • JAY-JI 2018.05.27 22:57 신고

        아니면 chmod 777 로 권한수정 해보세요~

    • 로로 2018.06.11 22:16

      저같은 경우는

      000-default.conf 파일을

      <VirtualHost *:80>
      # The ServerName directive sets the request scheme, hostname and port that
      # the server uses to identify itself. This is used when creating
      # redirection URLs. In the context of virtual hosts, the ServerName
      # specifies what hostname must appear in the request's Host: header to
      # match this virtual host. For the default virtual host (this file) this
      # value is not decisive as it is used as a last resort host regardless.
      # However, you must set it for any further virtual host explicitly.
      #ServerName www.example.com

      ServerAdmin webmaster@localhost
      DocumentRoot /var/www/html

      # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
      # error, crit, alert, emerg.
      # It is also possible to configure the loglevel for particular
      # modules, e.g.
      #LogLevel info ssl:warn

      ErrorLog ${APACHE_LOG_DIR}/error.log
      CustomLog ${APACHE_LOG_DIR}/access.log combined

      # For most configuration files from conf-available/, which are
      # enabled or disabled at a global level, it is possible to
      # include a line for only one particular virtual host. For example the
      # following line enables the CGI configuration for this host only
      # after it has been globally disabled with "a2disconf".
      #Include conf-available/serve-cgi-bin.conf

      </VirtualHost>

      Alias /static/ /home/ubuntu/Django/www_static/
      <Directory /home/ubuntu/Django/www_static>
      Require all granted
      </Directory>

      #ServerAdmin Webmaster@localhost
      WSGIScriptAlias / /home/ubuntu/Django/bot/wsgi.py

      <Directory /home/ubuntu/Django/bot>
      <Files wsgi.py>
      Require all granted
      #order deny, allow
      #Deny from all
      </Files>
      </Directory>

      # vim syntax=apache ts=4 sw=4 sts=4 sr noet

      위와같이 했는데

      'WSGIScriptAlias', perhaps misspelled or defined by a module not included in the server configuration 오류를 뱉습니다.. ㅠㅠ

      • dds 2018.06.15 04:44

        keyboard fail이 자꾸 발생합니다..
        서버 아이피를 aws에서 어떤걸 사용해서 집어넣어야하는지 혹시알려주실 수 있나요
        저는
        http://aws IPv4퍼블릭IP:8000이렇게 입력하는데 자꾸안되네요...
        이부분에대한 설명을 해주시면 정말 감사하겠습니다..ㅠㅠ

    • Ristz 2018.09.11 05:36

      제가 윈도우에서 pycharm으로 개발을 했었는데 ubuntu로 하려고 하니깐 힘드네요.. 혹시 서버만 코드는 윈도우 pycharm에서 하고 서버 가동만 ubuntu에서 할 방법은 없을까요?

    • 2018.09.14 16:26

      비밀댓글입니다

    • 2018.11.30 11:14

      비밀댓글입니다

운동하는 개발자 JAY-JI