서버를 담당하고 있다보면 PM이나 app, front 개발자로부터 요청이 오곤 한다.
주로 VOC를 확인하기 위한 서버 동기화 data 혹은 log 조회에 관한 내용이다.

이게 시간은 많이 걸리지 않지만 반복되서 재미 없고 귀찮은 일이기도 한데 최근에는 이런 요청이 부쩍 많아져서 이번에 slack bot을 개발하게 되었다.

tutorial

이전에는 slack web hook을 사용하는 script를 작성해서 batch와 server에 붙였었다.
slack bot을 검색해보니 web hook을 call 하는 것들이 많이 나왔는데, 최신 문서에서는 bolt라는 slack library를 사용하는 것을 제안하고 있었다.

bolt는 javascript 등을 지원하는데, 나는 python으로 작성했다.
bolt로 python app(bot)을 만드는 tutorial을 따라하면 어렵지 않다.

  • https://api.slack.com/start/building/bolt-python

tutorial만 보고 부족한 부분들을 추가로 정리한다.

bolt spec

bolt는 이전에 사용하던 web api 호출과 약간 다르다.
api가 wrapping 되어 있기도 하고 event 등 설정이 있어서 spec을 조금 보고 bolt를 이해하면 사용하기 더 편하다.

python libary로 사용되는 bolt spec.
여기서 bolt가 지원하는 기능들이 무엇이 있는지 보고, 원하는 것을 사용할 수 있다.

  • https://slack.dev/bolt-python/api-docs/slack_bolt/app/app.html#slack_bolt.app.app.App.event

bolt의 param 들

bolt에서 param들로 여러 작업들을 할 수 있는데, 이걸 알면 일이 한참 수월하다.

  • saylogger client 등 bolt에서 param들이 뭔지 알아야 잘 쓸 수 있다.
  • https://github.com/slackapi/bolt-python#making-things-happen

예시

가장 많이쓰는 say()를 이해하자면 say는 channel에 말을 하는 것이다.
say()thread_ts를 명시하면 thread에 말할 수 있다.

bolt에서 argument로 모든 기능을 지원하지는 않는다.
지원하지 않는 기능들은 webApi를 client를 통해 사용할 수 있다.

api spec

api list를 여기서 확인할 수 있다.
bolt가 지원하지 않는 것들을 client에서 사용하려면 api spec을 참고할 필요가 있다.
아래 spec에서 python 탭을 보면 나오는 api들이 client에서 사용할 수 있는 값이다.

  • https://api.slack.com/methods?filter=chat

참고사항

예전에 사용하던 custom integration은 이제 사용하지 않는다.

  • custom integration은 지원하지 않는 기능들이 많다.
  • https://api.slack.com/legacy/custom-integrations#migrating_to_apps

설정

설정하는데 시간을 제일 많이 썼다.
당연히 설정을 제대로 하지 않으면 동작하지 않는데, 추가해야 할 것들이 몇 가지 있다.

이 설정들은 모두 slack app page에서 사용할 app에 대해 설정하는 것이다.

  1. OAuth & Permissions에서 permisison 추가
    • 여기 필요한 permission들은 api spec에서 확인
  2. event를 사용하는 경우 Event Subscriptions에서 subscripption 추가
  3. socket mode 설정
    • app에서 Event API와 Interactive component를 사용할 수 있게 해주는 모드
    • http url을 endpoint로 사용하지 않고 web socket으로 통신하는 모드
    • https://api.slack.com/apis/connections/socket

slack app bot 개발에 도움을 주는 library

내가 구현한 bot의 구조는 이렇다.

bot structure

이렇기 때문에, 2 tunnel ssh가 필요해서 알아보다가 발견한 것이 sshtunnel. sshtunnel에 설명된 예제를 보면 쉽게 사용할 수 있다.

reference

  • 슬랙 공식 tutorial, https://api.slack.com/start/building/bolt-python
  • bolt python argument, https://github.com/slackapi/bolt-python#making-things-happen
  • bolt say, https://github.com/slackapi/bolt-js/issues/559
  • bolt web api client, https://slack.dev/bolt-python/concepts#web-api
  • sshtunnel, https://pypi.org/project/sshtunnel/