GAE/Go로 Slack의 '/'(슬래시) 명령 서버를 설정합니다.

8233 단어 5슬랙GAE
이 기사는 Go Advent Calendar 2015의 13 일째 기사입니다.

소개



WebSocket을 사용한 hubot이 압도적으로 유행하고 있습니다만, 왠지 채팅으로 bot에 말을 걸어 서버측에서 처리해 Slack에 결과를 돌려주는 케이스이면, SlashCommands의 Integration으로 충분히 충분합니다.

GAE/Go로, 이 SlashCommands의 서버를 무료 테두리 내에서 바삭하게 만들 수 버리므로 추천입니다.

사전 준비됨


  • Google 계정, GCP 등록됨
  • Slack 등록됨
  • Go 환경 구축
  • GAE/Go 개발 환경 구축

  • 환경 준비



    GoogleCloudPlatform에서 프로젝트 만들기





    ※프로젝트명은 자유롭게 설정해 주세요

    프로젝트 준비 및 배포



    기주 b. 코 m / 쿄코미 / s ぁ ck s sh sh komman ds 를 체크아웃 한다.


    $ git clone https://github.com/kyokomi/slack-slash-commands.git
    

    app.yaml에 프로젝트 이름 설정



    src/app.yaml
    application: <自分で用意したプロジェクト名>
    version: 1
    runtime: go
    api_version: go1
    
    handlers:
    - url: /.*
      script: _go_app
    
    - url: /favicon\.ico
      static_files: assets/favicon.ico
      upload: web/favicon\.ico
      expiration: "14d"
    

    GoogleAppEngine에 배포


    $ cd ./slack-slash-commands
    $ make install
    $ make deploy
    

    Slack의 Integration에서 SlashCommands 추가



    Integrations를 열고 Slash Commands를 선택합니다.



    일단 Slack 상의 슬래시 호출의 커멘드를 /hogecmd 로 한다.
    (이것은 자유롭게 설정해 주세요)



    Autocomplete help text 설정


  • Show this command in the autocomplete list에 체크를 한다
  • Description에 개요 넣기
  • Usage hint에 추가 할 예정의 명령을 넣는다 (처음은 없어도 좋다)



  • 슬랙의 통합 측 설정 및 저장



    URL에 https://<プロジェクト名>.appspot.com/v1/cmd를 설정합니다.
    (이하는 예)



    Slack에서 동작을 확인해 봅니다.


    Slash Commands로 설정된 명령을 입력하십시오. (예라면 /hogecmd echo ふむふむ )





    직접 명령 추가



    기본적으로는 기주 b. 코 m / 쿄코 미 / 고 s sh / p ㅅ 긴 s / 에쵸 패키지를 참고로 해 구현해 주면 OK입니다.

    AppEngine 서버의 현재 시간을 반환하는 플러그인을 만드는 예



    src/plugins/time.go
    package time
    
    import (
        "time"
    
        "github.com/kyokomi/goslash/goslash"
        "github.com/kyokomi/goslash/plugins"
    )
    
    type plugin struct {
    }
    
    func New() plugins.Plugin {
        return &plugin{}
    }
    
    func (p *plugin) Do(_ goslash.SlashCommandRequest) goslash.SlashCommandMessage {
        return goslash.NewInChannelMessage(
            time.Now().Format(time.RFC3339),
        )
    }
    
  • goslash.NewMessage 그러면 자신 이외의 사용자에게는 보이지 않는 메시지가 된다
  • goslash.NewInChannelMessage가 자신 이외의 사용자에게도 보이는 메시지가됩니다

  • src/main.go
    package app
    
    import (
        "net/http"
    
        "github.com/kyokomi/goslash/goslash"
        "github.com/kyokomi/goslash/plugins"
        "github.com/kyokomi/goslash/plugins/echo"
    
    +   "plugins/time"
    
        "github.com/unrolled/render"
        "google.golang.org/appengine"
        "google.golang.org/appengine/urlfetch"
    )
    
    func init() {
        renderer := render.New(render.Options{})
    
        slashPlugins := map[string]plugins.Plugin{
            "echo": echo.New(),
    +       "time": time.New(),
        }
    
        http.HandleFunc("/v1/cmd", func(w http.ResponseWriter, r *http.Request) {
            ctx := appengine.NewContext(r)
    
            req, err := goslash.ParseFormSlashCommandRequest(r)
            if err != nil {
                renderer.JSON(w, http.StatusInternalServerError, err.Error())
                return
            }
    
            slashCmd := plugins.New(urlfetch.Client(ctx), slashPlugins)
    
            renderer.Text(w, http.StatusOK, slashCmd.Execute(req))
        })
    }
    

    위의 리노베이션을 수행하고 배포하고 /hogecmd time와 Slack에 입력하십시오.



    현재 시각을 돌려준다.



    ※상기의 예는 GAE/Go에 한정한 구현이 되고 있습니다만, 기주 b. 코 m / 쿄코 미 / 고 s sh / p ㅅ 긴 s / 에쵸 와 같이 보통의 Go 라이브러리로서 실장하면, GAE/Go 이외에서도 사용할 수 있습니다.



    덧붙여서 AWS의 EC2 등(지금 움직이고 있는 API 서버 등)에서도 마찬가지로, SlashCommands용의 API를 살려주면, 서버의 정보나 DB에 문의한 결과 등을 Slack의 채팅으로 간단하게 취할 수 있게 되기 때문에, 꼭 시험해 주세요.

    이번에 만들었다.

    좋은 웹페이지 즐겨찾기