slack 알림에 '책 제작 신청하기'와 같은 버튼을 포함해서 사용자와 상호작용하고자 한다. 이를 위해서는 정보를 주고 받을 Request URL
이 필요하기 때문에 AWS 서비스를 이용해서 REST API를 구축하고자 한다.
다음 블로그 참고
[Slack API] Interactive Components with CURL, Python(AWS Lambda) - post message
Slack 메시지 형식에 버튼을 만들어서 메시지를 보내보자.
Slack의 interactive message를 이용하기 위해 먼저 앱의 OAuth & Permissions
에서 Bot Token Scopes를 다음과 같이 변경한다. (변경 후 app reinstall 필요)
Interactivity & Shortcuts
에서 Interactivity를 On
한다. (일단 Request URL
부분은 비워둔다.)
그 다음 Slack Block Kit Builder에서 내가 원하는 메시지 형식을 만들고, 파이썬 코드에 붙여넣어 테스트 메시지를 보낸다.
(참고로 Block Kit Builder로 만든 코드에 있는 true, false는 파이썬에 맞게 True
, False
로 바꿔줘야함.)
import requests
import json
BOT_TOKEN = 'xoxb-*************-*************-************************'
def post_message(token, channel_id, text):
url = "<https://slack.com/api/chat.postMessage>"
headers = {
"Content-type": "application/json; charset=utf-8",
"Authorization": "Bearer " + token
}
data = {
"channel": channel_id,
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "This is a mrkdwn section block :ghost: *this is bold*, and ~this is crossed out~, and <https://google.com|this is a link>"
}
},
{
"type": "image",
"image_url": "<https://img4.daumcdn.net/thumb/R658x0.q70/?fname=https://t1.daumcdn.net/news/202105/25/notepet/20210525061014357ivhj.jpg>",
"alt_text": "고양이"
},
{
"type": "actions",
"elements": [
{
"type": "button",
"text": {
"type": "plain_text",
"text": "Click Me",
"emoji": True
},
"value": "click_me_123",
"action_id": "actionId-0"
}
]
}
]
}
response = requests.post(url, headers=headers, data=json.dumps(data))
print(response)
if response.json().get('ok'):
print('메시지를 성공적으로 보냈습니다.\\n')
else:
print('메시지를 성공적으로 보내지 못했습니다. 오류메시지 : ' + str(response.json()))
if __name__ == "__main__":
post_message(BOT_TOKEN, '#봇-테스트')
메시지는 잘 왔지만 버튼을 클릭하면 그림과 같은 경고가 뜬다. 앞서 앱의 Interactivity를 설정할 때 Request URL
을 설정해 주지 않았기 때문에 당연한 결과이다.
버튼을 클릭하면 Slack이 Request URL
로 HTTP POST 요청을 보낸다. 이번에는 AWS Lambda와 API Gateway로 REST API를 구축해서 Request URL
을 설정하고 Slack에서 보낸 요청을 처리해 보도록 하자.
전체적인 동작 개요
먼저 Lambda 함수를 생성해주자. 이름은 response-from-slack으로 했다. (lambda_function에 print(json.dumps(event)
추가)
이번에는 AWS의 API Gateway > API 유형 선택 : REST API를 구축을 누르고 API를 생성한다.
작업 > 리소스 생성으로 새 하위 리소스를 생성한다. 그후 작업 > 메소드 생성으로 POST 메소드 설정 (통합유형 : Lambda 함수)
통합 요청 > 매핑 템플릿에서 API Gateway가 Lambda에게 전달할 값의 형식을 정의한다. (Slack api - Handling interaction payloads) (API Gateway 매핑 템플릿)
저장하고 작업 > API 배포하면 URL이 생성된다.
이제 Slack의 Request URL
에 'URL+/리소스 이름'을 넣는다. 앞서 리소스 이름을 button-click이라고 지었으므로 다음과 같이 넣고 Save Changes으로 저장.
1번에서 보냈던 메시지의 버튼을 다시 눌러보면 경고가 뜨지 않는다. Lambda가 실제로 잘 실행되었는지 보기 위해 AWS CloudWatch 콘솔에서 response-from-slack의 로그를 보면 json 데이터가 잘 들어온 것을 볼 수 있다!
이제 다음에는 lambda_function의 코드를 수정해서 버튼을 눌렀을 때 내가 원하는 동작을 수행하도록 만들면 될 것 같다.
관련 활동 바로가기