[Slack API] Interactive Components with CURL, Python(AWS Lambda) - post message

이 글에서는 AWS Api Gateway와 Lambda를 사용하여 Slack에 Interactive Message를 post하고 버튼을 클릭했을 때 요청을 처리하는 간단한 예제를 만들어 본다.

먼저 Slack API를 사용하기 위해 Slack API에 접속해서 로그인을 한 후 Your apps로 들어가 새 APP을 생성한다.

Interactive Components를 만들 예정이니 한 번 들어가 본다.

Interactivity를 On 하면 Request URL 칸이 나온다.
일단 Request URL은 비워두고 나중에 채워 넣기로 하자.

다음으로 OAuth & Permissions 탭으로 들어가서 Scopes에 Bot Token Scopes를 다음과 같이 추가해 준다.


Install to Workspace를 해주면 아래처럼 Bot User OAuth Token이 발급 된다.

발급 받은 토큰으로 아래 명령어를 이용해서 간단하게 테스트 해보면 메시지가 잘 나오는 것을 알 수 있다.

$ curl -d '{"channel": "deploy-dev", "text":"test"}' \
-H "Content-type: application/json" \
-H "Authorization: Bearer <xoxb-로 시작하는 Bot User OAuth Token>" \
-X POST https://slack.com/api/chat.postMessage
{"ok":true,"channel":"C01M8S3ML82","ts":"1616565495.003900","message":{"bot_id":"B01S8MB35QB","type":"message","text":"test","user":"U01SM3S1VUH","ts":"1616565495.003900","team":"T01FNCJFLFM","bot_profile":{"id":"B01S8MB35QB","deleted":false,"name":"interactive-message","updated":1616565292,"app_id":"A01S1M3TWHL","icons":{"image_36":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/bot_36.png","image_48":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/bot_48.png","image_72":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/service_72.png"},"team_id":"T01FNCJFLFM"}},"warning":"missing_charset","response_metadata":{"warnings":["missing_charset"]}}%

Python 코드로 작성하면 다음과 같이 작성할 수 있다.
이 글에서는 AWS Lambda를 기준으로 코드를 작성했다.

# Import WebClient from Python SDK (github.com/slackapi/python-slack-sdk)
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
     
def lambda_handler(event, context):
    client = WebClient(token='xoxb-로 시작하는 Bot User OAuth Token')
    
    try:
        result = client.chat_postMessage(
            channel="deploy-dev", 
            text="test"
        )
        print(result)
    
    except SlackApiError as e:
        print(f"Error posting message: {e}")  

이제 버튼을 이용해서 상호작용 할 수 있는 메시지를 만들어 보자.
Slack Block Kit Builder로 들어가면 메시지 템플릿을 쉽게 만들 수 있다.

마음에 드는 템플릿을 고르고 blocks의 값 부분을 복사해서 파이썬 코드에 다음과 같이 붙여넣어 준다. 여기서 true, false 값은 파이썬에 맞게 True, False로 바꿔줘야한다.

# Import WebClient from Python SDK (github.com/slackapi/python-slack-sdk)
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
     
def lambda_handler(event, context):
    client = WebClient(token='xoxb-로 시작하는 Bot User OAuth Token')
    
    try:
        result = client.chat_postMessage(
            channel="deploy-dev", 
            blocks=[
        		{
        			"type": "section",
        			"text": {
        				"type": "mrkdwn",
        				"text": "You have a new request:\n*<fakeLink.toEmployeeProfile.com|Fred Enriquez - New device request>*"
        			}
        		},
        		{
        			"type": "section",
        			"fields": [
        				{
        					"type": "mrkdwn",
        					"text": "*Type:*\nComputer (laptop)"
        				},
        				{
        					"type": "mrkdwn",
        					"text": "*When:*\nSubmitted Aut 10"
        				},
        				{
        					"type": "mrkdwn",
        					"text": "*Last Update:*\nMar 10, 2015 (3 years, 5 months)"
        				},
        				{
        					"type": "mrkdwn",
        					"text": "*Reason:*\nAll vowel keys aren't working."
        				},
        				{
        					"type": "mrkdwn",
        					"text": "*Specs:*\n\"Cheetah Pro 15\" - Fast, really fast\""
        				}
        			]
        		},
        		{
        			"type": "actions",
        			"elements": [
        				{
        					"type": "button",
        					"text": {
        						"type": "plain_text",
        						"emoji": True,
        						"text": "Approve"
        					},
        					"style": "primary",
        					"value": "click_me_123"
        				},
        				{
        					"type": "button",
        					"text": {
        						"type": "plain_text",
        						"emoji": True,
        						"text": "Deny"
        					},
        					"style": "danger",
        					"value": "click_me_123"
        				}
        			]
        		}
        	]
        )
        print(result)
    
    except SlackApiError as e:
        print(f"Error posting message: {e}")  

코드를 실행해보면 slack에 메시지가 성공적으로 post 된 것을 볼 수 있다.

하지만 ApproveDeny 버튼을 누르면 interactivity URL을 설정하라고 나온다.

이 때 필요한 것이 위에서 비워둔 Request URL이다. 버튼을 클릭하면 Slack이 Request URL로 HTTP POST 요청을 보낸다.
다음 글에서 API Gateway로 REST API를 구축해서 이 Request URL을 채워넣고 Slack에서 보낸 요청을 처리해 보도록 하자.

좋은 웹페이지 즐겨찾기