프로젝트/슬랙봇

슬랙봇 개발기 ③ - 슬랙봇에게 말을 걸면 답장 보내기 (socket mode)

뽀글보리 2022. 12. 15. 15:47
반응형

 

 

슬랙봇 개발기 ② - python slack sdk + flask 서버 구축

슬랙봇 개발기 ① - 소켓 모드란 무엇일까? 슬랙봇을 개발할 경우에는 HTTP통신을 기반으로 하거나 웹소켓 통신을 기반으로 하는 두가지 방법이 있다. 먼저 HTTP 통신을 기반으로 하는 방법은 public

bboglebbogle.tistory.com

슬랙봇 개발기1, 2에서 소켓 모드를 사용하여 프로젝트를 세팅하는 방법에 대해서 서술했다.

이번에는 커맨드를 사용할 때마다 사용자에게 답장을 보내는 슬랙봇을 만들어보자 !

슬랙봇에게 메시지를 보낼 수 있도록 하려면 Features-App Home-Show Tabs-Message Tab에서

Allow users to send Slack commands and message from the messages tab에 체크를 해주어야한다.

Event subscriptions를 체크하고 app_mention과 message.im 이벤트를 구독하도록 해보자,

app_mention 이벤트는 @를 사용하여 슬랙봇을 멘션했을 때마다 message_listener에서 처리할 수 있게 되고,

message.im 이벤트를 구독하면 슬랙봇 대화창에 말을 걸때마다 message_listener에서 처리할 수 있다.

{
    'envelope_id': '74c47500-a33c-43ba-b849-b216dc47d744',
    'payload': {
    'token': '5BqbHHQosPgHgxeA5LXAcPNX',
    'team_id': 'T043853J0CX',
    'api_app_id': 'A04ENV4NG1H',
    'event': {
          'client_msg_id': '5fe8189c-672c-48fa-9089-f5259167e909',
          'type': 'message', 
          'text': 'hi', 
          'user': 'U043NJWLRAP', 
          'ts': '1670736778.160529', 
          'blocks': [{'type': 'rich_text', 'block_id': 'TOtRU', 'elements': [{'type': 'rich_text_section', 'elements': [{'type': 'text', 'text': 'hi'}]}]}],
          'team': 'T043853J0CX',
          'channel': 'D04F1MT6JD7',
          'event_ts': '1670736778.160529',
          'channel_type': 'im'
      },
     'type': 'event_callback',
     'event_id': 'Ev04EL4MHQG5',
     'event_time': 1670736778,
     'authorizations': [{'enterprise_id': None, 'team_id': 'T043853J0CX', 'user_id': 'U04EP312SV8', 'is_bot': True, 'is_enterprise_install': False}],
     'is_ext_shared_channel': False,
     'event_context': '4-eyJldCI6Im1lc3NhZ2UiLCJ0aWQiOiJUMDQzODUzSjBDWCIsImFpZCI6IkEwNEVOVjRORzFIIiwiY2lkIjoiRDA0RjFNVDZKRDcifQ'},
     'type': 'events_api',
     'accepts_response_payload': False, 'retry_attempt': 0, 'retry_reason': ''
  }

message.im 이벤트가 올 때마다 도착하게 되는 메시지 형식이다.

def message_listener(req):
    req = json.loads(req)
    if req.get("type") == "events_api":
        type = req.get("payload").get("event").get("type")
        channel_type = req.get("payload").get("event").get("channel_type")
        if type == "message" and channel_type == "im":
            socket.send_socket_mode_response(SocketModeResponse(envelope_id=req.get("envelope_id")))
            text = req.get("payload").get("event").get("text")
            channel = req.get("payload").get("event").get("channel")
            socket.web_client.chat_postMessage(channel=channel, text="nice to meet you")

다음과 같은 메시지가 전달되게 되는 데, 메시지를 받게 되면 처음에는 ack를 반환해주어야 한다.
그 다음에 유저에게 답장을 해보자. 유저에게 답장을 하려면 bot permissions에 chat:write scope이 포함되어야 한다.

다음과 같이 유저가 말을 걸면 답장을 하는 슬랙봇이 완성되었다.

반응형