티스토리 뷰

golang

Slack Slash Command - 영한 번역(1)

주먹불끈 2019. 7. 12. 12:50

개요

 

Slack Slash Command 영한 번역을 해보자.

이를 위해 Google Cloud Functions Translation API 이용해본다.

 

목차

 

구구절절이 적다보니 하나의 게시물에 모두 적으면 정신이 없다.

아래와 같이 부분으로  나누어서 하나씩 정리해가며 포스팅 해본다.

 

첫번째 포스팅. Slack Slash Command 만들고, 로컬 PC 에서 서버를 구동해본다.

- 겸사겸사 Slack Slash Command 전달되는 내용을 들여다본다.

두번째 포스팅. 로컬 PC 에서 Translation API 호출해본다.

- 비용과 API 사용법을 알아보자

세번째 포스팅. 구현한 내용을 Cloud Functions 올려서 서비스한다.

- 별도의 서버 구축없이 위의 기능을 돌려보자. 비용도 확인해본다.

 

최종 구현의 동작 프로세스

 

1) Slack 에서 /tr <English sentence to translate> 치면

2) Cloud Functions 에서는 English sentence 추출하여, Translation API 이용하여 번역후

3) Slack 회신해준다.

 

Slack Slash Command 만들기

 

링크: https://api.slack.com/slash-commands

 

1. 준비 작업. Port Forwarding 해두자.

 

우선은 로컬 PC HTTP 서버를 구현해두고, Slack 에서 보내오는 HTTP POST 처리할 것이다.

이를 위해서는 외부에서 나의 local PC 접근할 있는 IP 또는, domain name 필요하다.

 

$ssh -o ServerAliveInterval=60 -R 80:localhost:8080 serveo.net

 

윈도우의 커맨드 창에서 위와 같이 치면 https://xxx.serveo.net 이라는 domain name 생성된다.

- xxx 임의의 단어가 할당된

 

1) serveo.net 이라는 곳에서 제공하는 서비스이다.

2)  https://xxx.serveo.net:80 포트로 접근을 하면, localhost 8080 포트로 들어오게 해주는 것이다.

3) -o ServerAliveInterval ssh 명령의 고유 옵션으로 끊김 방지라고 생각하면 된다.

 

Slack Slash Command 기능으로 HTTP POST request 발송되면, 이쪽으로 받으려는 것이다.

 

2. /tr Slack Slash Command 만들어보자.

 

https://api.slack.com/apps/new 가서 새로운 Slack app 만든다.

 

1) 앱의 이름은 English2Korean 이다

2) 임시로 만들어둔 justHS 라는 Workspace 에서 작업을 하려 한다.

Slash Commands 기능을 만들어보자.

1) Command 사용할 슬래시 명령

 

2) Request URL Slack Slash Command HTTP POST 보낼 URL 주소

- 준비 작업에서 만들어둔 local PC 외부에서 접근 가능한 domain name 적는다.

- 최종 구현이 되면 Cloud Functions endpoint 적을 것이다.

 

3) Short Description Usage Hint

- 나중에 Workspace install 하여 사용할 때에 안내될 설명이다.

 

이렇게 생성 완료!

 

3. Workspace install 해보자

 

아래와 같이 Install 하면 된다. (조금 불친절하지만 해당 메뉴를 찾기 어렵진 않을 것임)

 

 

 

Local Server 만들기

 

golang 으로 HTTP server 만들어본다. (port :8080)

 

1) Slask Slash Command HTTP POST 받아서

2) Signed Secret 인증을 하고

3) Slack 보내온 정보를 Server 단에 뿌리고

4) Slack 에도 그래도 회신해준다. 포맷을 고민해보자

 

참고 링크: https://qiita.com/takasp/items/368d9da90520c3ea48dc

GitHub 코드링크: https://github.com/nicewook/slack-translate/tree/Implementation_Phase1

- 첫번째 단계의 구현을 GitHub Implementation_Phase1 브랜치에 두려고 한다.

- 이후 단계에 추가 구현을 commit 위에 이어갈 것이다.

 

 

Slack 에서 HTTP POST 인지를 Verify 하기

 

Slack Verifying Requests 참고 링크: https://api.slack.com/docs/verifying-requests-from-slack

github.com/nlopes/slack 패키지의 관련 링크들

- 예제: https://github.com/nlopes/slack/blob/master/examples/slash/slash.go

- 관련코드: https://sourcegraph.com/github.com/nlopes/slack/-/blob/security.go

충분히 디버깅은 못했지만 동작하지 않아서, 개인적으로 구현함

 

개념 정리

 

1) 대칭키를 이용하여 특정 Slack App 에서 보내는 것이 맞다는 서명을 하는 것으로 보인다.

 

2) 대칭키는 Slack App Basic Information 에서 확인할 있으며

- https://api.slack.com/apps

 

3) 유출시 재생성이 가능하다.

 

* 비대칭키를 쓰면 나을것도 같은데, 속도 문제로 안쓰는 것인가 보다.

* Verification Token deprecate 되었으니 쓰지 말자.

* 서버에서는 Signing Secret 환경변수 저장하고, 이것을 프로그램에서 읽어서 쓴다.

- 윈도우라면 set SLACK_SIGNING_SECRET=<Signing Secret of your Slack App>

 

프로세스 이해 (단순화)

 

1) Slack 에서는 전송하려는 메시지의 바디를 해싱한 다음,

2) Signing Secret 이용하여 암호화한 Signature 만들어서 헤더에 추가하여 보낸다.

3) 수신한 서버는 바디를 해싱하고, 서버도 가지고 있는 Signing Secret 암호화하여 Signature 만든 다음에

4) Slack 보내준 Signature 동일한지를 확인한다. (Verification)

 

서버의 해당 코드

 

설명은 생략하며, Slack 가이드에 따른 구현으로 이해하면 된다.

- 링크: https://api.slack.com/docs/verifying-requests-from-slack

 

 

Slack 에서 HTTP POST 내용을 까서 보고, 회신하기

 

1) 첫번째와 두번째 네모 부분이 인증과 관련한 부분

 

2) 세번째 네모는 Slack 보낸 HTTP POST 내용을 파싱하는 것이다.

- 실제 nlopes/slack 패키지를 까보아도 특별한 것은 없다.

 

3) 네번째 네모는 서버단에 내용을 뿌려주는 것이고

 

4) 마지막 네모는 Slack 회신을 하는 것이다.

- nlopes/slack 패키지가 제공하는 slack.Msg{} 쉽게 작성이 가능하다

- 경우 Content-Type 설정해줘야 하는 것을 잊지말자

 

 

실제로 Slack 에서 /tr test 라고 명령을 내린 결과이다. 각각 Slack Server log 화면

 

 

 

Local HTTP Server

 

나중엔 Cloud Functions 올리면, 알아서 HTTP Server 역할을 하겠지만

현재는 Local PC 에서 아래와 같이 HTTP Server 돌리면 된다. 자세한 것은 GitHub 구현 코드를 보면 된다.

 


반응형
반응형
잡학툰 뱃지
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
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
글 보관함