2019. 1. 11. 21:47ㆍ포트폴리오
이 글은 아마존 AWS 서버를 기반으로 Python + Django 를 활용해서 카카오톡 봇을 만드는 방법을 설명합니다.
-2019년 2018년 12월 3일부터는 API형 스마트채팅 신규 생성이 불가능해지면서 이 내용으로 더이상 챗봇 제작이 불가능해졌습니다.
(앞으로 카카오톡 봇 제작은 2019년 12월 31일 이후로 kakao i Open Builder에서 제공하는 챗봇을 사용해 주셔야 합니다.)
따라서 포트폴리오용으로 통합본으로 수정하여 업로드되었습니다.
1.아마존 AWS 서버 생성하기
카카오톡 급식 봇을 제작하기 위해서는 서버가 하나 필요합니다 따라서 1년동안 무료로 사용이 가능한 아마존 AWS 를 활용하여 급식 봇을 제작하여 보겠습니다.
먼저 아마존 AWS 에서 EC2 를 생성하여 보겠습니다 여기서 EC2 란 Amazon에서 지원하는 laaS 입니다 EC2를 사용하면 간단하게 서버 인프라를 구축할 수 있습니다.
아마존 AWS 가입 과정은 본 게시글에서는 생략하고 계정을 생성하고 로그인된 상태에서 시작하겠습니다.
(참고로 AWS 계정생성에는 신용카드 인증이 필요합니다)
처음 AWS 에 접속하게 되면 아래와 같이 콘솔화면이 나타납니다.
(모든 사진은 클릭시 원본사이즈로 보실수 있습니다.)
메뉴 왼쪽 상단에 서비스를 누르시게 되면 EC2 라는 서비스가 있습니다. 클릭해서 들어가줍니다
그러면 그림과 같이 EC2 대시보드 화면으로 이동됩니다.
먼저 [키 페어 | 보안 그룹] 설정을 해주어야 합니다.
① 키페어 : 인스턴스에 접속할 유저의 비밀키를 가지고 있어야 하기 때문에 생성하여야 합니다.
② 보안 그룹 : 인스턴스를 생성한 다음 SSH로 접속하기 위해 Port를 설정해주어야 합니다.
키 페어는 리소스 부분에서 1 키 페어 부분을 누르시면 생성이 가능합니다.
키 페어 생성 버튼을 눌러서 키를 생성할 수 있습니다.
원하는 키 페어 이름을 입력하시고 생성하면 이름.pem이라는 파일이 자동적으로 다운로드 됩니다.
이 키는 내 인스턴스를 마음대로 접근할 수 있도록 하기 때문에 절대 유출되지 않도록 조심히 다루어야 합니다.
이 키가 유출 되더라도 사용할 수 없도록 만들기 위해 비밀번호를 걸어주어야 합니다.
생성된 키 페어에 패스워드를 거는 방법은 다음과 같이 따라하시면 됩니다.
먼저 PuTTY Key Generator 를 설치해 주세요.
다운받고 실행하시면 다음과 같은 창이 뜨게 됩니다 LOAD 버튼을 눌러 생선된 pem 파일을 로드해 주세요
만약 pem 파일이 보이지 않을 시에는 All Files 형식으로 바꾸어 찾아주세요.
(사진에서는 보안을 위해 일부 요소를 가렸습니다)
Key passphrase에 개인키에 사용할 비밀번호를 쓰고 Confirm passphrase로 입력한 비밀번호를 다시한번 넣어서 확인해주세요
여기서 입력한 비밀번호로 서버에 로그인하게 됩니다.
마지막으로 Save private key를 통해 이름.ppk 파일을 생성해주세요 여기서 이름부분은 되도록 앞에서 만들어진 pem파일과 동일하게 사용해주세요.
이제 다시 EC2 대시보드로 와서 보안 그룹을 생성하여 SSH 포트를 열어주도록 하겠습니다.
리소스 2 보안 그룹 부분을 눌러서 보안 그룹을 생성하실수 있습니다.
(사진에서는 보안을 위해 일부 요소를 가렸습니다)
보안 그룹을 아래와 같이 생성합니다.
① 보안 그룹 이름을 정해주세요 (영어만 가능).
② 설명을 적어주세요 (영어만 가능).
③ VPC 는 기본값으로 사용합니다.
[네트워크 개념을 확장시키면 VPC도 별도로 생성하여 프로젝트마다 네트워크 가상 공간을 분리할 수 있다는 것만 알아두세요]
④인바운드 에서 규칙추가를 눌러서 유형을 SSH 소스에서 내 IP를 선택후 생성해줍니다.
[소스에서 내 IP만 선택하면 다른 사람이 내 인스턴스에 접근하지 못합니다 즉 지금 설정한 이 pc 에서만 서버로 들어갈수 있습니다.]
생성이 완료되면 상단 처음 빨간색 사각형 처럼 보안 그룹이 생성됩니다.
이제 마지막 입니다 생성한 키 페어와 보안 그룹으로 인스턴스를 생성해야합니다.
EC2 대시보드로 돌아가 인스턴스 생성에서 인스턴스 시작 버튼을 눌러줍니다.
Ubuntu Server LTS를 선택하여 주세요 인스턴스 타입은 무료로 사용이 가능한 t2.micro를 선택하여 주세요
그외 설정은 디폴트 설정그대로 할것이기 때문에 검토 및 시작을 눌러주세요.
보안 그룹 부분만 이전에 만든 보안 그룹을 적용해 줍니다,
적용후 시작을 누르면 키 페어를 등록하는 화면이 나옵니다 여기서 아까 만들어준 키 페어를 사용해줍니다.
위 사진과 같이 서버가 생성되었다면 접속할수 있습니다.
클릭하시면 아래 이미지 처럼 정보가 뜨는데 여기서 퍼블릭 DNS 라는 부분이 있습니다 이게 서버 주소입니다 이 부분을 복사해 주세요.
(사진에서는 보안을 위해 일부 요소를 가렸습니다)
이제 추가로 고정 ip 신청을 해보겠습니다
AWS로 Instance를 생성해서 사용 하는 경우,
고정 IP를 지정하지 않으면 Instance를 재시작 했을 경우,
IP가 변경이 됩니다. free teir의 경우 1개의 고정 IP를
무료로 제공을 하니 사용해 보도록 합시다.
EC2 에서 탄력적 ip를 선택해줍니다. (번역이 이상한데 고정 ip 라는 뜻입니다)
이렇게 활당을 해주시고 오른쪽 클릭을 하셔서 창이 하나 뜨면 주소 연결 버튼을 눌러줍니다.
그뒤 인스턴스 선택해주시고 프라이빗 ip 선택해주시고 어소시에이트 버튼을 눌러주시면 고정ip 설정이 완료됩니다.
다시 인스턴스로 이동하셔서 인스턴스 재부팅을 한번 해주시면 퍼블릭 DNS 가 변경됩니다 변경된 주소로 접속을 하시면 됩니다
또한 탄력적 IP 가 생기게 됩니다.
이제 PuTTY를 열어 SSH로 접속 하시면 됩니다.
① Host Name 에는 퍼블릭 DNS 값을 붙여 넣고
② 왼쪽 카테고리에서 Connection > SSH > Auth 에 들어가면 아래쪽에 파일 첨부하는 란이 있습니다. 여기에 아까 만든 이름.ppk 를 넣어주세요.
③ OPEN을 눌러서 접속을 시도합니다. Login as 부분에 ubuntu 를 입력하고 비밀번호는 이름.ppk 파일의 비밀번호를 입력해주세요.
여기 까지 완료하셨다면 아마존 AWS 구축은 끝났습니다.
참고로 프리티어는 사용제한이 많습니다. (잘못사용하면 추가요금이 발생하니 주의하세요!!)
고정ip 는 1개까지만 무료이고 월 750시간 이상 서버가 켜져있으면 추가금이 발생하는등 여러 조건이 있습니다.
그러니 서버는 1개 까지만 무료로 쓸수 있다라고 생각하시면됩니다.
2.아마존 AWS 서버 생성하기
자 이제 위에서 구축한 AWS 서버에 들어가 Django 와 Python을 설치해야 합니다.
우선 Python 부터 설치해보겠습니다.
PYTHON 설치하기
콘솔에 아래 명령어를 사용해서 파이썬을 설치합니다.
1 | $ sudo apt install python |
설치가 성공적으로 되었는지 확인하려면 다음 과 같이 python 명령어를 입력해서 테스트 할 수 있습니다.
1 2 | $ python --version Python 2.7.15rcl |
NOTE :
처음 파이썬을 설치하면 2.7.15rcl이 설치됩니다 하지만 우리는 Python 3.6 버전을 사용할 것이기 때문에 아래와 같이 해주세요
아래 명령을 root 권한으로 실행후 다시 파이썬 버전을 확인하시면 정상적으로 3.6.5로 업그레이드 됩니다.
1 | update-alternatives --install /usr/bin/python python /usr/bin/python3 1 |
DJANGO 설치하기
장고 설치전, 프로젝트 기초 전부를 Python/Django 와 분리해주는 가상환경(Virtual environmnet) 이라는 것이 있는데 저는 이부분을 생략하겠습니다
만약 사용하고 싶으시다면 여기 에 자세히 설명되어있습니다.
우선 pip 부터 설치해주어야 합니다 pip는 파이썬 관련 패키지를 설치할 때 가장 많이 사용하는 툴입니다 하지만 파이썬 설치 시 pip는 포함되지 않기 때문에 다음과 같이 pip를 먼저 설치해주어야 합니다.
1 | sudo apt install python3-pip -y |
NOTE:
혹시 E: Unable to locate package python3-pip 발생한다면
sudo apt-get update 명령어 입력후 다시시도 해보시길 바랍니다.
정상적으로 설치가 되었다면 아래 pip3 명령어를 입력해서 테스트 할 수 있습니다.
1 2 | ~$ pip3 --version pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6) |
1 2 | which pip3 ln -s /usr/bin/pip3 /usr/bin/pip |
1 2 | ~$ pip --version pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6) |
1 | pip install Django |
1 2 | django-admin --version 2.1.1 |
프로젝트 생성
이제 프로젝트를 생성하겠습니다 생성한뒤 풀더나 파일의 이름을 바꾸어선 안됩니다.
기본적으로 프로젝트 생성 명령어는 다음과 같습니다.
1 | $ django-admin startproject [프로젝트 이름] . |
그리고 어플리케이션 생성 명령어는 다음과 같습니다.
1 | $ python manage.py startapp [어플리케이션 이름] |
1 2 3 4 5 | mkdir SMC cd SMC/ django-admin startproject kakao . python mange.py startapp bot python mange.py migrate |
(참고로 저는 bk_biews.py 등 추후 테스트를 위한 파일이 몇개 있습니다)
1 | $ python manage.py migrate |
설정 변경
여기서 부터 본격적으로 카카오 API를 만드는 과정입니다 우선 Django 프로젝트 설정부터 변경해주겠습니다.
SMC/kakao/settings.py 를 설정하겠습니다 이 파일은 django 서버의 환경설정 파일이라고 보시면 됩니다 vim 으로 열어주세요
그뒤 25번째 줄을 찾아주세요.
1 2 3 4 5 6 7 | 25: # SECURITY WARNING: don't run with debug turned on in production! 26: DEBUG = True 27: 28: ALLOWED_HOSTS = ['*'] |
여기서 26번째 줄인 DEBUG는 디버그 모드입니다 True로 사용시 서버 로그에서 오류 발생시 원인이 출력됩니다
False 설정시 오류코드만 출력됩니다 저는 False로 해서 삽질한 경험이 있어서 True모드로 설정합니다.
28번째 줄인 ALLOWED_HOSTS에서 '*' 을 넣어주세요 모든 ip를 허용하겠다는 뜻입니다.
40번째 라인을 찾아서 어플리케이션 이름을 추가해주세요 저는 위에서 bot으로 만들었기때문에 bot을 넣었습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 31: # Application definition 32: 33: INSTALLED_APPS = [ 34: 'django.contrib.admin', 35: 'django.contrib.auth', 36: 'django.contrib.contenttypes', 37: 'django.contrib.sessions', 38: 'django.contrib.messages', 39: 'django.contrib.staticfiles', 40: '어플리케이션 이름', 41: ] |
1 | 108: TIME_ZONE = 'Asia/Seoul' |
SMC/kakao/urls.py 를 이제 수정해보겠습니다 이 파일은 django 서버 접속시 요청을 어디로 보낼지 정해주는것입니다.
대부분 만들다가 에러가 난다면 urls.py 파일이거나 views.py 파일 문제이니 참고바랍니다.
1 2 3 4 5 6 7 8 9 | from django.contrib import admin from django.urls import path from bot import views urlpatterns = [ path('admin/', admin.site.urls), path('keyboard',views.keyboard), path('message',views.answer), ] |
이렇게 수정을 해주셔야 합니다 다만 3번라인의 경우 사용자에 맞춰 수정해야합니다.
1~2번 라인 : 기본적으로 urls.py 에 입력되있는 줄 입니다 (건드리지 마세요).
3번 라인 : bot 폴더의 views파일을 import 하겠다는 소리입니다 여기서 bot 부분은 위에서 설정한 어플리케이션 폴더이름 입니다.
5번 라인 : 이 부분부터 요청이 들어오면 어디로 보내줄지 설정하는 부분입니다
6번 라인을 보시면 'admin/' 경로로 요청이 들어오면 admin.site.urls 로 보낸다는 뜻입니다
7번 라인은 kakao API 에서 keyboard 요청이 오면 이것을 3번라인에서 import 해준 views파일의 keyboard부분으로 보내준다는 의미입니다.
8번 라인 역시 kakao API 에서 message 요청이 오면 이것을 3번라인에서 import 해준 views파일의 answer 부분으로 보내준다는 의미입니다.
이 부분을 잘 알고 넘어가셔야 나중에 혼자서 응용이 가능합니다.
SMC/bot/views.py 를 이제 수정해보겠습니다 이 파일은 파이썬언어로 제작해야하며 이제 카카오톡 API 에 응답을 해주는 핵심 부분입니다.
또한 이 파일을 응용하셔야 입맛대로 카카오톡 봇 수정이 가능합니다.
https://github.com/plusfriend/auto_reply 를 보시면 카카오 API에서 어떻게 개발해야하는지 알려주고 있습니다.
먼저 Home Keyboard API 요청에 대답을 해줘야 합니다.
다음과 같이 테스트 코드를 짜서 views.py 파일에 넣어보겠습니다.
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 | from django.shortcuts import render from django.views.decorators.csrf import csrf_exempt from django.http import JsonResponse import json def keyboard(request): return JsonResponse({ 'type':'buttons', 'buttons':['버튼1','버튼2'] }) @csrf_exempt def answer(request): json_str = ((request.body).decode('utf-8')) received_json_data = json.loads(json_str) datacontent = received_json_data['content'] if datacontent == '버튼1': button1 = "버튼1을 누르셨습니다." return JsonResponse({ 'message': { 'text': button1 }, 'keyboard': { 'type':'buttons', 'buttons':['버튼1','버튼2'] } }) elif datacontent == '버튼2': button2 = "버튼2을 누르셨습니다." return JsonResponse({ 'message': { 'text': button2 }, 'keyboard': { 'type':'buttons', 'buttons':['버튼1','버튼2'] } }) |
이제 각 라인별로 설명을 해드리겠습니다.
1~4 라인 : 필요한 함수 import 부분
8~13 라인 : KAKAO API 에서 keyboard 부분을 보면 이용자가 최초로 채팅방에 들어올 때 호출 한다고 합니다
그러면 이 라인은 이용자가 들어와서 keyboard 부분을 호출하면 위에 설정한 urls.py 파일이 자동으로 views.py 에 이부분으로 넘겨줍니다
이 라인의 기능은 buttons 타입으로 버튼 2개를 생성합니다 즉 사용자가 처음으로 들어오면 버튼1,버튼2 이렇게 버튼2개가 생성됩니다.
15~48 라인 : KAKAO API 에서 메세지 수신 및 자동 응답 API 부분을 보시면 아실수 있듯 keyboard 에서 누른 버튼의 응답을 설정하는 부분입니다
간단한 if 문이네요 버튼1이 눌리면 button1 내용을 설정하고 출력 + keyboard 값 전송
keyboard 값을 전송하는 이유는 버튼을 누르면 26~28 라인만 있어도 출력은 됩니다만 출력되고 나서 버튼이 사라집니다 왜나하면 버튼을 뿌려주는 keyboard 값은 최초 1회만 주고 다시 안 주었기 때문입니다. 그래서 29~31 라인에서 keyboard 값을 값이 줌으로써 메세지 출력 + 버튼이 다시 생깁니다.
36~48 라인 역시 이와 동일합니다.
이제 제일 중요한 KAKAO API 로 테스트를 해봐야 합니다. 먼저 Django 서버를 열어주세요.
manage.py 가 있는 상위 폴더로 이동하셔서 다음 명령어를 실행합니다.
1 | python manage.py runserver 0.0.0.0:8000 |
하지만 여기서 다시 아마존 EC2 설정을 만져줘야 합니다 현재 우리가 8000포트로 서버를 열었으니 보안 그룹으로 가서 8000포트를 추가해 줍니다
소스는 위치 무관으로 해주시던가 카카오 proxy 서버 110.76.143.234 / 110.76.143.235 / 110.76.143.236 을 추가해 주세요
테스트 하기
적용이 완료되었다면 정상적으로 응답이 오는지 테스트를 해보실수 있습니다.
카카오 측에서 제공하는 테스트 방법입니다 터미널에 다음과 같이 입력해주세요.
1 | curl -XGET 'http://설정한 고정ip 주소:8000/keyboard' |
치셔서 {"type": "buttons", "buttons": ["\ubc84\ud2bc1", "\ubc84\ud2bc2"]} 이렇게 나오시면 성공입니다.
저안에 ["\ubc84\ud2bc1", "\ubc84\ud2bc2"] 부분은 views 설정한 내용에 따라 다르게 나옵니다.
JSON 인코딩 하면 {"type":"buttons","buttons":["버튼1","버튼2"]} 이렇게 나옵니다.
또 다른 테스트 방법은 카카오톡 플러스 친구 관리자 에서 테스트 하는 방법입니다.
① https://center-pf.kakao.com/ 로 이동하여 줍니다.
② 본인의 카카오 계정으로 로그인 합니다.
③ 플러스 친구를 하나 만들어주세요
④ 스마트 채팅 메뉴에서 API 형 설정하기 를 눌러줍니다.
여기서 이렇게 OK가 뜬다면 정상적으로 동작하는것 입니다.
모든 설정이 끝나면 이제 휴대폰에서 다음처럼 확인이 가능합니다
이제 급식 파서를 구해서 적용시켜 보겠습니다.
3.급식 파서 구하기
views.py 파일을 수정하여 급식파싱해 알려주는 기능을 추가해보겠습니다.
급식 파서는 Git 을 조금 뒤져보니 다른분들이 만들어준 오픈소스가 있어서 이걸 수정해서 사용하기로 하였습니다.
제가 사용한 소스는 https://github.com/M4ndU/inhun_kakao_chat_bot_2 입니다.
급식파서를 만드는 귀차니즘을 덜어준 제작자님인 M4ndU 님께 감사를 드립니다.
먼저 BeautifulSoup 라이브러리를 설치해줍니다.
아래 소스를 함께 봅시다 제가 M4ndU 오픈소스를 수정해보았습니다.
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 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 | from django.shortcuts import render from django.views.decorators.csrf import csrf_exempt from django.http import JsonResponse from pytz import timezone import datetime , json import requests from bs4 import BeautifulSoup import re api_info = '__세명컴고 급식봇 정보__\n 개발자 : 301 이병준 \n 관리자 : 301 김찬 \n 관리자 : 301 문준혁 \n Special Thanks : M4ndU' _else = "[*]현재 해당 기능은 시스템 점검 중입니다...\n 나중에 다시 시도해주세요" PlzStopIt = "[*]연속동일요청입니다. 나중에 다시 시도해주세요." btn_list = ['급식 정보','각종 일정 정보','기타'] btn_list1 = ['오늘 급식','내일 급식','돌아 가기'] btn_list2 = ['전교생 소집일','개학식','돌아 가기'] btn_list3 = ['BOT 정보','자주 묻는 질문','돌아 가기'] btn_list4 = ['1.급식메뉴가 안뜹니다','2.칼로리는 안나오나요?','3.급식알리미 서비스 종료날짜는?','4.오픈소스','돌아 가기'] qa_1 = "교육청(나이스) 서버 에러입니다.\n 발생 이유는 다음과 같습니다 \n 1.교육청 서버 점검 \n 2. 교육청 서버 터짐" qa_2 = "해당 기능은 귀찮아서 보류하였습니다. \n (아마 언젠간 추가될수도...)" qa_3 = "급식 알리미는 아마존 AWS 프리티어를 사용해서 동작합니다 \n 따라서 프리티어 종료일인 2019년 9월 1일 급식알리미 서비스는 종료됩니다 \n (차피 카카오 API형 챗봇 서비스가 공식적으로 2019년 12월 지원이 종료되기 때문에 어차피 12월 되면 사라집니다 그냥 조기 종료라고 생각해주세요.)" qa_4 = "급식알리미는 오픈소스 입니다. \n 제작자 블로그에 방문하시면 소스를 보실수 있습니다. \n 제작자 블로그는 급식알리미 홈에서 웹사이트를 누르시면 접속됩니다" #급식 정보 요청에 한해서 중복 요청 방지 설정 class user_chk(): def __init__(self): self.pre_key = "" #이전 user_key값 self.now_key = "" #현재 user_key값 def check(self, key): self.now_key = key # now_key값에 현재 user_key값 대입 if self.pre_key == self.now_key : # 비교 하여 같으면 1을 반환 passcode = 1 else : self.pre_key = self.now_key # 다를 경우 pre_key값에 now_key값을 덮어쓰고 0 반환 passcode = 0 return passcode #필요한 개수만큼 생성해둠. u0 = user_chk() u1 = user_chk() #급식 출력 설정 @csrf_exempt def get_meal(dt): local_date = dt.strftime("%Y.%m.%d") local_weekday = dt.weekday() menu = get_diet(2, local_date, local_weekday) if len(menu) == 1: lunch = "급식정보가 없습니다." return ret_proc(lunch) else: dinner = get_diet(3, local_date, local_weekday) if len(dinner) == 1: lunch = "[" + local_date +" 중식 급식 안내]\n" + menu dinner = "" else: lunch = "[" + local_date +" 중식 급식 안내]\n" + menu dinner = "[" + local_date +" 석식 급식 안내]\n" + dinner + "\n" return ret_proc(lunch + dinner) #버튼 설정 @csrf_exempt def ret_btn(b_list): return JsonResponse({ 'message': { 'text': "목록을 불러옵니다.\n 하단 버튼을 확인해주세요" }, 'keyboard': { 'type': 'buttons', 'buttons': b_list } }) #출력후 동작 설정 @csrf_exempt def ret_proc(output): return JsonResponse({ 'message': { 'text': output }, 'keyboard': { 'type': 'buttons', 'buttons': btn_list } }) #초기 채팅방 입장시 동작 설정 @csrf_exempt def keyboard(request): return JsonResponse({ 'type': 'buttons', 'buttons': btn_list }) #버튼 동작 설정 @csrf_exempt def answer(request): json_str = ((request.body).decode('utf-8')) received_json_data = json.loads(json_str) datacontent = received_json_data['content'] user_key = received_json_data['user_key'] if datacontent == '급식 정보': return ret_btn(btn_list1) elif datacontent == '각종 일정 정보': return ret_btn(btn_list2) elif datacontent == '기타': return ret_btn(btn_list3) elif datacontent == '오늘 급식': if u0.check(user_key): return ret_proc(PlzStopIt) dt = datetime.datetime.today() return get_meal(dt) elif datacontent == '내일 급식': if u1.check(user_key): return ret_proc(PlzStopIt) dt = datetime.datetime.today() + datetime.timedelta(days=1) return get_meal(dt) elif datacontent == '전교생 소집일': td = datetime.date.today() sd = datetime.date(2019,2,28) delta = sd - td int(delta.days) dday = "[-]전교생 소집일까지 %d일 남았습니다. (오후 2시까지 집합)" % (delta.days) return ret_proc(dday) elif datacontent == '개학식': td = datetime.date.today() sd = datetime.date(2019,3,4) delta = sd - td int(delta.days) dday = "[-]개학식까지 %d일 남았습니다." % (delta.days) return ret_proc(dday) elif datacontent == 'BOT 정보': return ret_proc(api_info) elif datacontent == '자주 묻는 질문': return ret_btn(btn_list4) elif datacontent == '돌아 가기': return ret_btn(btn_list) elif datacontent == '1.급식메뉴가 안뜹니다': return ret_proc(qa_1) elif datacontent == '2.칼로리는 안나오나요?': return ret_proc(qa_2) elif datacontent == '3.급식알리미 서비스 종료날짜는?': return ret_proc(qa_3) elif datacontent == '4.오픈소스': return ret_proc(qa_4) else: #오류 예외 처리문 return ret_proc(_else) #이 아래는 급식 파서 설정 def get_html(url): _html = "" resp = requests.get(url) if resp.status_code == 200: _html = resp.text return _html def get_diet(code, ymd, weekday): schMmealScCode = code #int schYmd = ymd #str num = weekday + 1 #int 0월1화2수3목4금5토6일 URL = ( "http://stu.sen.go.kr/sts_sci_md01_001.do?" "schulCode=B100000659&schulCrseScCode=4&schulKndScCode=04" "&schMmealScCode=%d&schYmd=%s" % (schMmealScCode, schYmd) ) html = get_html(URL) soup = BeautifulSoup(html, 'html.parser') element = soup.find_all("tr") element = element[2].find_all('td') try: element = element[num] #num element = str(element) element = element.replace('[', '') element = element.replace(']', '') element = element.replace('<br/>', '\n') element = element.replace('<td class="textC last">', '') element = element.replace('<td class="textC">', '') element = element.replace('</td>', '') element = element.replace('(h)', '') element = element.replace('.', '') element = element.replace('[*]','') element = element.replace('*','') element = re.sub(r"\d", "", element) except: element = ' ' return element |
만약 사용하시려면 필요한 라인 알아서 수정하시고 사용하시면 됩니다.
가장 중요한 학교 설정은
1 2 3 | http://stu.sen.go.kr/sts_sci_md01_001.do?" "schulCode=B100000659&schulCrseScCode=4&schulKndScCode=04" "&schMmealScCode=%d&schYmd=%s |
부분에서 schulCode=B100000659 만 자신의 학교코드로 수정해주면 됩니다.
현재 그래서 급식알리미는 (2019.1.11) 기준 정상적으로 아래 사진처럼 운영중입니다.
긴글 읽어주셔서 감사합니다.
이것으로 아마존 AWS 활용해서 카카오톡 봇 만들기를 마치겠습니다.
내용 중 궁금하신점은 언제든지 댓글로 요청 부탁드립니다.
(추후 시간이 남는다면 i빌더를 사용해서 새롭게 봇을 만들어보겠습니다)
'포트폴리오' 카테고리의 다른 글
CentOS7 기반 PXE 서버 구성하기 (0) | 2019.04.24 |
---|