티스토리 뷰

golang

Slack slash command + Golang server

사용자 fistful 2019.02.12 14:45

개요

 

1. Slack slash command 를 받고 회신하는 서버를 golang 으로 짜보자

2. 덤으로 (Heroku ) 등에 올리기 전에 ngrok 을 이용한 로컬 개발을 하자.

 

이후에,

- httprouter 를 사용해보자. 세세한 기능은 부족하지만, 빠르고 깔끔하다는 평이다.

- Heroku-CI 도 사용해보고 Heroku 에도 올려보자

 

참고링크: https://goo.gl/VDn4m9

httprouter: https://github.com/julienschmidt/httprouter

 

ngrok

 

Slack 에서 제공하는 링크: https://api.slack.com/tutorials/tunneling-with-ngrok

 

로컬에서 server 를 돌리면 (예를 들어 http://localhost:8080) 이를 외부에서 접근할 수 있는 URL 로 만들어주는 서비스.

이 URL 을 통해 Slack 에서 로컬에서 개발중인 server 로 HTTP Request 를 날릴 수 있게 된다.

매번 호스팅 서버에 올리거나, Port forwarding 할 필요가 없다.

 

1) ngrok 사이트에 로그인하고 https://ngrok.com/

2) 다운로드후 환경변수 PATH 설정되어 있는곳에 복사

 


 

3) 설치후 이렇게 authtoken 을 등록하고

 


 

4) ./ngrok http 80 이라고 실행하면 아래와 같이 나온다.

- ngrok 으로 생성되는 URL 은 매번 바뀐다. 

 


 

 

Slack slash command

 

1) https://api.slack.com/apps 로 가서 Create New App

2) App 의 이름과 설치할 workspace 를 정해주고

3) Slash Command 와 Request URL 을 정해주면 된다.

- 여기서는 Slack 에서 /time 함께 메시지를 넣어주면, 내용이 아래의 Request URL HTTP POST Request 날아가게 설정된

- https://13aebb3f.ngrok.io/slash 바로 위에서 만들어둔 로컬 컴퓨터에서 돌아갈 HTTP Server URL

 

 


 

 

 

Golang HTTP Server

 

- Slack 에서 App 이 초대된 채널에서 /time 과 함께 메시지를 쓰면, Golang HTTP Server 로 POST 된다.

 

* (참고) 패키지 관리를 위한 사전 작업 (Golang version 1.11 이상)

1) GO111MODULE=on 으로 환경변수가 설정된 상태에서

2) 폴더를 생성하고, go modules 로 패키지 관리를 시작한다.

$go mod init github.com/nicewook/slack_slash_cmd

 

 

Slack 에서 보내주는 slash command POST 아래와 같은 정보를 담고 있다.

 

- command 에는 /weather 대신 지정한 command, 우리의 경우에는 /time 들어올 것이고

- text 에는 /time 뒤에 붙여넣은 message 전송되어 것이다.

오른쪽에 코드로 구현하여 Slack 으로 회신된 값을 적어본다. (일부 값은 *** 처리 하였음)

 



You requested for KST <-> PST/PDT for main.SlashCommand{

Token:"************************",

TeamID:"TFZGF****",

TeamDomain:"ju****",

EnterpriseID:"",

EnterPriseName:"",

ChannelID:"CG05K****",

ChannelName:"general",

UserID:"UG1AL****",

UserName:"nice****",

Command:"/time",

Text:"time convert test message",

ResponseURL:"https://hooks.slack.com/commands/TFZGFT3EC/548228644580/14cL5Rn2k25bRT**********", TirggerID:"547651359232.543559921488.bd2b6e3bdd07d3f35c2935**********"}

 

 

전체 코드 링크: https://github.com/nicewook/slack_slash_cmd/blob/master/version1/server.go

SlashCommand, 대해 정리된 코드 위치: https://github.com/nlopes/slack/blob/master/examples/slash/slash.go

 

HTTP Post 들어오는 값을 담을 구조체를 정의하자

 

- json 부분은 JSON encoding / decoding 관련 있다는 정도로만 알고 넘어가자

- 참고: https://gobyexample.com/json


 


 

Post 가져와서 SlashCommand struct 담는 함수

 

r.ParseForm() 이후, r.PostForm 으로 원하는 항목을 가져온다.

 


 

자세한 내용은 전체 코드 링크를 참조하는 것으로 하고,

Golang Server 의 간략한 동작 프로세스는 아래와 같다.

 

1) net/http 패키지를 사용한다

2) main() 함수에서 http.HandleFunc() 함수로 /slash 오는 POST 처리할 함수를 지정해준다.

3) slashCommandHandler() 함수가 처리해준다.

- slashCommandParse() 함수로 파싱을 하여 구조체에 담은 다음

- s.Command 가 "/time"인 경우를 체크하여

- w.Write() 로 Slack 에 회신해준다.

 


'golang' 카테고리의 다른 글

Golang Channel 의 자명한 이치 (Axioms)  (0) 2019.02.18
slack slash command 는 무얼 보내주는 걸까  (0) 2019.02.15
Slack slash command + Golang server  (0) 2019.02.12
time.Sleep, time.Duration  (0) 2019.02.11
Golang: Github - Travis-CI - Heroku  (0) 2019.02.07
Go Modules  (0) 2019.02.07
댓글
댓글쓰기 폼
공지사항
Total
68,244
Today
98
Yesterday
250
링크
TAG
more
«   2019/05   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
글 보관함