지난 글에서 만들었던 파이썬 프로젝트에 대해 간단히 요약해 봤다. 이 글에선 복습도 할 겸 슬랙봇 생성, 파이썬으로 명령어를 입력받고 다시 이미지를 전송하는 것까지 해보겠다.
아래 순서에 따라 진행했다. Request URL을 받아주기 위해 ngrok, flask를 사용했다.
https://api.slack.com/
위 링크로 이동
Your apps
새로운 앱 만들기
슬랙api 기능으로 만들기 위해 스크래치로
이름과 테스트할 워크스페이스 설정
슬랙봇 권한 범위 설정을 위해 OAuth & Permissions로 이동
메세지와 파일 전송에 필요한 권한 설정
새로운 명령어 만들기
빨간 동그라미 친 두 부분은 필수다. Request URL은 이 명령어 정보를 전송해서 받아주는 곳인데, 나는 로컬 서버를 공개 서버로 공유해주는 ngrok 프로그램을 사용했다.
ngrok을 먼저 설치하자.
설치 후 ngrok 터미널에서 아래 명령어를 입력하면 위 화면이 나온다.
ngrok http 5000
5000은 본인이 여는 로컬 서버의 포트로 수정하면 된다.
빨간 줄 친 Forwarding이 Request URL이 된다.
워크스페이스에 앱 설치
메세지를 받을 채널에 슬랙봇 추가 (@'name' 으로 언급해주면 추가할 수 있다)
이 상태에서 명령어를 치려고 하면 자동완성 탭이 나올 것이다. 그러면 잘 따라온 것이다.
지금은 명령어를 입력하면 위 사진처럼 502 Bad Gateway가 나오게 되는데, 로컬 서버를 열어두지 않아서 오류가 발생한 것이지 데이터를 보내는 것 과정까진 완료한 셈.
이제 아래의 코드를 참고, 각자의 로컬 서버를 열어서 본인만의 슬랙봇을 만들면 되겠다.
나는 flask를 통해 로컬 서버를 만들었다.
from flask import Flask, request
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
import threading
app = Flask(__name__) # 메인 스레드
# 슬랙 슬래시 커맨드 수신
@app.route('/', methods=['POST'])
def slack_command():
# 슬랙으로부터 전달된 데이터 처리
data = request.form
text = data.get('text') # /wc [text]
channel_id = data.get('channel_id')
img_path = '/~~/~~.png'
# 슬랙 봇 토큰 설정
slack_token = 'xoxb-00000000000000000000000000000000000000'
client = WebClient(token=slack_token)
try:
# 슬랙봇으로 이미지 전송
with open(img_path, 'rb') as file:
response = client.files_upload_v2(
channels=channel_id,
file=file,
title='title',
initial_comment=f'*{text}*'
)
return response
except SlackApiError as e:
return f"Fail to send a message: {e.response['error']}"
except Exception as e:
return f"Error Occurred!!: {e}"
return "This str will be shown on Slack"