도순씨의 코딩일지
슬기로운 슬랙 봇 만들기 (by 파이썬) 본문
우리가 하고 싶었던 작업은 다음과 같다
"특정 채널에 참여한 사람들에게 DM으로 메시지를 발송한다"
특정 채널에 글을 올리거나, 댓글을 남기는 봇들은 꽤 있었지만 특정 채널에 참여한 사람들에게 DM을 발송하는 봇들은 많지 않았다.
현재 우리 회사에서는 아침에 체크인 봇(내 정체가 밝혀지는 건가,,,,,,)이 DM으로 메시지를 보내주고 있지만,
그건 .. 내가 모르는 언어로 개발됐다고 들었기 때문에 별로 도움이 되지 않을 것 같았다.
참고로 슬랙 앱을 만들고 기본적인 아이디어는 이 블로그에서 얻었다
제 미천한 블로그에 들어오실 것 같진 않지만 감사의 인사를 전합니다..
앱을 설치하기 위해서는 허용 범위를 설정하고 워크스페이스 최고 관리자에게 허락을 받아야하는데
동네방네 게시판에 올라와서 너무 창피했음ㅎㅎㅎㅎㅎ;;;;;
나는 처음에봐서 이것저것 그냥 다 넣어서 허가받았는데, 필요한 필수 권한을 고르자면
channels:read, chat:write 이렇게 두 가지이다.
channels:read는 퍼블릭 채널(자물쇠 걸어져 있는 private channel은 적용 안됩니다 테스트도 해봄여) 에 대한 간단한 정보를 가져와준다.
chat:wirte는 이름 그대로 메시지를 전송해주는 역할을 한다.
슬랙의 API들은 api.slack.com/methods 여기에서 확인할 수 있다
근데 1차 멘붕이 왔던 건 deprecated된 것들이 너무 많아서 적용할 메서드를 고르는 게 쉽지 않았다.
그래도 Tester 탭이 있어서 이것저것 시험해볼 수 있는 점은 매우 편리했다
한 방에 채널 사람들에게 DM을 보내서 처리해버리고 싶었는데, 그건 deprecated된 메서드라서 사용이 불가능했다🥺
그래서 다음과 같은 구조를 택했다.
먼저 공개 채널의 ID를 이용하여 구성원 ID 집합을 배열로 생성한다.
그 다음에 구성원 ID 집합 배열을 돌아가며 DM을 보내주는 것이다.
이 과정에서 conversations.members, chat.postMessage 두 가지 메서드를 사용했다.
conversations.members는 토큰(앱 허가 받고 받은 것), 공개 채널의 ID를 필요로 한다.
참고로 슬랙의 주소 구조는 다음과 같다.
뒤에도 이것저것 붙긴 하지만 우리에게 필요한 것은 저 두 개가 끝이다.
chat.postMessage는 이해하기가 조금 어려웠는데 공식 문서를 열심히 읽어보고 영어를 잘한다면 .. 쉽게 이해할 수 있다
얘는 위에 메서드보다 매개변수 하나가 더 필요한데, 보낼 텍스트가 필요하다.
먼저 요 아이의 기능에 대해 결론부터 내리자면 이 메서드는 세 가지 기능으로 사용할 수 있다.
채널에 글 올리기, 1:다 DM 전송(그룹 만들어서 전송하는 것, 8명까지인가.. 여튼 제한이 있는 것으로 알고 있슴다), 1:1 DM 전송 이렇게 세 가지가 가능하다.
매개변수로 채널 ID를 작성해주면 채널에 글 포스팅, 그룹 ID를 작성하면 1:다 DM 전송(얘는 테스트는 안해봤는데 공식문서 피셜입ㄴㅣ다), 개인 ID를 작성해주면 1:1 DM이 작성된다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
import logging
# Import WebClient from Python SDK (github.com/slackapi/python-slack-sdk)
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
def execute(): # 슬랙 DM 보내기
logger = logging.getLogger()
# WebClient insantiates a client that can call API methods
# When using Bolt, you can use either `app.client` or the `client` passed to listeners.
client = WebClient(token="토큰 입력") # 봇 토큰, 개인에 맞게 설정
# ID of the channel you want to send the message to
channel_id = "채널 ID를 입력해주세요" #채널 ID 입력
# conversations.members (발송 대상 user id 가져오기)
try:
result_cvs = client.conversations_members(
channel=channel_id, # USER ID 가져오기
limit=1000
)
except SlackApiError as e:
logger.error(f"Error getting channel members: {e}")
print("error---------------------------------------------")
cnt = len(result_cvs['members']) # 발송 대상 수
# chat.postMessage
try:
# Call the chat.postMessage method using the WebClient
for i in range(cnt):
print(i, end = ' ')
result_chat = client.chat_postMessage(
channel=result_cvs['members'][i], # USER ID를 이용하여 발송
blocks = [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "메시지 작성"
}
},
{
"type": "actions",
"block_id": "actionblock789",
"elements": [
{
"type": "button",
"text": {
"type": "plain_text",
"text": "링크1"
},
"url": "https://"
},
{
"type": "button",
"text": {
"type": "plain_text",
"text": "링크2"
},
"style": "primary",
"value": "click_me_456",
"url": "https"
}
]
}
]
)
logger.info(result_chat)
except SlackApiError as e:
logger.error(f"Error posting message: {e}")
if __name__ == '__main__':
execute()
|
cs |
왜 limit를 1000으로 걸어놨는지 궁금하신 분들은 없을 것 같지만..
limit라는 항목은 default로 100으로 설정이 되는데 이때문에 100명까지만 보내고 멈춥니다.
max가 1000이라서 저는 1000으로 그냥 설정해주었습니다
메시지를 밋밋하게 보내는건 용납할 수 없어서 꾸미는 것도 이것저것 알아봤는데,
여기 가보시면 이것저것 예쁘다고 할 순 없지만.. 단정한 것들이 많으니
이것저것 눌러보면서 코드 보시면 감이 잡히리라 생각합니다
아 근데 링크를 걸면 '앱이 이 기능을 위해 구성되지 않았습니다. 앱의 개발자에게 문의 하십시오' 클릭하면 이런 메시지가 뜨는데
(링크에 연결은 정상적으로 잘 먹힘)
여기를 참고해서 궁금증 해결해주세요