댓글 크롤러를 만드는 중에 발생한 에러를 슬랙에 알리고 싶었다.
발생한 에러를 새롭게 만든 에러클래스로 가져와 text파일과 slack 모두에 기록하고 알리는 코드를 짜는것이 목표다.
먼저 slack bot을 만들고 이를 workspace에 설치하여 파이썬으로 chat 보내는 코드를 작성해보자!
Slack APP 만들기
1. test를 위한 슬랙 워크스페이스 만들기
2. https://api.slack.com에서 app을 from scratch로 만든다.
3. workspace는 1번에서 만든 워크스페이스로 지정하고 app 이름을 설정한다.
'create app'을 누르면 바로 만들어지고, 만든 메인 app 설정 홈으로 오게 된다.
아래 내리면 App ID와 Client ID 정보를 확인할 수 있다.
4. 우선 bot 관련하여 설정을 해주자
메인 설정 홈 화면에서 Bots를 눌러서 bot 설정을 변경한다.
아래 'Review Scopes to Add' 버튼을 눌러 scope 조정하는 설정 페이지로 넘어가서 스크롤하여 'Scope'> Add an OAuth Scope'을 눌러 생성한다.
5 . 'Scope'> Add an OAuth Scope'
'Scope'> Add an OAuth Scope'을 누르면 봇에게 permission 추가할 수 있는 목록들이 보인다.
기능에 대한 설명이 자세하니 읽어보고 자신에게 필요한 기능만 선택하자.
글쓴이는 chat write기능만 필요하기에 해당 권한만 추가하였다.
추가적으로 슬랙 API 메소드를 확인하려면 https://api.slack.com/methods 를 참고하자!
6. permission을 준 oauth를 workspace와 연결하여 인증하도록 하자
'Install to Workspace'를 누르면 허용하라는 페이지가 뜨는데 허용을 누르자
7. 다시 설정 페이지로 들어오면 OAuth Token 이 있는데 이를 복사해둔다.
이는 추후 파이썬 프로젝트에서 토큰 문자열 지정할때 필요하기 때문이다.
8. 다시 워크 스페이스로 돌아와서, 만든 bot을 채널에 추가하자.
좌측에서 앱을 클릭하여 봇을 누르면 아래 화면처럼 뜨는데, 상단의 이름을 클릭하면 뜨는 팝업창에서 '이 앱을 채널에 추가' 버튼을 눌러 채널과 연동해주자.
글쓴이는 '프로젝트' 채널에 추가하였다.
Slack chat보내는 Python코드 작성하기
slack 봇 구성은 이제 모두 완료 되었으니, 이제는 Python 코드를 짜서 봇이 참가한 채널에 chat을 보내도록 해보자.
1. 먼저 pip으로 라이브러리 설치한다.
pip install slack_sdk
2. 아래와 같이 코드를 작성한다.
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
client = WebClient.WebClient(token="자신의 API토큰")
try:
response = client.chat_postMessage(
channel="채널이름",
text="보낼 메세지"
)
print(f"Slack Notification Sent: {response['ts']}")
except SlackApiError as e:
print("Slack Notification Failed: ", e.response["error"])
코드에서 token부분에는 아까 위에서 발급받은 OAuth token을 넣어주면 되고,
chat을 보낼 채널이름과 메세지를 설정하고 실행하면 된다.
글쓴이는 slack메세지를 에러 클래스와 연동하여, 크롤링 에러 발생시 slack에 알림을 보내도록 함수로 구현하였다.
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
from config.save_path import ERROR_BEST_COMMENTS_TXT_FILE
from config.slack_credential import SLACK_API_TOKEN, CHANNEL_NAME
class CrawlerError(Exception):
def __init__(self, message, title_id=None, epi_no=None):
super().__init__(message)
self.title_id = title_id
self.epi_no = epi_no
self.log_error()
self.send_slack_notification()
def log_error(self):
with open(ERROR_BEST_COMMENTS_TXT_FILE, 'a') as f:
f.write(f"{self}\n")
def __str__(self):
return f"{self.title_id}/{self.epi_no}"
def send_slack_notification(self):
client = WebClient.WebClient(token=SLACK_API_TOKEN)
try:
response = client.chat_postMessage(
channel=CHANNEL_NAME,
text=f"CrawlerError occurred with message: {str(self)} Title ID: {self.title_id} Episode No: {self.epi_no}"
)
print(f"Slack Notification Sent: {response['ts']}")
except SlackApiError as e:
print("Slack Notification Failed: ", e.response["error"])
오류를 내는 코드를 실행하면 다음과 같이 slack 채널로 봇이 메세지를 잘 전달하는 것을 확인할 수 있다.
참고 :
https://github.com/slackapi/python-slack-sdk#sending-a-message-to-slack
https://api.slack.com/messaging/sending
https://wooiljeong.github.io/python/slack-bot/