-
Golang: 카카오 챗봇 API 응답 JSON 빌더 헬퍼 모듈컴퓨터/Go language 2021. 2. 21. 13:44728x90반응형
소개
아래 글을 참고해보면, Golang으로 챗봇 서버를 만들면 빠르지만 파이썬처럼 dictionary를 쉽게 사용할 수 없기 때문에
SimpleText 하나를 만드는 것조차 복잡하다.
아래 예제는 gin 웹 프레임워크에서 SimpleText를 만들기 위한 방식이다.
ListCard, Carousel은 더욱더 복잡하기 때문에 쉽게 만들 수 있도록 한번 모듈을 만들어 보았다.
// SimpleText for Kakao Response type SimpleText struct { Template struct { Outputs []struct { SimpleText Text `json:"simpleText"` } `json:"outputs"` } `json:"template"` Version string `json:"version"` } // BuildSimpleText ... func BuildSimpleText(msg string) *SimpleText { stext := &SimpleText{Version: "2.0"} var temp []struct { SimpleText Text `json:"simpleText"` } simpleText := Text{Text: msg} text := struct { SimpleText Text `json:"simpleText"` }{SimpleText: simpleText} temp = append(temp, text) stext.Template.Outputs = temp return stext } c.JSON(http.StatusOK, gin.H{"message": BuildSimpleText(fmt.Sprintf("Entered: %v", json.UserRequest.Utterance))}) // 결과 JSON: {"template":{"outputs":{"simpleText":{"text":"Entered: 2021 검색\n"}}},"version":"2.0"}
모듈 사용법
원하는 웹 프레임워크와 kakao 모듈을 설치한다. (gin에서 테스트되었음)
go get -u github.com/gin-gonic/gin go get -u github.com/Alfex4936/kakao
0. 카카오 챗봇 POST JSON 데이터 Marshal
k.Request
import ( k "github.com/Alfex4936/kakao" "github.com/gin-gonic/gin" ) // 카카오 POST json 데이터 var kjson k.Request if err := c.BindJSON(&kjson); err != nil { c.AbortWithStatusJSON(200, k.SimpleText{}.Build("잠시 후 다시")) return } utter := kjson.UserRequest.Utterance // 유저 발화문 search := kjson.Action.Params["search"] // 커스텀 파라미터
1. SimpleText, SimpleImage
Build()로 바로 만들 수 있다.
SimpleText{}.Build(보여줄 메시지, quickReplies)
SimpleImage{}.Build(이미지 링크, 이미지 로딩 실패 시 텍스트)
import ( k "github.com/Alfex4936/kakao" "github.com/gin-gonic/gin" ) // /simpletext func simpleText(c *gin.Context) { // quickReplies를 넘길 수도 있음 // var quickReplies Kakao // quickReplies.Add(QuickReply{}.New("111", "111")) c.PureJSON(200, k.SimpleText{}.Build("메시지 입니다.", nil)) } // /simpleimage func simpleImage(c *gin.Context) { c.PureJSON(200, k.SimpleImage{}.Build("http://", "ALT")) }
2. ListCard
New(true/false)로 quickReplies 사용 여부를 선택한다.
Title, Buttons, Items, QuickReplies (사용한다면)을 추가해준다. Add()
Items과 Buttons에 추가될 수 있는 아이템은 3번을 참고
import ( k "github.com/Alfex4936/kakao" "github.com/gin-gonic/gin" ) // /listcard func returnListCard(c *gin.Context) { listCard := k.ListCard{}.New(true) // quickReplies 사용 여부 listCard.Title = "Hello ListCard" // ListItem: Title, Description, imageUrl listCard.Items.Add(k.ListItem{}.New("안녕하세요!", "", "http://image")) // LinkListItem: Title, Description, imageUrl, address listCard.Items.Add(k.ListItemLink{}.New("안녕하세요!", "", "", "https://www.naver.com/")) listCard.Buttons.Add(k.ShareButton{}.New("공유하기")) listCard.Buttons.Add(k.LinkButton{}.New("네이버 링크", "https://www.naver.com/")) // QuickReplies: label, message (메시지 없으면 라벨로 발화) listCard.QuickReplies.Add(k.QuickReply{}.New("오늘", "오늘 날씨 알려줘")) listCard.QuickReplies.Add(k.QuickReply{}.New("어제", "어제 날씨 알려줘")) c.PureJSON(200, listCard.Build()) }
2-1. Items, Buttons, QuickReply
필수 여부는 문서나 카카오 챗봇 도움말 참고
(라벨은 보여주기용, 메시지는 실제 메시지로 전송될 문구, 메시지 없으면 라벨로 발화)
Buttons: ShareButton (공유 버튼), LinkButton (링크 버튼), CallButton (전화 버튼), MsgButton (메시지 버튼)
Items: ListItem (일반), ListItemLink (링크 버전)
ShareButton{}.New(라벨 string) CallButton{}.New(라벨, 전화번호, 메시지텍스트 string) LinkButton{}.New(메시지, 링크 string) MsgButton{}.New(라벨, 메시지 string)
ListItem{}.New(제목, 설명, 사진 URL string) ListItemLink{}.New(제목, 설명, 사진 URL, 웹링크 URL string)
QuickReply{}.New(라벨, 메시지 string)
3. BasicCard, Carousel
BasicCard는 New(썸네일, 버튼 bool) 초기화 후, 아이템들 입력 후 Build()
Carousel은 New(커머스 카드?, 케로셀헤더 사용? bool) 초기화 후, 아이템들 입력 후 Build()
import ( k "github.com/Alfex4936/kakao" "github.com/gin-gonic/gin" ) // BasicCard 만들기 func returnBasicCard(c *gin.Context) { basicCard := k.BasicCard{}.New(true, true) // 썸네일, 버튼 사용 여부 basicCard.Title = "제목입니다." basicCard.Desc = "설명입니다." basicCard.ThumbNail = k.ThumbNail{}.New("http://썸네일링크") basicCard.Buttons.Add(k.LinkButton{}.New("날씨 홈피", "http://날씨 사이트")) c.PureJSON(200, basicCard.Build()) } // Carousel 만들기 func returnCarousel(c *gin.Context) { carousel := k.Carousel{}.New(false, false) // Commerce카드 인지, CarouselHeader 사용 여부 for _, person := range people.PhoneNumber { // basicCard 케로셀에 담기 card1 := k.BasicCard{}.New(false, true) card1.Title = fmt.Sprintf("%v (%v)", person.Name, person.Email) card1.Desc = fmt.Sprintf("전화번호: %v\n부서명: %v", intel+person.TelNo, person.DeptNm) // 전화 버튼, 웹 링크 버튼 케로셀에 담기 card1.Buttons.Add(k.CallButton{}.New("전화", intel+person.TelNo)) card1.Buttons.Add(k.LinkButton{}.New("이메일", fmt.Sprintf("mailto:%s?subject=안녕하세요.", person.Email))) carousel.Cards.Add(card1) } c.PureJSON(200, carousel.Build()) }
4. CommerceCard
New() -> Build()
import . "github.com/Alfex4936/kakao" // CommerceCard 만들기 func returnCommerceCard(c *gin.Context) { commerceCard := CommerceCard{}.New() commerceCard.Desc = "안녕하세요" commerceCard.Price = 10000 commerceCard.Discount = 1000 // 할인 commerceCard.Currency = "won" // "won"만 지원 commerceCard.ThumbNails.Add(ThumbNail{}.New("http://some.jpg")) // 1개만 추가 가능 commerceCard.Buttons.Add(LinkButton{}.New("구매하기", "https://kakao/1542")) commerceCard.Buttons.Add(CallButton{}.New("전화하기", "354-86-00070")) commerceCard.Buttons.Add(ShareButton{}.New("공유하기")) c.PureJSON(200, commerceCard.Build()) }
5. ContextControl
name, lifeSpan, params을 받습니다.
(params는 필수 여부가 아니므로 nil 처리로 표시 X)
import ( k "github.com/Alfex4936/kakao" "github.com/gin-gonic/gin" ) // ContextControl 만들기 func returnContextControl(c *gin.Context) { params1 := map[string]string{ "key1": "val1", "key2": "val2", } ctx := k.ContextControl{}.New() ctx.Values.Add(k.ContextValue{}.New("abc", 10, params1)) ctx.Values.Add(k.ContextValue{}.New("ghi", 0, nil)) c.PureJSON(200, ctx.Build()) }
참고
문서
소스
728x90'컴퓨터 > Go language' 카테고리의 다른 글
Go언어: Generics 이용하기 (v1.17+) (2) 2021.03.24 Golang: soup를 이용한 네이버 날씨 정보 가져오기 (0) 2021.02.14 Golang: JSON <, >, & HTML 기호 escape 하기 (0) 2021.02.09