달나라 노트

Python Slack API : slack_sdk library와 Slack Token을 사용해서 slack bot으로 message 보내기 (WebClient, Slack API, token) 본문

Python/Python ETC

Python Slack API : slack_sdk library와 Slack Token을 사용해서 slack bot으로 message 보내기 (WebClient, Slack API, token)

CosmosProject 2021. 9. 30. 22:40
728x90
반응형

 

 

 

 

 

Slack API 등록, Slack Webhook 등록, Slack App 생성, Slack App 설치 Link

slack_sdk library와 webhook URL을 사용해서 slack bot으로 message 보내기 Link

 

 

 

 

 

Python코드로 Slack app을 조종해봅시다.

 

 

 

pip install slack_sdk

slack_sdk library를 설치해줍시다.

 

 

 

 

 

 

 

여기서 한 가지 중요한건 Python API를 통해 slack에 어떤 요청을 주고받는 대부분의 상황에선 인증을 위한 token이 필요합니다.

Token은 생성한 Slack app의 Web Settings page에서 OAuth & Permissions 메뉴의 Bot User OAuth Token 부분에서 확인할 수 있습니다.

이건 항상 필요하므로 환경변수로 지정해두는 것이 좋습니다.

(여기서는 일단 복사해서 변수로 지정하여 사용하도록 하겠습니다.)

 

 

 

 

 

 

또한 Settings 페이지에서 아래로 내려보면 Scopes라는 부분이 있습니다.

여기서는 Slack bot에게 어떤 권한을 줄지를 선택할 수 있습니다.

 

incoming-webhook은 기본으로 있었고 나머지 3개를 추가해주었습니다.

 

권한 추가 후에는 Slack app을 reinstall하라는 메세지가 화면 상단에 나올텐데 reinstall 버튼을 누르고 Salck bot이 있기를 원하는 채널을 선택하면 해당 채널에 다시 Slack bot이 초대되며 재설치됩니다.

 

 

 

 

 

 

 


 

 

 

 

 

slack app 기초 셋팅이 끝났으니 이제 Python으로 어떻게 다룰 수 있는지 알아봅시다.

 

from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError

slack_token = 'xxxx-1a2b3c4d5e6f7g8h9i'

client = WebClient(token=slack_token)

try:
    response = client.chat_postMessage(channel='new_channel',
                                       text='Test message from python slack api')
except SlackApiError as e:
    print('Error: {}'.format(e.response['error']))

그리고 위처럼 코드를 적어주고 실행합시다.

 

chat_postMessage = 특정 채널에 메세지를 전송하는 method입니다.

channel = chat_postMessage에서 메세지를 전송할 channel 이름을 입력하는 option입니다.

text = chat_postMessage에서 전송할 메세지를 입력하는 부분입니다.

 

 

 

그리고나서 다시 slack app으로 가보면 아래 이미지처럼 #new_channel에 저의 slack app이 위 코드의 text에 적힌 메세지를 보낸 것을 알 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

이제 슬랙에 파일을 업로드해봅시다.

 

files_upload method를 사용할건데, 이것을 사용하여 파일을 업로드하기 위해서는 slack bot에게 권한이 주어져야 합니다.

Scope Settings 페이지에서 files:write 권한을 추가해줘야한다는 것 참고해주시면 되겠습니다.

 

 

 

 

 

 

from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError

slack_token = 'xxxx-1a2b3c4d5e6f7g8h9i'

client = WebClient(token=slack_token)

try:
    response_msg = client.chat_postMessage(channel='apitest',
                                           text='Test message from python slack api')

    response_xlsx_1 = client.files_upload(channels='apitest',
                                          file='item_sample_1.xlsx',
                                          filename='item_sample_1_share.xlsx',
                                          filetype='xlsx')

    response_xlsx_2 = client.files_upload(channels='apitest',
                                          file='item_sample_2.csv',
                                          filename='item_sample_2_share.csv',
                                          filetype='csv')

    print(response_msg['ok'])
    print(response_xlsx_1['ok'])
    print(response_xlsx_2['ok'])
except SlackApiError as e:
    print('Error: {}'.format(e.response['error']))

위 코드는 file을 slack에 업로드하는 코드입니다.

파일 업로드를 위해선 files_upload method를 사용하면 됩니다.

 

 

