SlideShare uma empresa Scribd logo
1 de 200
Baixar para ler offline
중고등학생을 위한
하루만에 만드는 챗봇
누구나 배우는
강준영 교하고등학교 2학년
오늘의 일정
일정 timetable
강사 / 강의 소개
챗봇에 대한 이해 및 기획
챗봇 코딩의 기초 및 개발
다양한 API의 적용
DB 연결 및 실제 적용
14:00 - 14:30 (30분)
14:30 - 15:20 (50분)
15:30 - 17:00 (90분)
17:10 - 18:00 (50분)
18:10 - 19:00 (50분)
목차
목차 index
강사 소개
강의 소개
챗봇이란 무엇인가
챗봇 기획하기
개발 환경 구축하기
PHP 언어의 기초
직접 코딩하기
다이얼로그 구현하기
다양한 API - 급식
다양한 API - 날씨/가상화폐
DB 연결하기
마무리
강사 소개
강사 소개
교하고등학교 2학년 재학
프리랜서 웹/챗봇 개발자
학교 챗봇 GHHS 시리 개발
학교 동아리 세미콜론 부장
페이스북 커뮤니티 0XD 운영자
0X년생 개발자(Developers) 모임, 약 350명
GHHS 시리
호출 수 1000회/일, 넉달간 10만회
GHHS 시리
GHHS 시리 - 시연영상
현재 구현된 기능
급식, 날씨(기온, 미세먼지), 버스 도착 정보
자유대화, 개발자 정보, 후원, 도움말
현재 베타 서비스 중인 기능
시간표, 학사일정
강의 소개
강의 소개
누구나 배우는 하루만에 만드는 챗봇
챗봇을 입문하고자 하거나, 챗봇에 관심있는 분들을 위한 강의
직접 코딩을 통한 서비스 단계까지의 제작을 목표로 함
우리가 배울 내용
챗봇의 기초 및 기획 / 챗봇 개발(PHP)
챗봇이란 무엇인가?
메신저 사용자
2012 2013 2014 2015
SNS 사용자
메신저 서비스 사용자
대화형 인터페이스 상에서 규칙 또는 AI(인공지능)으로
유저와 인터렉션 하는 서비스
" "
단순하게, 사람대신 답변해주는 로봇" "
그렇다면 왜 챗봇인가?
우리는 왜 챗봇을 이용하는가? (=우리는 왜 챗봇을 개발해야 하는가?)
간단하다
그래픽 요소 / 채팅은 우리의 일상
편리하다
다수가 공공장소에서 전화보다 텍스트를 선호
빠르다
별도의 앱을 다운로드 할 필요가 없다
맞춤 컨텐츠를 제공한다
개인에 맞춘 컨텐츠 경험 가능
즉각 반응한다
메세지를 즉각적으로 전달, 시간을 절약
저는 프로그래밍을 해본적이 없어요
고작 아는게 C언어 정도인데 가능한건가요?
" "
" "
챗봇을 기획해보자
챗봇 기획하기 1단계
어떤 챗봇을 만들것인가?
급식 봇
날씨 봇
버스 도착 정보 봇
미세먼지 봇
배틀그라운드 전적 봇
급식 봇
날씨 봇
(응용) 가상화폐 시세 조회 봇
+
챗봇 기획하기 2단계
어떤 서비스를 제공할 것인가
급식
NEIS 교육청 학교 급식 파싱 API를 이용하여 급식 정보 호출
급식 정보를 적절하게 가공하여, 오늘 급식과 내일 급식 출력
날씨
OpenWeatherAPI를 사용하여 날씨 정보 호출 / 출력
챗봇 기획하기 3단계
한번 대화를 구성해보자
대화 시작하기 - 급식
[급식 정보]를 누르면 [오늘 급식], [내일 급식], [처음으로] 버튼을 보여줌
[오늘 급식]을 누르면 오늘 급식 정보를, [내일 급식]을 누르면 내일 급식 정보 출력 후 메인 화면으로 복귀
대화 시작하기 - 날씨
[날씨 정보]를 누르면 최신의 날씨(기온)을 출력한 후 메인화면으로 복귀
자유 대화하기
직접 타이핑을 통해 메뉴를 선택할 수 있게 [자유 대화]를 메인에 추가
개발 환경 구축하기 - 1단계
VS CODE 설치
이미 Atom, Sublime Text, VS Code 등의 텍스트 에디터가 설치되신
분들은 잠시 쉬셔도 좋습니다 :)
Visual Studio Code 설치
https://code.visualstudio.com
Visual Studio Code 실행
Open Folder > 디렉토리 선택
New File >
keyboard.php / message.php
개발 환경 구축하기 - 2단계
FileZilla 설치
FTP* Client
*FTP란, File Transfer Protocol의 약자로 서버와 파일을 주고받을때 사용하는 프로토콜입니다.
FileZilla 설치
https://filezilla-project.org
Download FileZilla Client
개발 환경 구축하기 - 3단계
닷홈 호스팅 세팅
Dothome 호스팅 가입
https://dothome.co.kr
Dothome 호스팅 가입
Dothome 무료 호스팅 신청
웹호스팅 탭 > 무료 호스팅
아래에서 무료호스팅 Like+ 신청
좀 더 자세히 할것 과정 2-3r개 추가
Dothome 무료 호스팅 신청 FAQ
FTP 아이디와 비밀번호는 무엇인가요?
아까전에 설치한 FileZilla와 같은 FTP 클라이언트가
서버와 파일을 주고받을때 필요한 아이디와 비밀번호입니다.
DB 비밀번호는 무엇인가요?
Database에 접속하기 위한 비밀번호입니다.
닷홈 고객센터 > 기술지원접수
새글 쓰기로 아래와 같이 적은 후 제출해주세요
'php allow_url_fopen 설정을 On으로 변경 부탁드립니다.'
앞으로의 과정에 있어 제출하지 않을 경우 수많은 오류에 부딪힙니다ㅠㅠ
개발 환경 구축하기 - 4단계
플러스친구 생성
플러스친구 만들기
https://center-pf.kakao.com/login
플러스친구 만들기 >
카카오 계정으로 로그인
플러스친구 생성
자, 이제 모든 준비는 끝났습니다.
두눈 크게 뜨고 따라오세요!
개발하기
PHP 언어의 기초
VS Code에서 아까 열어놓은 폴더에 index.php를 만들어봅니다.
먼저 아래와 같이 입력합니다.
<?php
$contents = "this is sample text";
echo $contents;
?>
해설
php는 <?php로 시작해서 ?>로 끝납니다.
contents라는 변수에 "this is sample text"라는 문자열을 넣었습니다.
echo를 이용하여 contents 변수의 내용을 출력합니다.
출력
this is sample text
이제 기초도 끝났습니다(?)
사실, 중요한 것들은 챗봇을 개발하면서 알아갈 예정입니다.
챗봇 API???
카카오톡 플러스친구 API
https://github.com/plusfriend/auto_reply
HTTP Request에 대한 이해
HTTP 프로토콜을 사용하는 서버에 대해 GET, POST 등의 메소드를 요청하면
서버가 응답코드*와 함께 응답한다.
*응답코드란, 200/403/404/503 등과 같은 응답을 말하는데 흔히 제대로 응답을 주고받은 경우 200을, 해당 디렉토리나 파일에 접근할 권한이 없는 경우 403(Forbidden)
을, 해당 컨텐츠가 존재하지 않는 경우 404(Not Found)를, 서버 내부의 응답 오류일 경우 503(Internal server error)을 응답하고 이외에도 여러가지 응답코드가 있다.
JSON에 대한 이해
keyboard.php
Method : GET
URL : http(s)://:your_server_url/keyboard
Content-Type : application/json; charset=utf-8
Request
Response
{
"type" : "buttons",
"buttons" : ["선택 1", "선택 2", "선택 3"]
}
curl -XGET 'https://:your_server_url/keyboard'
message.php
Method : POST
URL : http(s)://:your_server_url/message
Content-Type : application/json; charset=utf-8
Request Response
{
"message": {
"text": "귀하의 차량이 성공적으로 등록되었습니다. 축하합니다!",
},
"keyboard": {
"type": "buttons",
"buttons": [
"처음으로",
"다시 등록하기",
"취소하기"
]
}
}
curl -XPOST 'https://:your_server_url/message' -d '{
"user_key": "encryptedUserKey",
"type": "text",
"content": "차량번호등록"
}'
쉬는 시간
쉬는 시간입니다 :)
뒤쪽에 다과가 마련되어 있습니다 :D
개발하기
챗봇을 만들어봅시다.
keyboard.php
keyboard.php는 키보드를 정의한다!
유저가 맨 처음에 채팅방에 들어갔을 때 호출되는 파일
키보드를 정의하는 역할
오른쪽과 같이 버튼이 나오는 경우
직접 키보드를 통해 텍스트를 입력하는 경우
keyboard.php Source Code
<?php // php 파일 시작
echo <<< EOD // echo를 통해 json 출력, EOD 시작
{ // json 시작
"type" : "buttons", // 키보드의 타입은 버튼
"buttons" : [ // 버튼 내용을 정의 (배열)
"급식", // 급식 버튼
"날씨", // 날씨 버튼
"코인", // 코인 버튼
"자유대화" // 자유대화 버튼
] // 배열 끝
} // json 끝
EOD; // EOD 끝
?> // php 파일 끝
주의해야 할 점! 'echo <<< EOD'와 EOD;앞에 공백 X
type은 required, buttons는 optional.
개발하기
이제 가장 중요한 부분!!!
message.php
keyboard.php는 대화내용을 정의한다!
유저가 맨 처음에 채팅방에 들어간 이후 진행되는 대화 내용을
정의하는 역할.
각각의 대화 내용 케이스 별로 챗봇의 응답 내용을 정의한다.
message.php Source Code [Part 1]
<?php
$data = json_decode(file_get_contents('php://input'), true);
$content = $data["content"];
...
PHP input을 받은 내용을 json_decode()를 이용하여 $data 변수에 저장한다.
json_decode()는 json 형태의 데이터를 배열 형태로 바꿔주는 함수이다.
$data의 content 배열을 가져와 $content 변수에 저장한다.
결론적으로 모든 사용자의 메세지는 $content 변수로
들어간다!
" "
그렇다면 if($content=='input')과 같은 조건문을
통해 사용자의 메세지를 확인할 수 있지 않을까???
" "
그런 다음에, 아까전의 keyboard.php 파일처럼
챗봇의 응답 텍스트를 echo를 통해 보낼 수 있지 않을까???
" "
message.php Source Code [Part 2]
if($content == "급식"){
echo <<< EOD
{
"message": {
"text": "급식을 선택하세요."
},
"keyboard": {
"type": "buttons",
"buttons": [
"오늘 급식",
"내일 급식",
"처음으로"
]
}
}
EOD;
}
만약 input 값이 "급식"과 일치한다면,
text 타입의 message를 전송
이와 함께 buttons 타입의 키보드를 보여준다.
buttons에는 여러개의 내용을 배열로 담는다.
message.php Source Code [Part 3]
elseif($content == "날씨"){
echo <<< EOD
{
"message": {
"text": "날씨는 {weather}도 입니다."
},
"keyboard": {
"type": "buttons",
"buttons": [
"급식",
"날씨",
"코인"
"자유대화"
]
}
}
EOD;
}
만약 input 값이 "날씨"과 일치한다면,
text 타입의 message를 전송
이와 함께 buttons 타입의 키보드를 보여준다.
buttons에는 여러개의 내용을 배열로 담는다.
message.php Source Code [Part 4]
elseif($content == "처음으로"){
echo <<< EOD
{
"message": {
"text": "메인입니다."
},
"keyboard": {
"type": "buttons",
"buttons": [
"급식",
"날씨",
"코인",
"자유대화"
]
}
}
EOD;
}
만약 input 값이 "처음으로"와 일치한다면,
text 타입의 message를 전송
이와 함께 buttons 타입의 키보드를 보여준다.
buttons에는 여러개의 내용을 배열로 담는다.
message.php Source Code [Part 5]
elseif(strpos($content, "오늘") !== false && strpos($content, "급식") !== false){
echo <<< EOD
{
"message": {
"text": "오늘 급식은 {meal}입니다."
},
"keyboard": {
"type": "buttons",
"buttons": [
"급식",
"날씨",
"코인",
"자유대화"
]
}
}
EOD;
}
만약 input 값이 "오늘"과 "급식"을 포함한다면,
text 타입의 message를 전송
이와 함께 buttons 타입의 키보드를 보여준다.
buttons에는 여러개의 내용을 배열로 담는다.
message.php Source Code [Part 6]
elseif(strpos($content, "내일") !== false && strpos($content, "급식") !== false){
echo <<< EOD
{
"message": {
"text": "내일 급식은 {meal}입니다."
},
"keyboard": {
"type": "buttons",
"buttons": [
"급식",
"날씨",
"코인",
"자유대화"
]
}
}
EOD;
}
만약 input 값이 "내일"과 "급식"을 포함한다면,
text 타입의 message를 전송
이와 함께 buttons 타입의 키보드를 보여준다.
buttons에는 여러개의 내용을 배열로 담는다.
message.php Source Code [Part 7]
if($content == "자유대화"){
echo <<< EOD
{
"message": {
"text": "안녕?n탈출은 처음으로 입력"
}
}
EOD;
}
만약 input 값이 "자유대화"를 포함한다면,
text 타입의 message를 전송
사용자 직접 입력 가능한 키보드를 보여준다.
message.php Source Code [Part 8]
else{
echo <<< EOD
{
"message": {
"text": "개발중이거나 잘못됩 입력이에요ㅠ"
},
"keyboard": {
"type": "buttons",
"buttons": [
"급식",
"날씨",
"코인",
"자유대화"
]
}
}
EOD;
}
만약 input 값이 어떠한 것과도 일치하지 않으면,
text 타입의 message를 전송
이와 함께 buttons 타입의 키보드를 보여준다.
buttons에는 여러개의 내용을 배열로 담는다.
개발하기
이제 올려봅시다아ㅏㅏ
서버에 올려서 실제로 테스트 해보는 단계!!!
FileZilla를 실행하고 정보를 입력합니다.
Host : XXXXX.dothome.co.kr (본인의 닷홈 서브도메인 입력)
Username : XXXXX (본인의 FTP Username - 닷홈 설정 입력)
Password : XXXXX (본인의 FTP Password - 닷홈 설정 입력)
Port : FTP 기본 포트는 21
FileZilla를 통해 업로드합니다.
왼쪽은 로컬PC의 디렉토리, 오른쪽은 서버 디렉토리
모든 내용은 html 폴더 내에 넣어야 합니다. / html 폴더 내의 파일을 모두 지워주세요.
드래그 앤 드랍으로 올려주세요!
이제 API 테스트를 해야 합니다.
개발하기
챗봇 테스트
다시 관리자 센터로 접속해서 아까 만든 플러스 친구로 들어가주세요
카카오톡 관리자 센터에서 좌측 메뉴의 스마트 채팅!
스마트 채팅에서 오른쪽의 API형 선택
정보 입력 후 앱 URL 입력 / keyboard.php가 제대로 작동하는지 확인!
앱 URL :
XXXXX.dothome.co.kr/
으로 입력합니다.
하지만,
우리가 원하는 결과 대신에 이런 화면이...
지금부터 원인이 무엇인지 알아봅시다
흔히 실수하고 막히는 부분이라 자세히 설명할게요!
개발하기
.htaccess 설정하기
도대체 .htaccess가 뭐길래???
.htaccess에 대한 이해
.htaccess (hypertext access)는 Apache 웹 서버의 디렉토리 레벨을 설정하는 기본 파일
우리가 사용하는 닷홈의 웹 서버는 Apache 기반이다.
웹 서버의 루트 디렉토리 이하의 디렉토리에서 이 “.htaccess”파일을 생성하여
웹 루트 디렉토리 하위의 디렉토리별로 서로 다른 환경설정을 구축하고자 할때
디렉토리 내부에서 참조해야하는 설정을 구성
각 설정이 다른 .htaccess 파일을 생성하여 디렉토리에 추가
일종의 숨김파일(파일 명 앞에 . 이 붙음)이므로 PC 설정에서 숨김파일 표시가 필요
.htaccess 작성하기
Options +Multiviews
RewriteEngine On
Options -Indexes
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^.]+)$ $1.php [NC,L]
AddType application/x-httpd-php .php
AddDefaultCharSet UTF-8
아까와 같은 디렉토리에 업로드합니다!
FileZilla로 업로드 해주세요
다시 관리자 센터에서 keyboard.php가 제대로 작동하는지 확인!
앱 URL :
XXXXX.dothome.co.kr/
으로 동일하게 입력합니다.
이제 준비가 끝났습니다
좌측 메뉴 관리-상세설정에서 하단의 공개 설정을 모두 켜주세요
테스트하기
직접 테스트해보기
카카오톡을 켜주세요!
카카오톡에 접속해서 아까 설정한 검색용 아이디로 검색합니다.
메세지 보내기를 눌러 채팅을 시작해봅니다.
드디어 기본적인 기능들이 작동합니다
우와아ㅏㅏㅏ (근데 급식하고 날씨는??;;;)
모든 소스코드는 깃허브로 공유합니다 :)
https://github.com/Juneyoung-Kang/chatbot-seminar
깃허브 계정이 있으신 분들은 스타도 살짝 눌러주시면 감사하겠습니다ㅠ
쉬는 시간
쉬는 시간입니다 :)
뒤쪽에 다과가 마련되어 있습니다 :D
개발하기
나만의 대화 구성하기
다이얼로그 추가하기
여기서 잠깐!
아까 message.php에서 $content == ""와
strpos($content, "") !== false는 무엇이 다른가?
$content를 판별하는 두가지 방법
if($content == "blahblah"){ ... }
사용자 입력이 blahblah와 정확하게 일치할때
if문 안의 내용을 실행한다.
if(strpos($content, "blahblah") !== false){ ... }
사용자 입력에 blahblah가 포함되어 있는 경우
if문 안의 내용을 실행한다.
strpos()함수
$content에서 "blahblah"가 처음 나타나는 위치를 반환. 위치를 찾지 못한 경우 FALSE를 반환
그렇다면,
본인만의 대화를 구현해보자
예시
elseif(strpos($content, "AA") !== false && strpos($content, "BB") !== false){
echo <<< EOD
{
"message": {
"text": "CCCCC"
},
"keyboard": {
"type": "buttons",
"buttons": [
"ABC",
"ABCD",
"ABCDE"
]
}
}
EOD;
}
주의해야 할 점
<echo <<< EOD>와 <EOD;>는 반드시 앞에
공백이 없어야 합니다.
개발하기
API 적용하기
급식과 날씨 API 그리고, 공공데이터 사용하기
API란 무엇인가?
API에 대한 이해
API(Application Programming Interface, 응용 프로그램 프로그래밍 인터페이스)는
응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을
제어할 수 있게 만든 인터페이스를 뜻한다.
단순히 말해, 프로그램을 위한 인터페이스!
API는 어떻게 작동하나요???
만약, 내가 날씨 앱을 만들고자 할 때,
내 앱에서 해당 API를 제공하는 어떠한 곳으로 날짜, 지역 정보를 요청를 보내면,
해당 API에서는 내 앱으로 날씨 정보를 응답한다.
'요청'과 '응답'... 어디서 많이 들어본 듯...?
대표적인 예시로, 내가 API에 (HTTP) Request(ex. GET)를 보내면
해당 API 정보를 알 수 있다!!!
예를 들어 어떤 API가 있나요?
공공데이터포털 data.go.kr
원하는 내용을 검색하고 오픈 API를 선택
API의 예시
날씨 API
급식/학식 API
게임 전적 API
버스 도착정보 API
미세먼지 API
프로야구 API
and more...
API의 종류 중 RESTful API에 대해 알아보자
RESTful API에 대한 이해
RESTful API는 크게 리소스, 메소드, 메세지로 이루어져 있다
예시) 이름이 alpha인 사용자를 생성한다라는 호출이 있을때,
리소스 : "사용자" > http://my_web/users 라는 URI
메소드 : "생성한다" > HTTP POST/GET Request
메세지 : 이름이 alpha인 사용자
HTTP POST, http://my_web/users/
{
"users" : {
"name" : "terry"
}
}
RESTful Architecture 6
균일한 인터페이스 Uniform Interface
상태없음 Stateless
캐시 Cache
클라이언트/서버 Client/Server
계층 시스템 Layered System
(조건부) Code on demand
RESTful API Method
REST에서는 HTTP 메소드를 그대로 사용한다 (CRUD)
POST 등록 (Create)
GET 조회 (Read/Select)
PUT 수정 (Update)
DELETE 삭제 (Delete)
API가 응답하는 결과물은 어떤 형태일까?
RESTful API의 응답 (보통 JSON)
HTTP POST, http://my_web/users/
{
"users" : {
"name" : "terry"
}
}
우리가 사용할 API에 대하여 알아보자
급식 API
깃허브에 오픈소스로 올라와 있는 school_meal API를 사용합니다.
https://github.com/Juneyoung-Kang/school-meal/
날씨 API
OpenWeatherMap API를 사용합니다.
가상화폐 API
빗썸의 API를 이용하여 실시간 시세를 얻습니다.
개발하기
급식 API 적용하기
급식 API의 모든 것
school_meal API (github.com/Juneyoung-Kang/school-meal)
school_meal API 사용방법 (개요)
전국 초중고등학교의 조식, 중식, 석식 급식 정보를 NEIS로부터 파싱하여
JSON 형태로 출력하는 PHP로 작성된 API
school_meal API 사용방법 (개요)
school_meal API 사용방법 (Request)
• 기본 URL : http://juneyoung.kr/api/school-meal/meal_api.php
• 예시 URL : http://juneyoung.kr/api/school-meal/meal_api.php?
countryCode=stu.goe.go.kr&schulCode=J100004922&insttNm=교하고등학교
&schulCrseScCode=4&schMmealScCode=2
school_meal API 사용방법 (파일별 세부 명세)
school_meal API 사용방법 (파일별 세부 명세)
school_meal API 사용방법 (파일별 세부 명세)
school_meal API 사용방법 (파일별 세부 명세)
school_meal API 사용방법 (파일별 세부 명세)
이 모든 파일들과 함께 simple_dom_html.php 파일이 같이
올라가야 합니다.
이제 급식 API를 사용해봅시다
1. 서버에 올라간 파일 사용하기
개인 서버(닷홈)에 API 올리는 방법
1. 서버에 파일 올리기
OpenWeatherMap API를 사용합니다.
2. 닷홈에 php.ini allow_url_fopen On 옵션 설정 문의하기
닷홈 기술지원에 해당 옵션을 켜줄 것을 부탁합니다. (보통 한시간 내에 처리)
이제 웹 브라우저를 열고 다음 주소로 접속합니다
http://juneyoung.kr/meal/meal_api.php?
countryCode=stu.xxx.go.kr&schulCode=X000000000&insttNm=XXXX학교
&schulCrseScCode=X&schMmealScCode=X
빨간 글씨를 어떻게 작성해야 할지 모르신다면? github.com/Juneyoung-Kang/school-meal
이미 올라간 API 사용 (권장)
이제 급식 API를 사용해봅시다
2. JSON 내용을 읽어오는 방법 A-Z
간단한 PHP 파일 작성
<?php
$url = "http://juneyoung.kr/api/school-meal/meal_api.php?
countryCode=stu.goe.go.kr&schulCode=J100004922&insttNm=교하고등학교
&schulCrseScCode=4&schMmealScCode=2";
$content = file_get_contents($url);
$array = json_decode($content, true);
echo $array['메뉴'];
?>
하나씩 살펴보기 - 1
<?php
$url = "http://juneyoung.kr/api/school-meal/meal_api.php?
countryCode=stu.goe.go.kr&schulCode=J100004922&insttNm=교하고등학교
&schulCrseScCode=4&schMmealScCode=2";
...
URL 주소를 변수에 저장
하나씩 살펴보기 - 2
...
$content = file_get_contents($url);
...
URL의 내용을 받아서(file_get_contents 함수 이용) content 변수에 저장
하나씩 살펴보기 - 3
...
$array = json_decode($content, true);
...
받은 내용(json 타입의 $content)을 디코드하여 array 변수에 저장(이때 배열로 저장된다)
하나씩 살펴보기 - 4
...
echo $array['메뉴'];
...
배열 중에 '메뉴' 항목을 출력
이제 급식 API를 사용해봅시다
3. 챗봇에서 출력하기
아까 작성한 message.php에서 오늘 급식 부분
elseif(strpos($content, "오늘") !== false && strpos($content, "급식") !== false){
$url='http://juneyoung.kr/api/school-meal/meal_api.php?
countryCode=stu.goe.go.kr&schulCode=J100004922&insttNm=교하고등학교
&schulCrseScCode=4&schMmealScCode=2';
$content=file_get_contents($url);
$array=json_decode($json, true);
$meal=$array['메뉴'];
echo <<< EOD
{
"message": {
"text": "$meal"
},
.....(생략).....
}
EOD;
}
이제 챗봇에서 확인하면 정상적으로 작동합니다!!!
meal_api.php 말고 다른 파일을 이용한다면
내일 급식이나, 이번주 급식도 출력할 수 있겠죠?
meal_api_custom.php를 이용하면 특정 날짜의 급식 데이터를
가져올 수 있고, 날짜 함수를 이용해 여러날의 급식을 파싱할 수 있습니다.
개발하기
날씨 API 적용하기
날씨 API의 모든 것
OpenWeatherMap API (https://openweathermap.org/api)
가입을 진행합니다
가입 후 보이는 화면에서 API keys를 확인해주세요
이제 API key를 확인했으니, 어떻게 사용하는지 알아봅시다
https://github.com/cmfcmf/OpenWeatherMap-PHP-Api
설치하기 (require composer)
만약 composer가 설치되어 있지 않다면? https://getcomposer.org/doc/00-intro.md
현재 프로젝트 폴더에서 터미널을 켜고 입력해주세요
이제 message.php로 돌아와서 다음 코드를 작성합니다
아까 작성한 message.php에서 맨 위
<?php
use CmfcmfOpenWeatherMap;
...
아까 작성한 message.php에서 날씨 부분
else if(strpos($content, "날씨") !== false){
require 'vendor/autoload.php';
$lang = 'ko';
$units = 'metric';
$owm = new OpenWeatherMap('API KEY');
$weather = $owm->getWeather('Seoul', $units, $lang);
$weather_final=$weather->temperature;
$weather_final=str_replace("&deg;C", "°C", $weather_final);
echo <<< EOD
{
"message": {
"text": "현재 기온은 $weather_final 입니다."
},
.....(생략).....
}
EOD;
}
이제 챗봇에서 확인하면
정상적으로 작동하는 것을 확인할 수 있습니다
쉬는 시간
쉬는 시간입니다 :)
뒤쪽에 다과가 마련되어 있습니다 :D
이러한 API도 있지만 좀 더 실용적인 API는 없을까?
개발하기
가상화폐 시세 API 적용하기
가상화폐 시세 API의 모든 것
빗썸에서는 아주 감사하게도(?)
현재 시세에 관한 정보를 너무나 가공하기 편한 형태로 제공하고 있습니다 :)
사실 이건 거짓말이 아니라 진짜 가공하기 쉬운 타입이에요
https://api.bithumb.com/public/ticker/ALL
데이터가 JSON이므로 아까전의 급식 API와 동일합니다!!!
빗썸 API 명세 - REQUEST
Endpoint (URI)
https://api.bithumb.com/public/ticker/{currency}
{currency} = BTC, ETH, DASH, LTC, ETC, XRP, BCH, XMR, ZEC, QTUM, BTG, EOS, ICX, VEN, TRX,
ELF, MITH, MCO, OMG, KNC, GNT, HSR, ZIL, ETHOS, PAY, WAX, POWR, LRC, GTO, STEEM, STRAT, ZRX,
REP, AE, XEM, SNT, ADA (기본값: BTC), ALL(전체)
빗썸 API 명세 - RESPONSE
Example
{
"status": "0000",
"data": {
"opening_price" : "504000",
"closing_price" : "505000",
"min_price" : "504000",
"max_price" : "516000",
"average_price" : "509533.3333",
"units_traded" : "14.71960286",
"volume_1day" : "14.71960286",
"volume_7day" : "15.81960286",
"buy_price" : "505000",
"sell_price" : "504000",
"24H_fluctate" : "1000",
"24H_fluctate_rate" : "0.19",
"date" : 1417141032622
}
}
빗썸 API 명세 - RESPONSE
Returned value description
{
"status": "0000", // 상태코드
"data": { // 24시간 데이터
"opening_price" : "504000", // 거래시작금액
"closing_price" : "505000", // 마지막 거래금액
"min_price" : "504000", // 최저 거래가
"max_price" : "516000", // 최고 거래가
"average_price" : "509533.3333", // 평균 거래가
"units_traded" : "14.71960286", // 거래량
"volume_1day" : "14.71960286", // 거래량
"volume_7day" : "15.81960286", // 7일간 거래량
"buy_price" : "505000", // 구매가
"sell_price" : "504000", // 판매가
"24H_fluctate" : "1000", // 변동 금액
"24H_fluctate_rate" : "0.19", // 변동률
"date" : 1417141032622 // 타임스탬프
}
}
간단한 코드를 작성해봅시다
간단한 PHP 코드 작성
<?php
$url="https://api.bithumb.com/public/ticker/BTC";
$json=file_get_contents($url);
$array=json_decode($json, true);
$opening_price=$array['data']['opening_price'];
echo $opening_price;
?>
Output
7005000 (값은 다를 수 있습니다)
(php가 설치되어 있으신 분은 터미널에서 $php file.php를 입력해주세요)
이제 이 코드를 붙이기 위한 message.php의 수정이 필요합니다
message.php Source Code [내일 급식 이후 부분]
elseif($content=="코인"){
echo <<< EOD
{
"message": {
"text": "코인을 선택해주세요."
},
"keyboard": {
"type": "buttons",
"buttons": [
"비트코인",
"이더리움",
"리플",
"처음으로"
]
}
}
EOD;
}
message.php Source Code [내일 급식 이후 부분]
elseif($content=="비트코인"){
$url="https://api.bithumb.com/public/ticker/BTC";
$json=file_get_contents($url);
$array=json_decode($json, true);
$buy_price=$array['data']['buy_price'];
$fluctate=$array['data']['24H_fluctate'];
$fluctate_rate=$array['data']['24H_fluctate_rate'];
echo <<< EOD
{
"message": {
"text": "비트코인n시세:$buy_pricen변동가:$fluctate($fluctate_rate)"
},
"keyboard": {
"type": "buttons",
"buttons": [
"급식",
"날씨",
"코인",
"자유대화"
]
}
}
EOD;
}
message.php Source Code [내일 급식 이후 부분]
elseif($content=="이더리움"){
$url="https://api.bithumb.com/public/ticker/ETH";
$json=file_get_contents($url);
$array=json_decode($json, true);
$buy_price=$array['data']['buy_price'];
$fluctate=$array['data']['24H_fluctate'];
$fluctate_rate=$array['data']['24H_fluctate_rate'];
echo <<< EOD
{
"message": {
"text": "이더리움n시세:$buy_pricen변동가:$fluctate($fluctate_rate)"
},
"keyboard": {
"type": "buttons",
"buttons": [
"급식",
"날씨",
"코인",
"자유대화"
]
}
}
EOD;
}
message.php Source Code [내일 급식 이후 부분]
elseif($content=="리플"){
$url="https://api.bithumb.com/public/ticker/XRP";
$json=file_get_contents($url);
$array=json_decode($json, true);
$buy_price=$array['data']['buy_price'];
$fluctate=$array['data']['24H_fluctate'];
$fluctate_rate=$array['data']['24H_fluctate_rate'];
echo <<< EOD
{
"message": {
"text": "리플n시세:$buy_pricen변동가:$fluctate($fluctate_rate)"
},
"keyboard": {
"type": "buttons",
"buttons": [
"급식",
"날씨",
"코인",
"자유대화"
]
}
}
EOD;
}
서버에 올리고 실행해보세요 :D
이것으로 API를 마치고, DB로 넘어가려고 합니다
개발하기
DB 연결하고 사용자 데이터 처리하기
DB 연결을 해봅시다!!! 좀만 더 힘을 내요!!!
왜 DB를 써야 하는가?
사용자 데이터 저장
통계
메세지 분석
약간의 회원관리 형식(?)
DB의 기초는 DB Connection!
XXXXX.dothome.co.kr/myadmin 접속하고 MYSQL ID/PW 입력해주세요
화면에서 DB이름을 확인해주세요
DB의 기초는 DB Connection!
프로젝트 폴더에 include 폴더를 만들고 그 안에 dbconfig.php를 만들어주세요
/include/dbconfig.php
<?php
$db_server = "localhost";
$db_id = "(MYSQL ID)";
$db_password = "(MYSQL PW)";
$db_name = "(DB NAME)";
$mysqli = new mysqli($db_server, $db_id, $db_password, $db_name);
$mysqli->set_charset("utf8");
$conn = mysqli_connect($db_server, $db_id, $db_password, $db_name);
mysqli_query($conn, "SET CHARSET UTF8");
if($conn -> connect_error){
die ("DB Connect failed".$conn->connect_error);
}
?>
다시 message.php로 돌아와서 다음과 같은 코드를 맨위에 추가합니다
message.php 맨 위
<?php
include('include/dbconfig.php');
...
message.php에서 $content=$data["content"]; 다음
...
$user_key=$data["user_key"];
...
다시 PHPMYADMIN으로 돌아와서,
log와 user 테이블을 만들어주세요
데이터베이스 선택 후 SQL 탭에서 다음 내용 입력
CREATE TABLE `user` (
`idx` int(100) NOT NULL,
`user_key` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `log` (
`idx` int(100) NOT NULL,
`user_key` varchar(255) DEFAULT NULL,
`content` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `user`
ADD UNIQUE KEY `idx_2` (`idx`),
ADD KEY `idx` (`idx`);
ALTER TABLE `log`
ADD UNIQUE KEY `idx_2` (`idx`),
ADD KEY `idx` (`idx`);
ALTER TABLE `user`
MODIFY `idx` int(100) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;
ALTER TABLE `log`
MODIFY `idx` int(100) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;
다시 message.php로 돌아와 주세요
아 어지러워요ㅠㅠㅠ
간단하게 마이페이지를 자유대화에서 입력해서 이전에 사용한 적이 없으면 환영메세지가 뜨게,
있으면 다시와서 반갑다는 메세지가 뜨도록 구현하도록 하겠습니다.
간단하게 생각하면 if 조건문과 sql의 select/insert 문을 사용하면 되겠죠???
이게 무슨 말이냐고요???
message.php에서 $user_key=$data["user_key"]; 다음
...
$sql = "insert into log(user_key, content) values('$user_key','$content')";
$mysqli->query($sql);]
...
자유대화 다음
elseif(strpos($content, "마이페이지") !== false){
$query = "select * from user where user_key='$user_key'";
$row = mysqli_fetch_assoc($mysqli->query($query));
if(!$row){
$sql = "insert into user(user_key) values('$user_key')";
$mysqli->query($sql);
echo <<< EOD
{
"message": {
"text": "처음 오신 것을 환영합니다!"
},
"keyboard": {
"type": "buttons",
"buttons": [
"급식",
"날씨",
"코인",
"자유대화"
]
}
}
EOD;
}else {
echo <<< EOD
{
"message": {
"text": "다시와줘서 고마워요!"
},
"keyboard": {
"type": "buttons",
"buttons": [
"급식",
"날씨",
"코인",
"자유대화"
]
}
}
EOD;
}
}
다시 카카오톡에서 자유대화를 누른후 마이메이지를 입력해보면,
처음에는 '처음오신 것을 환영합니다'가 나오지만,
이후에 시도해보면 계속 '다시 와줘서 고마워요'가 출력됨을 알 수 있습니다
이상 DB와 관련된 내용을 마치겠습니다
와아아아ㅏㅏ
여기까지가 오늘 우리의 목표입니다
놓치지 않고 잘 따라오셨는지요?
개발이 처음이라는 분들도 여럿 계셨습니다
최대한 쉽게 설명해드리려고 했는데
제대로 전달 되었는지 모르겠습니다ㅠㅠ
이제 남은 것은 기능의 추가(인공지능? 또는 기타 API) 뿐입니다.
혹시라도 궁금하신 점이 있으시면 말씀해주세요!
혹시라도 나중에 챗봇 개발하시다가 궁금하시면
아래 연락처로 연락해주시면 정성껏 답해드리겠습니다 :D
facebook. /juneyoungdev
email. juneyoungdev@gmail.com
추가적으로 구름(edu.goorm.io)과 인프런(inflearn.com)에
제 강의가 올라갈 예정에 있습니다.
여기서는 좀 더 다양한 언어와 플랫폼을 다뤄보도록 하겠습니다.
이상으로 강의를 마치겠습니다
끝까지 들어주셔서 감사합니다

Mais conteúdo relacionado

Mais procurados

자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
Esun Kim
 
Google Protocol buffer
Google Protocol bufferGoogle Protocol buffer
Google Protocol buffer
knight1128
 
H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요
KTH
 
파이썬 스터디 9장
파이썬 스터디 9장파이썬 스터디 9장
파이썬 스터디 9장
SeongHyun Ahn
 
니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트
효준 강
 

Mais procurados (20)

자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
 
Google Protocol buffer
Google Protocol bufferGoogle Protocol buffer
Google Protocol buffer
 
[NEXT] Flask 로 Restful API 서버 만들기
[NEXT] Flask 로 Restful API 서버 만들기 [NEXT] Flask 로 Restful API 서버 만들기
[NEXT] Flask 로 Restful API 서버 만들기
 
Sublime Text 3 for python and django
Sublime Text 3 for python and djangoSublime Text 3 for python and django
Sublime Text 3 for python and django
 
파이썬을 배워야하는 이유 발표자료 - 김연수
파이썬을 배워야하는 이유 발표자료 - 김연수파이썬을 배워야하는 이유 발표자료 - 김연수
파이썬을 배워야하는 이유 발표자료 - 김연수
 
141103 최창원 파이썬 확장 프로그래밍
141103 최창원 파이썬 확장 프로그래밍141103 최창원 파이썬 확장 프로그래밍
141103 최창원 파이썬 확장 프로그래밍
 
Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017
 
안드로이드 DB, 서버 연동하기
안드로이드 DB, 서버 연동하기안드로이드 DB, 서버 연동하기
안드로이드 DB, 서버 연동하기
 
H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요
 
파이선 실전공략-1
파이선 실전공략-1파이선 실전공략-1
파이선 실전공략-1
 
파이썬과 커뮤니티와 한국어 오픈데이터
파이썬과 커뮤니티와 한국어 오픈데이터파이썬과 커뮤니티와 한국어 오픈데이터
파이썬과 커뮤니티와 한국어 오픈데이터
 
챗봇 스터디
챗봇 스터디챗봇 스터디
챗봇 스터디
 
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
 
파이썬 스터디 9장
파이썬 스터디 9장파이썬 스터디 9장
파이썬 스터디 9장
 
Character Encoding in python
Character Encoding in pythonCharacter Encoding in python
Character Encoding in python
 
슬랙에 귀여운 휴봇 하나 키워보자
슬랙에 귀여운 휴봇 하나 키워보자슬랙에 귀여운 휴봇 하나 키워보자
슬랙에 귀여운 휴봇 하나 키워보자
 
니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트
 
플라스크 템플릿
플라스크 템플릿플라스크 템플릿
플라스크 템플릿
 
IRECIPE BOT
IRECIPE BOTIRECIPE BOT
IRECIPE BOT
 
Python 생태계의 이해
Python 생태계의 이해Python 생태계의 이해
Python 생태계의 이해
 

Semelhante a chatbot-seminar-1806

[2015:1] phpdocumentor 설치와 사용법
[2015:1] phpdocumentor 설치와 사용법[2015:1] phpdocumentor 설치와 사용법
[2015:1] phpdocumentor 설치와 사용법
Amy Kim
 

Semelhante a chatbot-seminar-1806 (20)

웹기술 이해 (프론트엔드 기초)
웹기술 이해 (프론트엔드 기초)웹기술 이해 (프론트엔드 기초)
웹기술 이해 (프론트엔드 기초)
 
문돌이가 가르치는 서버사이드 PHP
문돌이가 가르치는 서버사이드 PHP문돌이가 가르치는 서버사이드 PHP
문돌이가 가르치는 서버사이드 PHP
 
[APM] Homepage bbs
[APM] Homepage bbs[APM] Homepage bbs
[APM] Homepage bbs
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기
 
리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API
리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API
리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API
 
제 2주차. PHP 기초
제 2주차. PHP 기초제 2주차. PHP 기초
제 2주차. PHP 기초
 
DzinnyPing(포트폴리오)-정재훈
DzinnyPing(포트폴리오)-정재훈DzinnyPing(포트폴리오)-정재훈
DzinnyPing(포트폴리오)-정재훈
 
챗봇 시작해보기
챗봇 시작해보기챗봇 시작해보기
챗봇 시작해보기
 
Web server page_ed10
Web server page_ed10Web server page_ed10
Web server page_ed10
 
Python을 활용한 챗봇 서비스 개발 1일차
Python을 활용한 챗봇 서비스 개발 1일차Python을 활용한 챗봇 서비스 개발 1일차
Python을 활용한 챗봇 서비스 개발 1일차
 
[2015:1] phpdocumentor 설치와 사용법
[2015:1] phpdocumentor 설치와 사용법[2015:1] phpdocumentor 설치와 사용법
[2015:1] phpdocumentor 설치와 사용법
 
letswift22_우당탕탕 확장 프로그램(이다혜 light).pdf
letswift22_우당탕탕 확장 프로그램(이다혜 light).pdfletswift22_우당탕탕 확장 프로그램(이다혜 light).pdf
letswift22_우당탕탕 확장 프로그램(이다혜 light).pdf
 
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
 
7. html5 api
7. html5 api7. html5 api
7. html5 api
 
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 TestOkjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
 
막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js
 
2Naver Open Android API Translation At DCamp
2Naver Open Android API Translation At DCamp2Naver Open Android API Translation At DCamp
2Naver Open Android API Translation At DCamp
 
CoreDot TechSeminar 2018 - Session1 Park Jihun
CoreDot TechSeminar 2018 - Session1 Park JihunCoreDot TechSeminar 2018 - Session1 Park Jihun
CoreDot TechSeminar 2018 - Session1 Park Jihun
 
Startup JavaScript 7 - Node.JS 기초
Startup JavaScript 7 - Node.JS 기초Startup JavaScript 7 - Node.JS 기초
Startup JavaScript 7 - Node.JS 기초
 
IT 일반기술 강의자료_ed10
IT 일반기술 강의자료_ed10IT 일반기술 강의자료_ed10
IT 일반기술 강의자료_ed10
 

chatbot-seminar-1806

  • 1. 중고등학생을 위한 하루만에 만드는 챗봇 누구나 배우는 강준영 교하고등학교 2학년
  • 3. 일정 timetable 강사 / 강의 소개 챗봇에 대한 이해 및 기획 챗봇 코딩의 기초 및 개발 다양한 API의 적용 DB 연결 및 실제 적용 14:00 - 14:30 (30분) 14:30 - 15:20 (50분) 15:30 - 17:00 (90분) 17:10 - 18:00 (50분) 18:10 - 19:00 (50분)
  • 5. 목차 index 강사 소개 강의 소개 챗봇이란 무엇인가 챗봇 기획하기 개발 환경 구축하기 PHP 언어의 기초 직접 코딩하기 다이얼로그 구현하기 다양한 API - 급식 다양한 API - 날씨/가상화폐 DB 연결하기 마무리
  • 7. 강사 소개 교하고등학교 2학년 재학 프리랜서 웹/챗봇 개발자 학교 챗봇 GHHS 시리 개발 학교 동아리 세미콜론 부장 페이스북 커뮤니티 0XD 운영자 0X년생 개발자(Developers) 모임, 약 350명
  • 8. GHHS 시리 호출 수 1000회/일, 넉달간 10만회
  • 10. GHHS 시리 - 시연영상 현재 구현된 기능 급식, 날씨(기온, 미세먼지), 버스 도착 정보 자유대화, 개발자 정보, 후원, 도움말 현재 베타 서비스 중인 기능 시간표, 학사일정
  • 12. 강의 소개 누구나 배우는 하루만에 만드는 챗봇 챗봇을 입문하고자 하거나, 챗봇에 관심있는 분들을 위한 강의 직접 코딩을 통한 서비스 단계까지의 제작을 목표로 함 우리가 배울 내용 챗봇의 기초 및 기획 / 챗봇 개발(PHP)
  • 14. 메신저 사용자 2012 2013 2014 2015 SNS 사용자 메신저 서비스 사용자
  • 15. 대화형 인터페이스 상에서 규칙 또는 AI(인공지능)으로 유저와 인터렉션 하는 서비스 " "
  • 18. 우리는 왜 챗봇을 이용하는가? (=우리는 왜 챗봇을 개발해야 하는가?) 간단하다 그래픽 요소 / 채팅은 우리의 일상 편리하다 다수가 공공장소에서 전화보다 텍스트를 선호 빠르다 별도의 앱을 다운로드 할 필요가 없다 맞춤 컨텐츠를 제공한다 개인에 맞춘 컨텐츠 경험 가능 즉각 반응한다 메세지를 즉각적으로 전달, 시간을 절약
  • 19. 저는 프로그래밍을 해본적이 없어요 고작 아는게 C언어 정도인데 가능한건가요? " " " "
  • 21. 챗봇 기획하기 1단계 어떤 챗봇을 만들것인가?
  • 22. 급식 봇 날씨 봇 버스 도착 정보 봇 미세먼지 봇 배틀그라운드 전적 봇
  • 23. 급식 봇 날씨 봇 (응용) 가상화폐 시세 조회 봇 +
  • 24. 챗봇 기획하기 2단계 어떤 서비스를 제공할 것인가
  • 25. 급식 NEIS 교육청 학교 급식 파싱 API를 이용하여 급식 정보 호출 급식 정보를 적절하게 가공하여, 오늘 급식과 내일 급식 출력 날씨 OpenWeatherAPI를 사용하여 날씨 정보 호출 / 출력
  • 26. 챗봇 기획하기 3단계 한번 대화를 구성해보자
  • 27. 대화 시작하기 - 급식 [급식 정보]를 누르면 [오늘 급식], [내일 급식], [처음으로] 버튼을 보여줌 [오늘 급식]을 누르면 오늘 급식 정보를, [내일 급식]을 누르면 내일 급식 정보 출력 후 메인 화면으로 복귀 대화 시작하기 - 날씨 [날씨 정보]를 누르면 최신의 날씨(기온)을 출력한 후 메인화면으로 복귀 자유 대화하기 직접 타이핑을 통해 메뉴를 선택할 수 있게 [자유 대화]를 메인에 추가
  • 28. 개발 환경 구축하기 - 1단계 VS CODE 설치 이미 Atom, Sublime Text, VS Code 등의 텍스트 에디터가 설치되신 분들은 잠시 쉬셔도 좋습니다 :)
  • 29. Visual Studio Code 설치 https://code.visualstudio.com
  • 30. Visual Studio Code 실행 Open Folder > 디렉토리 선택 New File > keyboard.php / message.php
  • 31. 개발 환경 구축하기 - 2단계 FileZilla 설치 FTP* Client *FTP란, File Transfer Protocol의 약자로 서버와 파일을 주고받을때 사용하는 프로토콜입니다.
  • 33. 개발 환경 구축하기 - 3단계 닷홈 호스팅 세팅
  • 36. Dothome 무료 호스팅 신청 웹호스팅 탭 > 무료 호스팅 아래에서 무료호스팅 Like+ 신청 좀 더 자세히 할것 과정 2-3r개 추가
  • 37. Dothome 무료 호스팅 신청 FAQ FTP 아이디와 비밀번호는 무엇인가요? 아까전에 설치한 FileZilla와 같은 FTP 클라이언트가 서버와 파일을 주고받을때 필요한 아이디와 비밀번호입니다. DB 비밀번호는 무엇인가요? Database에 접속하기 위한 비밀번호입니다.
  • 38. 닷홈 고객센터 > 기술지원접수 새글 쓰기로 아래와 같이 적은 후 제출해주세요 'php allow_url_fopen 설정을 On으로 변경 부탁드립니다.' 앞으로의 과정에 있어 제출하지 않을 경우 수많은 오류에 부딪힙니다ㅠㅠ
  • 39. 개발 환경 구축하기 - 4단계 플러스친구 생성
  • 42. 자, 이제 모든 준비는 끝났습니다. 두눈 크게 뜨고 따라오세요!
  • 43. 개발하기 PHP 언어의 기초 VS Code에서 아까 열어놓은 폴더에 index.php를 만들어봅니다.
  • 44. 먼저 아래와 같이 입력합니다. <?php $contents = "this is sample text"; echo $contents; ?> 해설 php는 <?php로 시작해서 ?>로 끝납니다. contents라는 변수에 "this is sample text"라는 문자열을 넣었습니다. echo를 이용하여 contents 변수의 내용을 출력합니다. 출력 this is sample text
  • 45. 이제 기초도 끝났습니다(?) 사실, 중요한 것들은 챗봇을 개발하면서 알아갈 예정입니다.
  • 46. 챗봇 API??? 카카오톡 플러스친구 API https://github.com/plusfriend/auto_reply
  • 47. HTTP Request에 대한 이해 HTTP 프로토콜을 사용하는 서버에 대해 GET, POST 등의 메소드를 요청하면 서버가 응답코드*와 함께 응답한다. *응답코드란, 200/403/404/503 등과 같은 응답을 말하는데 흔히 제대로 응답을 주고받은 경우 200을, 해당 디렉토리나 파일에 접근할 권한이 없는 경우 403(Forbidden) 을, 해당 컨텐츠가 존재하지 않는 경우 404(Not Found)를, 서버 내부의 응답 오류일 경우 503(Internal server error)을 응답하고 이외에도 여러가지 응답코드가 있다.
  • 49. keyboard.php Method : GET URL : http(s)://:your_server_url/keyboard Content-Type : application/json; charset=utf-8 Request Response { "type" : "buttons", "buttons" : ["선택 1", "선택 2", "선택 3"] } curl -XGET 'https://:your_server_url/keyboard'
  • 50. message.php Method : POST URL : http(s)://:your_server_url/message Content-Type : application/json; charset=utf-8 Request Response { "message": { "text": "귀하의 차량이 성공적으로 등록되었습니다. 축하합니다!", }, "keyboard": { "type": "buttons", "buttons": [ "처음으로", "다시 등록하기", "취소하기" ] } } curl -XPOST 'https://:your_server_url/message' -d '{ "user_key": "encryptedUserKey", "type": "text", "content": "차량번호등록" }'
  • 51. 쉬는 시간 쉬는 시간입니다 :) 뒤쪽에 다과가 마련되어 있습니다 :D
  • 53. keyboard.php는 키보드를 정의한다! 유저가 맨 처음에 채팅방에 들어갔을 때 호출되는 파일 키보드를 정의하는 역할 오른쪽과 같이 버튼이 나오는 경우 직접 키보드를 통해 텍스트를 입력하는 경우
  • 54. keyboard.php Source Code <?php // php 파일 시작 echo <<< EOD // echo를 통해 json 출력, EOD 시작 { // json 시작 "type" : "buttons", // 키보드의 타입은 버튼 "buttons" : [ // 버튼 내용을 정의 (배열) "급식", // 급식 버튼 "날씨", // 날씨 버튼 "코인", // 코인 버튼 "자유대화" // 자유대화 버튼 ] // 배열 끝 } // json 끝 EOD; // EOD 끝 ?> // php 파일 끝 주의해야 할 점! 'echo <<< EOD'와 EOD;앞에 공백 X type은 required, buttons는 optional.
  • 55. 개발하기 이제 가장 중요한 부분!!! message.php
  • 56. keyboard.php는 대화내용을 정의한다! 유저가 맨 처음에 채팅방에 들어간 이후 진행되는 대화 내용을 정의하는 역할. 각각의 대화 내용 케이스 별로 챗봇의 응답 내용을 정의한다.
  • 57. message.php Source Code [Part 1] <?php $data = json_decode(file_get_contents('php://input'), true); $content = $data["content"]; ... PHP input을 받은 내용을 json_decode()를 이용하여 $data 변수에 저장한다. json_decode()는 json 형태의 데이터를 배열 형태로 바꿔주는 함수이다. $data의 content 배열을 가져와 $content 변수에 저장한다.
  • 58. 결론적으로 모든 사용자의 메세지는 $content 변수로 들어간다! " "
  • 59. 그렇다면 if($content=='input')과 같은 조건문을 통해 사용자의 메세지를 확인할 수 있지 않을까??? " "
  • 60. 그런 다음에, 아까전의 keyboard.php 파일처럼 챗봇의 응답 텍스트를 echo를 통해 보낼 수 있지 않을까??? " "
  • 61. message.php Source Code [Part 2] if($content == "급식"){ echo <<< EOD { "message": { "text": "급식을 선택하세요." }, "keyboard": { "type": "buttons", "buttons": [ "오늘 급식", "내일 급식", "처음으로" ] } } EOD; } 만약 input 값이 "급식"과 일치한다면, text 타입의 message를 전송 이와 함께 buttons 타입의 키보드를 보여준다. buttons에는 여러개의 내용을 배열로 담는다.
  • 62. message.php Source Code [Part 3] elseif($content == "날씨"){ echo <<< EOD { "message": { "text": "날씨는 {weather}도 입니다." }, "keyboard": { "type": "buttons", "buttons": [ "급식", "날씨", "코인" "자유대화" ] } } EOD; } 만약 input 값이 "날씨"과 일치한다면, text 타입의 message를 전송 이와 함께 buttons 타입의 키보드를 보여준다. buttons에는 여러개의 내용을 배열로 담는다.
  • 63. message.php Source Code [Part 4] elseif($content == "처음으로"){ echo <<< EOD { "message": { "text": "메인입니다." }, "keyboard": { "type": "buttons", "buttons": [ "급식", "날씨", "코인", "자유대화" ] } } EOD; } 만약 input 값이 "처음으로"와 일치한다면, text 타입의 message를 전송 이와 함께 buttons 타입의 키보드를 보여준다. buttons에는 여러개의 내용을 배열로 담는다.
  • 64. message.php Source Code [Part 5] elseif(strpos($content, "오늘") !== false && strpos($content, "급식") !== false){ echo <<< EOD { "message": { "text": "오늘 급식은 {meal}입니다." }, "keyboard": { "type": "buttons", "buttons": [ "급식", "날씨", "코인", "자유대화" ] } } EOD; } 만약 input 값이 "오늘"과 "급식"을 포함한다면, text 타입의 message를 전송 이와 함께 buttons 타입의 키보드를 보여준다. buttons에는 여러개의 내용을 배열로 담는다.
  • 65. message.php Source Code [Part 6] elseif(strpos($content, "내일") !== false && strpos($content, "급식") !== false){ echo <<< EOD { "message": { "text": "내일 급식은 {meal}입니다." }, "keyboard": { "type": "buttons", "buttons": [ "급식", "날씨", "코인", "자유대화" ] } } EOD; } 만약 input 값이 "내일"과 "급식"을 포함한다면, text 타입의 message를 전송 이와 함께 buttons 타입의 키보드를 보여준다. buttons에는 여러개의 내용을 배열로 담는다.
  • 66. message.php Source Code [Part 7] if($content == "자유대화"){ echo <<< EOD { "message": { "text": "안녕?n탈출은 처음으로 입력" } } EOD; } 만약 input 값이 "자유대화"를 포함한다면, text 타입의 message를 전송 사용자 직접 입력 가능한 키보드를 보여준다.
  • 67. message.php Source Code [Part 8] else{ echo <<< EOD { "message": { "text": "개발중이거나 잘못됩 입력이에요ㅠ" }, "keyboard": { "type": "buttons", "buttons": [ "급식", "날씨", "코인", "자유대화" ] } } EOD; } 만약 input 값이 어떠한 것과도 일치하지 않으면, text 타입의 message를 전송 이와 함께 buttons 타입의 키보드를 보여준다. buttons에는 여러개의 내용을 배열로 담는다.
  • 68. 개발하기 이제 올려봅시다아ㅏㅏ 서버에 올려서 실제로 테스트 해보는 단계!!!
  • 69. FileZilla를 실행하고 정보를 입력합니다. Host : XXXXX.dothome.co.kr (본인의 닷홈 서브도메인 입력) Username : XXXXX (본인의 FTP Username - 닷홈 설정 입력) Password : XXXXX (본인의 FTP Password - 닷홈 설정 입력) Port : FTP 기본 포트는 21
  • 70. FileZilla를 통해 업로드합니다. 왼쪽은 로컬PC의 디렉토리, 오른쪽은 서버 디렉토리 모든 내용은 html 폴더 내에 넣어야 합니다. / html 폴더 내의 파일을 모두 지워주세요.
  • 71. 드래그 앤 드랍으로 올려주세요! 이제 API 테스트를 해야 합니다.
  • 72. 개발하기 챗봇 테스트 다시 관리자 센터로 접속해서 아까 만든 플러스 친구로 들어가주세요
  • 73. 카카오톡 관리자 센터에서 좌측 메뉴의 스마트 채팅!
  • 75. 정보 입력 후 앱 URL 입력 / keyboard.php가 제대로 작동하는지 확인! 앱 URL : XXXXX.dothome.co.kr/ 으로 입력합니다.
  • 76. 하지만, 우리가 원하는 결과 대신에 이런 화면이...
  • 77.
  • 78. 지금부터 원인이 무엇인지 알아봅시다 흔히 실수하고 막히는 부분이라 자세히 설명할게요!
  • 80. .htaccess에 대한 이해 .htaccess (hypertext access)는 Apache 웹 서버의 디렉토리 레벨을 설정하는 기본 파일 우리가 사용하는 닷홈의 웹 서버는 Apache 기반이다. 웹 서버의 루트 디렉토리 이하의 디렉토리에서 이 “.htaccess”파일을 생성하여 웹 루트 디렉토리 하위의 디렉토리별로 서로 다른 환경설정을 구축하고자 할때 디렉토리 내부에서 참조해야하는 설정을 구성 각 설정이 다른 .htaccess 파일을 생성하여 디렉토리에 추가 일종의 숨김파일(파일 명 앞에 . 이 붙음)이므로 PC 설정에서 숨김파일 표시가 필요
  • 81. .htaccess 작성하기 Options +Multiviews RewriteEngine On Options -Indexes RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^.]+)$ $1.php [NC,L] AddType application/x-httpd-php .php AddDefaultCharSet UTF-8
  • 82. 아까와 같은 디렉토리에 업로드합니다! FileZilla로 업로드 해주세요
  • 83. 다시 관리자 센터에서 keyboard.php가 제대로 작동하는지 확인! 앱 URL : XXXXX.dothome.co.kr/ 으로 동일하게 입력합니다.
  • 84.
  • 85. 이제 준비가 끝났습니다 좌측 메뉴 관리-상세설정에서 하단의 공개 설정을 모두 켜주세요
  • 86.
  • 88. 카카오톡에 접속해서 아까 설정한 검색용 아이디로 검색합니다.
  • 89. 메세지 보내기를 눌러 채팅을 시작해봅니다.
  • 90. 드디어 기본적인 기능들이 작동합니다 우와아ㅏㅏㅏ (근데 급식하고 날씨는??;;;)
  • 91. 모든 소스코드는 깃허브로 공유합니다 :) https://github.com/Juneyoung-Kang/chatbot-seminar 깃허브 계정이 있으신 분들은 스타도 살짝 눌러주시면 감사하겠습니다ㅠ
  • 92. 쉬는 시간 쉬는 시간입니다 :) 뒤쪽에 다과가 마련되어 있습니다 :D
  • 94. 여기서 잠깐! 아까 message.php에서 $content == ""와 strpos($content, "") !== false는 무엇이 다른가?
  • 95. $content를 판별하는 두가지 방법 if($content == "blahblah"){ ... } 사용자 입력이 blahblah와 정확하게 일치할때 if문 안의 내용을 실행한다. if(strpos($content, "blahblah") !== false){ ... } 사용자 입력에 blahblah가 포함되어 있는 경우 if문 안의 내용을 실행한다. strpos()함수 $content에서 "blahblah"가 처음 나타나는 위치를 반환. 위치를 찾지 못한 경우 FALSE를 반환
  • 97. 예시 elseif(strpos($content, "AA") !== false && strpos($content, "BB") !== false){ echo <<< EOD { "message": { "text": "CCCCC" }, "keyboard": { "type": "buttons", "buttons": [ "ABC", "ABCD", "ABCDE" ] } } EOD; } 주의해야 할 점 <echo <<< EOD>와 <EOD;>는 반드시 앞에 공백이 없어야 합니다.
  • 98. 개발하기 API 적용하기 급식과 날씨 API 그리고, 공공데이터 사용하기
  • 100. API에 대한 이해 API(Application Programming Interface, 응용 프로그램 프로그래밍 인터페이스)는 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻한다. 단순히 말해, 프로그램을 위한 인터페이스!
  • 101. API는 어떻게 작동하나요??? 만약, 내가 날씨 앱을 만들고자 할 때, 내 앱에서 해당 API를 제공하는 어떠한 곳으로 날짜, 지역 정보를 요청를 보내면, 해당 API에서는 내 앱으로 날씨 정보를 응답한다. '요청'과 '응답'... 어디서 많이 들어본 듯...?
  • 102. 대표적인 예시로, 내가 API에 (HTTP) Request(ex. GET)를 보내면 해당 API 정보를 알 수 있다!!!
  • 103. 예를 들어 어떤 API가 있나요?
  • 105. 원하는 내용을 검색하고 오픈 API를 선택
  • 106. API의 예시 날씨 API 급식/학식 API 게임 전적 API 버스 도착정보 API 미세먼지 API 프로야구 API and more...
  • 107. API의 종류 중 RESTful API에 대해 알아보자
  • 108. RESTful API에 대한 이해 RESTful API는 크게 리소스, 메소드, 메세지로 이루어져 있다 예시) 이름이 alpha인 사용자를 생성한다라는 호출이 있을때, 리소스 : "사용자" > http://my_web/users 라는 URI 메소드 : "생성한다" > HTTP POST/GET Request 메세지 : 이름이 alpha인 사용자 HTTP POST, http://my_web/users/ { "users" : { "name" : "terry" } }
  • 109. RESTful Architecture 6 균일한 인터페이스 Uniform Interface 상태없음 Stateless 캐시 Cache 클라이언트/서버 Client/Server 계층 시스템 Layered System (조건부) Code on demand
  • 110. RESTful API Method REST에서는 HTTP 메소드를 그대로 사용한다 (CRUD) POST 등록 (Create) GET 조회 (Read/Select) PUT 수정 (Update) DELETE 삭제 (Delete)
  • 111. API가 응답하는 결과물은 어떤 형태일까?
  • 112. RESTful API의 응답 (보통 JSON) HTTP POST, http://my_web/users/ { "users" : { "name" : "terry" } }
  • 113. 우리가 사용할 API에 대하여 알아보자
  • 114. 급식 API 깃허브에 오픈소스로 올라와 있는 school_meal API를 사용합니다. https://github.com/Juneyoung-Kang/school-meal/ 날씨 API OpenWeatherMap API를 사용합니다. 가상화폐 API 빗썸의 API를 이용하여 실시간 시세를 얻습니다.
  • 117. school_meal API 사용방법 (개요) 전국 초중고등학교의 조식, 중식, 석식 급식 정보를 NEIS로부터 파싱하여 JSON 형태로 출력하는 PHP로 작성된 API
  • 119. school_meal API 사용방법 (Request) • 기본 URL : http://juneyoung.kr/api/school-meal/meal_api.php • 예시 URL : http://juneyoung.kr/api/school-meal/meal_api.php? countryCode=stu.goe.go.kr&schulCode=J100004922&insttNm=교하고등학교 &schulCrseScCode=4&schMmealScCode=2
  • 120. school_meal API 사용방법 (파일별 세부 명세)
  • 121. school_meal API 사용방법 (파일별 세부 명세)
  • 122. school_meal API 사용방법 (파일별 세부 명세)
  • 123. school_meal API 사용방법 (파일별 세부 명세)
  • 124. school_meal API 사용방법 (파일별 세부 명세)
  • 125. 이 모든 파일들과 함께 simple_dom_html.php 파일이 같이 올라가야 합니다.
  • 126. 이제 급식 API를 사용해봅시다 1. 서버에 올라간 파일 사용하기
  • 127. 개인 서버(닷홈)에 API 올리는 방법 1. 서버에 파일 올리기 OpenWeatherMap API를 사용합니다. 2. 닷홈에 php.ini allow_url_fopen On 옵션 설정 문의하기 닷홈 기술지원에 해당 옵션을 켜줄 것을 부탁합니다. (보통 한시간 내에 처리)
  • 128. 이제 웹 브라우저를 열고 다음 주소로 접속합니다 http://juneyoung.kr/meal/meal_api.php? countryCode=stu.xxx.go.kr&schulCode=X000000000&insttNm=XXXX학교 &schulCrseScCode=X&schMmealScCode=X 빨간 글씨를 어떻게 작성해야 할지 모르신다면? github.com/Juneyoung-Kang/school-meal 이미 올라간 API 사용 (권장)
  • 129.
  • 130. 이제 급식 API를 사용해봅시다 2. JSON 내용을 읽어오는 방법 A-Z
  • 131. 간단한 PHP 파일 작성 <?php $url = "http://juneyoung.kr/api/school-meal/meal_api.php? countryCode=stu.goe.go.kr&schulCode=J100004922&insttNm=교하고등학교 &schulCrseScCode=4&schMmealScCode=2"; $content = file_get_contents($url); $array = json_decode($content, true); echo $array['메뉴']; ?>
  • 132. 하나씩 살펴보기 - 1 <?php $url = "http://juneyoung.kr/api/school-meal/meal_api.php? countryCode=stu.goe.go.kr&schulCode=J100004922&insttNm=교하고등학교 &schulCrseScCode=4&schMmealScCode=2"; ... URL 주소를 변수에 저장
  • 133. 하나씩 살펴보기 - 2 ... $content = file_get_contents($url); ... URL의 내용을 받아서(file_get_contents 함수 이용) content 변수에 저장
  • 134. 하나씩 살펴보기 - 3 ... $array = json_decode($content, true); ... 받은 내용(json 타입의 $content)을 디코드하여 array 변수에 저장(이때 배열로 저장된다)
  • 135. 하나씩 살펴보기 - 4 ... echo $array['메뉴']; ... 배열 중에 '메뉴' 항목을 출력
  • 136. 이제 급식 API를 사용해봅시다 3. 챗봇에서 출력하기
  • 137. 아까 작성한 message.php에서 오늘 급식 부분 elseif(strpos($content, "오늘") !== false && strpos($content, "급식") !== false){ $url='http://juneyoung.kr/api/school-meal/meal_api.php? countryCode=stu.goe.go.kr&schulCode=J100004922&insttNm=교하고등학교 &schulCrseScCode=4&schMmealScCode=2'; $content=file_get_contents($url); $array=json_decode($json, true); $meal=$array['메뉴']; echo <<< EOD { "message": { "text": "$meal" }, .....(생략)..... } EOD; }
  • 138. 이제 챗봇에서 확인하면 정상적으로 작동합니다!!!
  • 139. meal_api.php 말고 다른 파일을 이용한다면 내일 급식이나, 이번주 급식도 출력할 수 있겠죠?
  • 140. meal_api_custom.php를 이용하면 특정 날짜의 급식 데이터를 가져올 수 있고, 날짜 함수를 이용해 여러날의 급식을 파싱할 수 있습니다.
  • 144. 가입 후 보이는 화면에서 API keys를 확인해주세요
  • 145. 이제 API key를 확인했으니, 어떻게 사용하는지 알아봅시다
  • 147. 설치하기 (require composer) 만약 composer가 설치되어 있지 않다면? https://getcomposer.org/doc/00-intro.md 현재 프로젝트 폴더에서 터미널을 켜고 입력해주세요
  • 148. 이제 message.php로 돌아와서 다음 코드를 작성합니다
  • 149. 아까 작성한 message.php에서 맨 위 <?php use CmfcmfOpenWeatherMap; ...
  • 150. 아까 작성한 message.php에서 날씨 부분 else if(strpos($content, "날씨") !== false){ require 'vendor/autoload.php'; $lang = 'ko'; $units = 'metric'; $owm = new OpenWeatherMap('API KEY'); $weather = $owm->getWeather('Seoul', $units, $lang); $weather_final=$weather->temperature; $weather_final=str_replace("&deg;C", "°C", $weather_final); echo <<< EOD { "message": { "text": "현재 기온은 $weather_final 입니다." }, .....(생략)..... } EOD; }
  • 151. 이제 챗봇에서 확인하면 정상적으로 작동하는 것을 확인할 수 있습니다
  • 152. 쉬는 시간 쉬는 시간입니다 :) 뒤쪽에 다과가 마련되어 있습니다 :D
  • 153. 이러한 API도 있지만 좀 더 실용적인 API는 없을까?
  • 154. 개발하기 가상화폐 시세 API 적용하기 가상화폐 시세 API의 모든 것
  • 155. 빗썸에서는 아주 감사하게도(?) 현재 시세에 관한 정보를 너무나 가공하기 편한 형태로 제공하고 있습니다 :)
  • 156.
  • 157. 사실 이건 거짓말이 아니라 진짜 가공하기 쉬운 타입이에요
  • 159. 데이터가 JSON이므로 아까전의 급식 API와 동일합니다!!!
  • 160. 빗썸 API 명세 - REQUEST Endpoint (URI) https://api.bithumb.com/public/ticker/{currency} {currency} = BTC, ETH, DASH, LTC, ETC, XRP, BCH, XMR, ZEC, QTUM, BTG, EOS, ICX, VEN, TRX, ELF, MITH, MCO, OMG, KNC, GNT, HSR, ZIL, ETHOS, PAY, WAX, POWR, LRC, GTO, STEEM, STRAT, ZRX, REP, AE, XEM, SNT, ADA (기본값: BTC), ALL(전체)
  • 161. 빗썸 API 명세 - RESPONSE Example { "status": "0000", "data": { "opening_price" : "504000", "closing_price" : "505000", "min_price" : "504000", "max_price" : "516000", "average_price" : "509533.3333", "units_traded" : "14.71960286", "volume_1day" : "14.71960286", "volume_7day" : "15.81960286", "buy_price" : "505000", "sell_price" : "504000", "24H_fluctate" : "1000", "24H_fluctate_rate" : "0.19", "date" : 1417141032622 } }
  • 162. 빗썸 API 명세 - RESPONSE Returned value description { "status": "0000", // 상태코드 "data": { // 24시간 데이터 "opening_price" : "504000", // 거래시작금액 "closing_price" : "505000", // 마지막 거래금액 "min_price" : "504000", // 최저 거래가 "max_price" : "516000", // 최고 거래가 "average_price" : "509533.3333", // 평균 거래가 "units_traded" : "14.71960286", // 거래량 "volume_1day" : "14.71960286", // 거래량 "volume_7day" : "15.81960286", // 7일간 거래량 "buy_price" : "505000", // 구매가 "sell_price" : "504000", // 판매가 "24H_fluctate" : "1000", // 변동 금액 "24H_fluctate_rate" : "0.19", // 변동률 "date" : 1417141032622 // 타임스탬프 } }
  • 164. 간단한 PHP 코드 작성 <?php $url="https://api.bithumb.com/public/ticker/BTC"; $json=file_get_contents($url); $array=json_decode($json, true); $opening_price=$array['data']['opening_price']; echo $opening_price; ?>
  • 165. Output 7005000 (값은 다를 수 있습니다) (php가 설치되어 있으신 분은 터미널에서 $php file.php를 입력해주세요)
  • 166. 이제 이 코드를 붙이기 위한 message.php의 수정이 필요합니다
  • 167. message.php Source Code [내일 급식 이후 부분] elseif($content=="코인"){ echo <<< EOD { "message": { "text": "코인을 선택해주세요." }, "keyboard": { "type": "buttons", "buttons": [ "비트코인", "이더리움", "리플", "처음으로" ] } } EOD; }
  • 168. message.php Source Code [내일 급식 이후 부분] elseif($content=="비트코인"){ $url="https://api.bithumb.com/public/ticker/BTC"; $json=file_get_contents($url); $array=json_decode($json, true); $buy_price=$array['data']['buy_price']; $fluctate=$array['data']['24H_fluctate']; $fluctate_rate=$array['data']['24H_fluctate_rate']; echo <<< EOD { "message": { "text": "비트코인n시세:$buy_pricen변동가:$fluctate($fluctate_rate)" }, "keyboard": { "type": "buttons", "buttons": [ "급식", "날씨", "코인", "자유대화" ] } } EOD; }
  • 169. message.php Source Code [내일 급식 이후 부분] elseif($content=="이더리움"){ $url="https://api.bithumb.com/public/ticker/ETH"; $json=file_get_contents($url); $array=json_decode($json, true); $buy_price=$array['data']['buy_price']; $fluctate=$array['data']['24H_fluctate']; $fluctate_rate=$array['data']['24H_fluctate_rate']; echo <<< EOD { "message": { "text": "이더리움n시세:$buy_pricen변동가:$fluctate($fluctate_rate)" }, "keyboard": { "type": "buttons", "buttons": [ "급식", "날씨", "코인", "자유대화" ] } } EOD; }
  • 170. message.php Source Code [내일 급식 이후 부분] elseif($content=="리플"){ $url="https://api.bithumb.com/public/ticker/XRP"; $json=file_get_contents($url); $array=json_decode($json, true); $buy_price=$array['data']['buy_price']; $fluctate=$array['data']['24H_fluctate']; $fluctate_rate=$array['data']['24H_fluctate_rate']; echo <<< EOD { "message": { "text": "리플n시세:$buy_pricen변동가:$fluctate($fluctate_rate)" }, "keyboard": { "type": "buttons", "buttons": [ "급식", "날씨", "코인", "자유대화" ] } } EOD; }
  • 172. 이것으로 API를 마치고, DB로 넘어가려고 합니다
  • 173. 개발하기 DB 연결하고 사용자 데이터 처리하기 DB 연결을 해봅시다!!! 좀만 더 힘을 내요!!!
  • 174. 왜 DB를 써야 하는가?
  • 175. 사용자 데이터 저장 통계 메세지 분석 약간의 회원관리 형식(?)
  • 176. DB의 기초는 DB Connection! XXXXX.dothome.co.kr/myadmin 접속하고 MYSQL ID/PW 입력해주세요
  • 178. DB의 기초는 DB Connection! 프로젝트 폴더에 include 폴더를 만들고 그 안에 dbconfig.php를 만들어주세요
  • 179. /include/dbconfig.php <?php $db_server = "localhost"; $db_id = "(MYSQL ID)"; $db_password = "(MYSQL PW)"; $db_name = "(DB NAME)"; $mysqli = new mysqli($db_server, $db_id, $db_password, $db_name); $mysqli->set_charset("utf8"); $conn = mysqli_connect($db_server, $db_id, $db_password, $db_name); mysqli_query($conn, "SET CHARSET UTF8"); if($conn -> connect_error){ die ("DB Connect failed".$conn->connect_error); } ?>
  • 180. 다시 message.php로 돌아와서 다음과 같은 코드를 맨위에 추가합니다
  • 181. message.php 맨 위 <?php include('include/dbconfig.php'); ... message.php에서 $content=$data["content"]; 다음 ... $user_key=$data["user_key"]; ...
  • 182. 다시 PHPMYADMIN으로 돌아와서, log와 user 테이블을 만들어주세요
  • 183. 데이터베이스 선택 후 SQL 탭에서 다음 내용 입력 CREATE TABLE `user` ( `idx` int(100) NOT NULL, `user_key` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `log` ( `idx` int(100) NOT NULL, `user_key` varchar(255) DEFAULT NULL, `content` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE `user` ADD UNIQUE KEY `idx_2` (`idx`), ADD KEY `idx` (`idx`); ALTER TABLE `log` ADD UNIQUE KEY `idx_2` (`idx`), ADD KEY `idx` (`idx`); ALTER TABLE `user` MODIFY `idx` int(100) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1; ALTER TABLE `log` MODIFY `idx` int(100) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;
  • 184. 다시 message.php로 돌아와 주세요 아 어지러워요ㅠㅠㅠ
  • 185. 간단하게 마이페이지를 자유대화에서 입력해서 이전에 사용한 적이 없으면 환영메세지가 뜨게, 있으면 다시와서 반갑다는 메세지가 뜨도록 구현하도록 하겠습니다.
  • 186. 간단하게 생각하면 if 조건문과 sql의 select/insert 문을 사용하면 되겠죠??? 이게 무슨 말이냐고요???
  • 187. message.php에서 $user_key=$data["user_key"]; 다음 ... $sql = "insert into log(user_key, content) values('$user_key','$content')"; $mysqli->query($sql);] ...
  • 188. 자유대화 다음 elseif(strpos($content, "마이페이지") !== false){ $query = "select * from user where user_key='$user_key'"; $row = mysqli_fetch_assoc($mysqli->query($query)); if(!$row){ $sql = "insert into user(user_key) values('$user_key')"; $mysqli->query($sql); echo <<< EOD { "message": { "text": "처음 오신 것을 환영합니다!" }, "keyboard": { "type": "buttons", "buttons": [ "급식", "날씨", "코인", "자유대화" ] } } EOD; }else { echo <<< EOD { "message": { "text": "다시와줘서 고마워요!" }, "keyboard": { "type": "buttons", "buttons": [ "급식", "날씨", "코인", "자유대화" ] } } EOD; } }
  • 189. 다시 카카오톡에서 자유대화를 누른후 마이메이지를 입력해보면, 처음에는 '처음오신 것을 환영합니다'가 나오지만, 이후에 시도해보면 계속 '다시 와줘서 고마워요'가 출력됨을 알 수 있습니다
  • 190. 이상 DB와 관련된 내용을 마치겠습니다 와아아아ㅏㅏ
  • 192. 놓치지 않고 잘 따라오셨는지요?
  • 193. 개발이 처음이라는 분들도 여럿 계셨습니다
  • 194. 최대한 쉽게 설명해드리려고 했는데 제대로 전달 되었는지 모르겠습니다ㅠㅠ
  • 195. 이제 남은 것은 기능의 추가(인공지능? 또는 기타 API) 뿐입니다.
  • 196. 혹시라도 궁금하신 점이 있으시면 말씀해주세요!
  • 197. 혹시라도 나중에 챗봇 개발하시다가 궁금하시면 아래 연락처로 연락해주시면 정성껏 답해드리겠습니다 :D facebook. /juneyoungdev email. juneyoungdev@gmail.com
  • 198. 추가적으로 구름(edu.goorm.io)과 인프런(inflearn.com)에 제 강의가 올라갈 예정에 있습니다. 여기서는 좀 더 다양한 언어와 플랫폼을 다뤄보도록 하겠습니다.