구글 어시스턴트로 급식앱을 만들때 겪은 문제들

in #assistant6 years ago
  1. 구글 어시스턴트 앱은 https://console.actions.google.com/ 구글 온 액션에서 만든다

  2. 구글 온 액션에서 DialogFlow와 연동하면 편하다

  3. DialogFlow에서 Response 기능은 자체기능을 쓰면 안되고, Fulfillment로 따로 구현해야한다

  4. Fulfillment에서 Firebase Function을 쓰면 안된다. Firebase Function은 외부로 Requst를 보낼 수 없다. 즉 Firebase Function로 파싱을 해올 수 없다는거다.

  5. 외부 서버를 사용하려면 HTTPS로 연결되어야한다. HTTPS는 Heroku가 지원하니, Heroku에 서버를 만들면 될...것같지만 Heroku는 오랫동안 사용을 하지 않으면 슬립에 빠진다. 이 슬립을 깨우는데는 시간이 소요되는데, 약 30초정도 소요된다. 가끔 Assistant가 서버 응답이 없는줄알고 연결을 끊어버리는 사태가 발생함으로, Heroku를 사용할거면 유료 요금제를 사용하도록 하자.

  6. 필자는 Naver Cloud Platform에 무료서버를 이용한다. NCP 무료서버도 꽤 쓸만한 속도가 나온다. 개발용 및 연습용으로는 더할나위 없이 좋다. 하지만 문제가 있다면, GUI를 설치시에 꽤 많이 느리다.

  7. 유료 서버는 첫번째로 바른클라우드를 추천한다. 바른클라우드의 개발자용 요금제는 최저 4000원부터 시작한다. 사양은 램1GB, 저장공간 50GB, 도메인 barun.cloud를 제공한다. OS는 윈도우를 지원한다. 할인행사를 자주하니 할인을 노려보자.
    두번째로는 스퀘어넷을 추천한다. 스퀘어넷은 바른클라우드보다는 살짝 비싸지만 그만큼 안정감이 있다.

  8. Node.js로 서버를 만드는경우 NPM의 k-lunch 라이브러리를 사용하는것을 추천한다. k-lunch 라이브러리는 학교 이름과 초등학교, 중학교, 고등학교인지와 날짜만 입력해주면 영양정보와 식단이 JSON으로 좍 나온다. 파싱은 각 학교가 소속되어있는 교육청에서 받아오는듯하다. 내가 해보겠다고 별 생쇼를 부리지 말고, 그냥 라이브러리 쓰자. NPM 사랑해요

  9. 이렇게 만들어놓으면 아직은 일반인에게 공개되진 않았지만 '카카오i 오픈빌더'도 함께 연동시킬 수 있을것같다. 유출된 카카오i 도움말을 보면 다이얼로그플로우와 매우 비슷하다.

  10. 불렀을때 급식만 알려주고 나가지는 봇을 만드려면 Default Welcome Intent에서 Fulfillment를 설정하고 Set This Intent as end of conversation을 설정하면 된다.

  11. 아래는 fulfillment 외부서버의 기본 템플릿이다

const express = require('express')
const app = express()

app.post('/', (req, res) => {
  res.json({
    fulfillmentText: '답장'
  })
})

이것은 '답장'이라는 말만 하는 서버이다. 아무것도 못한다.

DialogFlow측에서 보낸 POST 데이터를 읽으려면 body-parser가 필요하다
npm i --save body-parser
Body-parser를 Express측에서 사용 가능하게 하려면 '나 body-parser 사용할거야'라고 Express한테 말해야한다.

const express = require('express')
const app = express()
app.use(bodyParser.json())

app.post('/', (req, res) => {
  res.json({
    fulfillmentText: '답장'
  })
})

POST 데이터는 req.body에 담겨있다.
데이터는 각각 다음의 위치에 있다
Intent 정보: req.body.queryResult.intent.displayName
Entity 정보: req.body.queryResult.parameters

안타깝게도, 모든 인텐트가 하나의 Fulfillment를 사용한다. 고로 인텐트 분기는 req.body.queryResult.intent.displayName로 해야한다.

Sort:  

Congratulations @jernon! You have completed some achievement on Steemit and have been rewarded with new badge(s) :

Award for the number of posts published

Click on any badge to view your own Board of Honor on SteemitBoard.
For more information about SteemitBoard, click here

If you no longer want to receive notifications, reply to this comment with the word STOP

Upvote this notification to help all Steemit users. Learn why here!

Coin Marketplace

STEEM 0.17
TRX 0.15
JST 0.028
BTC 60699.16
ETH 2352.47
USDT 1.00
SBD 2.52