files_upload method의 옵션으로는 아래와 같습니다.

(참고 링크 = https://api.slack.com/methods/files.upload)

channels = file을 업로드할 slack channel 이름

 

file = upload할 file의 경로를 적어주면 됩니다. 저는 python 파일과 동일한 directory에 xlsx 파일이 있으므로 upload할 xlsx파일의 이름만 적어줬습니다.

 

filename = slack에서 upload된 파일이 보여질 때의 이름을 정합니다.

 

filetype = upload한 파일의 확장자를 적어주면 됩니다.

 

 

 

 

 

그러면 위처럼 메세지도 전송되고 파일도 업로드된걸 알 수 있습니다.

 

근데 한가지 이상한 점이 있죠.

저는 아래 코드에서처럼 filename item_sample_1_share.xlsx, item_sample_2_share.csv 등으로 적었는데 slack의 파일이름은 약간 달라보입니다.

 

...
    response_xlsx_1 = client.files_upload(channels='apitest',
                                          file='item_sample_1.xlsx',
                                          filename='item_sample_1_share.xlsx',
                                          filetype='xlsx')

    response_xlsx_2 = client.files_upload(channels='apitest',
                                          file='item_sample_2.csv',
                                          filename='item_sample_2_share.csv',
                                          filetype='csv')
...

 

근데 걱정할 필요 없습니다.

보이기만 저렇게 보일 뿐 실제 파일을 다운로드받아보면 정상적으로 제가 지정한 filename대로 보이기 때문이죠.

 

 

 

 

 

 

 

 

Slack 전송할 text를 markdown형태로 작성하면 텍스트에 여러 format을 적용할 수 있습니다.

from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError

slack_token = 'xxxx-1a2b3c4d5e6f7g8h9i'

client = WebClient(token=slack_token)


mrkdwn_text = '''
This is test message.
> Block quote

*Bold text*

```
code block - line 1
code block - line 2\ncode block - line 3
```

`highlight`

_italicize_

~Strikethrough~

<https://www.google.com|This is link to google.com>
'''


try:
    response = client.chat_postMessage(channel='new_channel',
                                       text=mrkdwn_text)
    print(response.status_code)
except SlackApiError as e:
    print('Error: {}'.format(e.response['error']))

chat_postMessage method의 text로서 markdown으로 작성된 text를 전달하였고,

이를 위해 mrkdown_text라는 변수에 슬랙에 전송할 markdown 형태로 적힌 text를 적어놓은 것을 볼 수 있습니다.

 

>, |, **, ~~ 등을 이용하면 텍스트를 bold체로 만든다던지 등의 여러 효과가 가능합니다.

 

<link_url|showing_text>를 이용하면 링크도 걸 수 있죠.

 

Slack markdown formatting에 대한 자세한 내용은 아래 링크를 참고하면 됩니다.

https://slack.com/intl/ko-kr/help/articles/202288908-%EB%A9%94%EC%8B%9C%EC%A7%80-%EC%84%9C%EC%8B%9D-%EC%A7%80%EC%A0%95

 

 

그리고 위 코드의 결과를 보면 아래 이미지와 같습니다.

원하는대로 new_channel에 작성한 텍스트가 전송되었고 markdown formatting이 적용된 것이 보여집니다.

 

그냥 텍스트만 보낼 때 보다 위같은 format들을 이용하면 더 가독성 좋은 메세지를 만들 수 있습니다.

 

 

 

 

 

...
    print(response.body)
...

위 부분은 slack_sdk를 이용하여 메세지를 보냈을 때 그 결과에 대한 상태값입니다.

필수적인 부분은 아니므로 무시해도 됩니다.

 

 

 

 

 

 

 

 

 

Slack API 등록, Slack Webhook 등록, Slack App 생성, Slack App 설치 Link

slack_sdk library와 webhook URL을 사용해서 slack bot으로 message 보내기 Link

 

 

 

 

 

 

 

참고 문서

slackclient library = https://slack.dev/python-slackclient/

slack_sdk library = https://pypi.org/project/slack-sdk/s

slack_sdk library example = https://ichi.pro/ko/slackbot-eul-mandeul-eo-bobsida-45570799171009

 

 

 

 

 

 

 

 

 

728x90
반응형
Comments