ABOUT ME

-

Total
-
  • Golang: 카카오 챗봇 API 응답 JSON 빌더 헬퍼 모듈
    컴퓨터/Go language 2021. 2. 21. 13:44
    728x90
    반응형

    golang 로고

     

    The Go Programming Language

    Download Go Binary distributions available for Linux, macOS, Windows, and more. // You can edit this code! // Click here and start typing. package main import "fmt" func main() { fmt.Println("Hello, 世界") } Hello, World! Conway's Game of Life Fibonacci

    golang.org

     

    소개

    아래 글을 참고해보면, Golang으로 챗봇 서버를 만들면 빠르지만 파이썬처럼 dictionary를 쉽게 사용할 수 없기 때문에

     

    Golang: gin으로 카카오 챗봇 서버 만들기

    gin gin-gonic/gin Gin is a HTTP web framework written in Go (Golang). It features a Martini-like API with much better performance -- up to 40 times faster. If you need smashing performance, get you..

    choiseokwon.tistory.com

     

    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"}

     

    모듈 사용법

     

    Alfex4936/kakao

    Go언어용 카카오 챗봇 제작 도우미. Contribute to Alfex4936/kakao development by creating an account on GitHub.

    github.com

     

    원하는 웹 프레임워크와 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())
    }

     

    참고

    문서

     

    kakao · pkg.go.dev

    카카오톡 챗봇 빌더 도우미 Go언어 전용 소개 파이썬처럼 dictionary 타입을 쉽게 이용할 수 있지 않기 때문에, SimpleText, SimpleImage, ListCard, Carousel, BasicCard, ContextControl JSON 데이터를 쉽게 만들 수 있도

    pkg.go.dev

    소스

     

    Alfex4936/kakao

    Go언어용 카카오 챗봇 제작 도우미. Contribute to Alfex4936/kakao development by creating an account on GitHub.

    github.com

     

    728x90

    댓글