Python/Slack API

[Slack Bolt] 파이썬 Slack App 댓글 기능 구현 예제

jimmy_AI 2023. 11. 24. 00:29
반응형

안녕하세요. 이번 글에서는 Python slack bolt 모듈을 활용하여
특정 텍스트가 인식되면 스레드에 댓글을 달게 만드는 아주 간단한 슬랙앱 예제를
다루어보도록 하겠습니다.

이번에 다룰 슬랙앱의 기능은 '안녕' 또는 '안녕하세요'가 포함된 내용을 작성하면
맞인사를 스레드 댓글로 작성해주는 간단한 슬랙앱입니다.

 

 

1. Slack App 생성 및 토큰 체크

만일, 아직 슬랙앱을 생성하지 않았다면, 생성 후 채널에 추가하는 과정이 필요합니다.
이와 관련된 내용은 이전에 상세히 작성해두었으니, 아래 글을 참고해주세요.

 

슬랙앱(Slack App) 생성 설정 방법 완벽 가이드

Slack에서는 슬랙앱을 만들어 워크스페이스 내에서 원하는대로 여러 기능을 수행하는 봇을 운영할 수 있는 기능을 제공합니다. 이를 위하여 슬랙앱을 처음에 만들 때, 권한 등 여러 가지 항목에

jimmy-ai.tistory.com

 

참고로, 만든 앱의 Bot TokenApp-Level Token이 이번 글에서 필요합니다.
두 토큰을 각각 SLACK_BOT_TOKENSLACK_APP_TOKEN이라는 이름의
환경 변수로 지정하여 슬랙 모듈에서 인식이 가능하도록 하겠습니다.

$ export SLACK_BOT_TOKEN="xoxb-~"
$ export SLACK_APP_TOKEN="xapp-~"

 

이번에 실행할 앱에서는 channels:history(private 채널에서는 groups:history)

chat:write 권한이 읽기와 쓰기 과정에서 각각 필요하며,
Event Subscriptions 부분에서는 messages.channels(messages.groups)가 필요합니다.

 

 

2. 모듈 설치 및 앱 실행 준비

이번에 사용할 slack bolt 설치는 아래와 같이 pip 명령어로 쉽게 진행이 가능합니다.
이 과정에서 aiohttp 모듈도 필요하오니 같이 설치를 진행해보도록 하겠습니다.

$ pip install slack_bolt aiohttp

 

이제 slack app을 서버에 띄우는 과정이 필요한데요.
아래와 같은 코드를 py 파일로 작성해보도록 하겠습니다.

from slack_bolt.app.async_app import AsyncApp
from slack_bolt.adapter.socket_mode.async_handler import AsyncSocketModeHandler
import asyncio

app = AsyncApp()

async def main():
    handler = AsyncSocketModeHandler(app)
    await handler.start_async()

if __name__ == "__main__":
    asyncio.run(main())

 

위의 py 파일을 실행시켜주면 Bolt app is running!이라는 메시지가 출력되면서
비동기 방식으로 슬랙 내에서 메시지를 받을 준비가 완료됩니다.

 

반응형

 

3. 메시지 인식 과정 및 반응 구현

이제, 유저의 메시지에 '안녕' 또는 '안녕하세요'가 포함되었는지를 확인하고,
포함된 메시지가 들어온다면 맞인사를 스레드에 달아주는 코드 예제를 살펴보겠습니다.

해당하는 코드 스니펫은 다음과 같습니다.

def is_greeting(text):
    if '안녕' in text or '안녕하세요' in text:
        return True
    else:
        return False

@app.event('message')
async def message(args, say):

    user_input = args.body.get('event', {}).get('text')
    event_ts = args.event.get('ts')
    channel_id = args.event.get("channel")

    if is_greeting(user_input):
        await say(channel = channel_id, text = '안녕하세요!', thread_ts = event_ts, icon_emoji = ':hand:')
    return

앱이 설치된 채널에서 메시지가 들어오면 @app.event('message') 부분에 의하여
message 메서드가 실행되고, 비교적 복잡한 json 양식의 args를 파싱한 뒤,
'안녕하세요!'라는 내용의 댓글 스레드를 해당 채널해당 글에 추가하기 위하여
channel_id 및 event_ts를 가져와 사용했습니다.

(여기서 아이콘 이모지 종류 등의 항목도 원하는대로 설정이 가능합니다.)

 

실제 슬랙에서 위 과정에서 만든 앱을 실행한 예시 결과는 다음과 같습니다.

 

위에서는 파이썬으로 슬랙앱 구현에서의 간단한 기능 예시를 살펴보았는데요.

slack bolt에서 파이썬으로 지원하는 더 상세한 기능이 궁금하시다면

아래의 공식 document를 참고해보시면 좋습니다.

 

Slack | Bolt for Python

Slack apps installed on multiple workspaces will need to implement OAuth, then store installation information (like access tokens) securely. By providing client_id, client_secret, scopes, installation_store, and state_store when initializing App, Bolt for

slack.dev

 

다음 번에 기회가 된다면 파이썬 슬랙앱 구현과 관련된

더 다양한 예제를 다루어보도록 하겠습니다. 감사합니다.