티스토리 뷰
개요
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 에서 확인할 수 있으며
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 구현 코드를 보면 된다.
'golang' 카테고리의 다른 글
Slack Slash Command - 영한 번역(3) (0) | 2019.07.16 |
---|---|
Slack Slash Command - 영한 번역(2) (0) | 2019.07.15 |
gRPC SSL/TLS 3. 실제 구현 (9) | 2019.07.01 |
gRPC SSL/TLS 2. SSL/TLS 에 대하여 (0) | 2019.07.01 |
gRPC SSL/TLS 1. 암호에 대하여 - 대칭키, 비대칭키, 해시 알고리즘 (0) | 2019.07.01 |
- Total
- Today
- Yesterday
- 체호프
- Shortcut
- solid
- Bug
- websocket
- pool
- 클린 애자일
- Gin
- intellij
- JIRA
- notion
- 잡학툰
- 2023
- bun
- 독서
- postgres
- agile
- golang
- go
- 영화
- 제이펍
- 독서후기
- ChatGPT
- 노션
- strange
- API
- OpenAI
- github
- folklore
- 인텔리제이
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |