GAE/Go로 Slack의 '/'(슬래시) 명령 서버를 설정합니다.
소개
WebSocket을 사용한 hubot이 압도적으로 유행하고 있습니다만, 왠지 채팅으로 bot에 말을 걸어 서버측에서 처리해 Slack에 결과를 돌려주는 케이스이면, SlashCommands의 Integration으로 충분히 충분합니다.
GAE/Go로, 이 SlashCommands의 서버를 무료 테두리 내에서 바삭하게 만들 수 버리므로 추천입니다.
사전 준비됨
환경 준비
GoogleCloudPlatform에서 프로젝트 만들기
※프로젝트명은 자유롭게 설정해 주세요
프로젝트 준비 및 배포
기주 b. 코 m / 쿄코미 / s ぁ ck s sh sh komman ds 를 체크아웃 한다.
$ git clone https://github.com/kyokomi/slack-slash-commands.git
app.yaml에 프로젝트 이름 설정
src/app.yamlapplication: <自分で用意したプロジェクト名>
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 설정
$ git clone https://github.com/kyokomi/slack-slash-commands.git
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"
$ cd ./slack-slash-commands
$ make install
$ make deploy
슬랙의 통합 측 설정 및 저장
URL에
https://<プロジェクト名>.appspot.com/v1/cmd
를 설정합니다.(이하는 예)
Slack에서 동작을 확인해 봅니다.
Slash Commands
로 설정된 명령을 입력하십시오. (예라면 /hogecmd echo ふむふむ
)
직접 명령 추가
기본적으로는 기주 b. 코 m / 쿄코 미 / 고 s sh / p ㅅ 긴 s / 에쵸 패키지를 참고로 해 구현해 주면 OK입니다.
AppEngine 서버의 현재 시간을 반환하는 플러그인을 만드는 예
src/plugins/time.gopackage 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),
)
}
기본적으로는 기주 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의 채팅으로 간단하게 취할 수 있게 되기 때문에, 꼭 시험해 주세요.
이번에 만들었다.
Reference
이 문제에 관하여(GAE/Go로 Slack의 '/'(슬래시) 명령 서버를 설정합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kyokomi/items/3e33702ecda25ba73416
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(GAE/Go로 Slack의 '/'(슬래시) 명령 서버를 설정합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kyokomi/items/3e33702ecda25ba73416텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)