9Cells

Slack

봇 개발

봇 추가 어디서?

봇 개발이 필요해서 슬랙 사이트를 들어갈 때마다 어디로 가야하는지 헷갈려 하는데, 정리해봅니다.

우선 슬랙 앱개발이니까 슬랙에서 App과 관련된 링크를 누르면 xxx.slack.com/apps 페이지에 도달하는 경우가 많습니다.

이 페이지는 공개된 앱에대한 페이지라 직접 추가한 앱과는 다릅니다. 우상단의 build로 이동합니다.

api.slack.com 여기가 개발에 대한 페이지입니다. 우상단의 Your Apps로 이동합니다.

봇 메세지 전달을 위한 최소 작업

슬랙 봇을 만들면서 퍼미션 부분에 이상한 점이 있었습니다.

API가 정확히 어떤 퍼미션을 필요로 하는지 몰라 이것저것 추가를 하게됐고 작동을 확인 후 전체 퍼미션을 지웠는데도 작동을 하는 것이었습니다.

API에서 필요로하는 정확한 퍼미션을 알기위해 앱을 새로 설치를 하는 식으로 최소 퍼미션 설정방법을 찾아보겠습니다.

우선, app을 그냥 workspace에 설치하려니 "Please add at least one feature or permission scope to install your app." 라고합니다.

위 메세지에서 "permission scope" 부분이 링크로 되어있어서 클릭하여 이동했습니다.

Bot Token Scopes에서 groups:read, groups:write를 추가했습니다.

groups 네임스페이스의 scopes는 private channel을 제어하기 위한 scopes입니다.

Scopes를 추가한 페이지 상단에서 Bot User OAuth Access Token를 복사해둡니다.

App을 workspace에 설치합니다.

슬랙에서 추가한 봇을 원하는 private channel에 invite 합니다.

채널에 메세지를 보내기 위해서 채널 ID를 알아야 합니다.

https://api.slack.com/methods/groups.list/test

여기로 가서 앞서 얻어놓은 token을 넣고 실행해봅니다. 에러가 나네요.

This method is retired and can no longer be used. Please use conversations.list or users.conversations instead. Learn more: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api

문서를 읽어보니 channels., groups., im., mpim. 류는 앞으로 사용하지 못하고 conversations.* 류를 사용해야 한답니다.

https://api.slack.com/methods/conversations.list/test

여기로 가서 token을 넣고 types에 private_channel을 넣고 Test Method 버튼을 클릭하니 앱이 들어가있는 채널이 보입니다.

앱을 지우고 다시 설치했습니다.

퍼미션을 하나 줘야 앱을 설치 가능한데 groups를 못쓴다고 해서 아무거나 users:read를 줬습니다.

https://api.slack.com/methods/conversations.list/test

다시 위 API를 실행해보니 결과가 다음과 같습니다.

{
    "ok": false,
    "error": "missing_scope",
    "needed": "channels:read,groups:read,mpim:read,im:read",
    "provided": "users:read"
}

needed와 provided가 나오는 군요.

테스트에서 이 부분을 보면 어떤 퍼미션을 추가해야하는지 고민할 필요는 없겠습니다.

아무튼 groups.* API가 만료되는 것이지 groups:퍼미션이 만료되는 것은 아닌 걸까요? groups:read를 요구하네요.

일부러 안되는 것을 확인하기 위해 users:read를 지우고 channels:read를 추가하고 테스트해봤습니다.

{
    "ok": false,
    "error": "missing_scope",
    "needed": "groups:read",
    "provided": "users:read,channels:read"
}

의미있는 결과가 나왔습니다.

그렇습니다. 삭제한 users:read가 보입니다. 제가 초반에 궁금해하던 삭제한 퍼미션이 남아있는 듯한 현상이 여기서 확인되는 것 같네요.

다시 앱을 설치하고 groups:read 를 추가하고 앱을 private channel에 초대하고 API 테스트를 해보니 잘 나옵니다.

이번에는 메세지를 전송할 수 있는지를 테스트 해보겠습니다.

https://api.slack.com/methods/chat.postMessage/test

여기로 가서 bot token, 그리고 앞선 호출에서 얻은 channel id와 메세지를 넣고 보내봅니다.

{
    "ok": false,
    "error": "missing_scope",
    "needed": "chat:write:bot",
    "provided": "groups:read"
}

결과는 위와같습니다. chat:write:bot가 필요하다고 합니다. groups:write가 아니군요.

퍼미션을 다시 추가하려 했으나 chat:write:bot은 없어서 chat:write을 추가했습니다.

Tester에서 메세지 전송에 성공했습니다.

groups:write로도 되는지 궁금해서 앱을 삭제 후 groups:read, groups:write 두 개를 주고 메세지를 보내봤습니다.

{
    "ok": false,
    "error": "missing_scope",
    "needed": "chat:write:bot",
    "provided": "groups:read,groups:write"
}

안되는군요.

groups:read, chat:write 두 퍼미션이 필요한 것으로 보입니다.

앞에서 채널 ID는 이미 얻어놨기 때문에 chat:write만 추가해서 사용하겠습니다.