python으로 slack 채널에 메시지 push와 파일 업로드 하기

Slack App 만들기

https://api.slack.com/

Slack api 사이트에 접속한다. 이 사이트에 접속하면 바로 ‘Create a custom app’ 메뉴를 볼 수 있다. 해당 버튼을 클릭한다.

‘Create a custom app’ 버튼을 클릭하면 위와 같은 팝업이 보인다. ‘From scratch’를 클릭한다.

App 이름과 이 앱이 적용될 workspace를 설정한다.

앱이 생성됐다. 생성된 앱의 권한을 설정한다. 왼쪽 메뉴의 ‘OAuth & Permissions’를 클릭한다.

‘OAuth & Permissions’ 화면에서 스크롤을 내리면 Scopes라는 항목이 있다. 이 항목에서 Bot Token Scopes라는 걸 설정한다. 단순히 메시지만 전송하는 경우 channels:read와 chat:write 권한만 설정하면 된다.

메시지 전송에 관한 권한과 테스트용 코드는 아래 문서에서 확인 가능하다.

https://api.slack.com/messaging/sending

권한 설정이 완료되면 ‘Install App’ 메뉴에서 ‘Install to Workspace’ 버튼을 클릭한다.

App을 Workspace에 적용할 것인지 묻는 내용이 보인다. ‘허용’을 클릭한다.

App이 Workspace에 적용되고 OAuth Token을 받았다. 해당 Token 값을 복사해두자.

Slack에서 앞서 만든 App을 적용하기 위핸 채널을 선택한다. 본 예제에서는 #개발 채널을 사용하겠다. #개발 채널의 설정 메뉴에 들어간다. (채널 이름을 선택하면 설정창이 보인다.)

‘앱 추가’ 버튼을 클릭한다.

만들었던 TestApp을 선택하여 추가한다.

이제 Python에서 Message를 Slack으로 보내보자. 아래와 같은 소스코드를 작성하여 실행한다. 해당 코드는 https://api.slack.com/messaging/sending 에서도 예제로 제공하니 문서를 확인하여 적용한다.

import logging
import os
# Import WebClient from Python SDK (github.com/slackapi/python-slack-sdk)
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError

# WebClient insantiates a client that can call API methods
# When using Bolt, you can use either `app.client` or the `client` passed to listeners.
SLACK_BOT_TOKEN='Bot User OAuth Token'
client = WebClient(token=SLACK_BOT_TOKEN)
logger = logging.getLogger(__name__)
# ID of channel you want to post message to
channel_id = "개발"

try:
    # Call the conversations.list method using the WebClient
    result = client.chat_postMessage(
        channel=channel_id,
        text="Hello world!"
        # You could also use a blocks[] array to send richer content
    )
    # Print result, which includes information about the message (like TS)
    print(result)

except SlackApiError as e:
    print(f"Error: {e}")
    

python 스크립트가 정상적으로 실행되면 위와 같이 메시지가 push 된걸 확인할 수 있다.

Slack으로 파일 업로드 하기

파일을 전송하기 위해 Scopes에서 파일 전송 권한인 files:write를 설정한다.

권한 설정 후 다음과 같은 코드로 파일을 전송할 수 있다. (파일 업로드 권한 확인과 예제 코드 확인은 다음 링크에서 참고할 수 있다. https://api.slack.com/methods/files.upload)

import logging
import os
# Import WebClient from Python SDK (github.com/slackapi/python-slack-sdk)
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError

# 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=SLACK_BOT_TOKEN)
logger = logging.getLogger(__name__)
# The name of the file you're going to upload
file_name = "./test_img.jpg"
# ID of channel that you want to upload file to
channel_id = "개발"

try:
    # Call the files.upload method using the WebClient
    # Uploading files requires the `files:write` scope
    result = client.files_upload(
        channels=channel_id,
        initial_comment="Here's my file :smile:",
        file=file_name,
    )
    # Log the result
    logger.info(result)

except SlackApiError as e:
    logger.error("Error uploading file: {}".format(e))

Leave a Reply