매일 입퇴실 체크를 해야 하는데 가끔 아차하는 순간들이 많다 ... ^.^
핸드폰 배경화면을 하기는 했는데.. 와서 핸드폰을 잘 안 보다 보니깐 자꾸 까먹는다 ..
그래서 어차피 노트북 세팅하고 가장 먼저 하는게 슬랙 켜두는 거니깐 슬랙 알림봇을 만들기로 결정 ! !
그리고 겸사겸사 오랜만에 개발도 하고 심심하니깐 도파민 채우고자 재미있는 거 하기 ㅎㅎ
그럼 시작 ~
일단 2개를 생각해봤다
다이렉트 메시지
나는 출근을 아침 7시 30분까지 하기로 마음 먹었어서 20분~40분 사이에는 무조건 출근 완료해있다
그러니깐 그 사이에 활동이 없다가 활동 중으로 바뀌면 그때 다이렉트 메시지를 보내주거나 20분 ~ 40분에 알림을 보내두는 것
채널 알림
다이렉트 메시지는 알림을 받기는 하지만 내가 잘 했는지 더블 체크해두고 기록하기는 좀 불편함이 있어서 채널 알림으로 오고 채널 페이지를 하나 만들어서 매일 체크할 수 있도록..
이렇게 2개를 생각해봤는데 나는 정리해두는 걸 좋아해서 2번을 먼저 구현해보기로 했다 !!

먼저 새 채널을 하나 만들자!
채널 추가 버튼을 눌러서 채널명을 입력하고 공개-비공개를 정하면 채널이 생성된다!!

아래 사이트에 들어가면 슬랙봇을 만들 수 있다

create an app을 누르고 From scratch를 누른다
이번에는 앱 기본 설정을 해보자

오른쪽 항목에서 App Home을 찾아 클릭하자
그 다음 App Display Name을 눌러 기본 이름을 설정하자


Display name은 보여지는 이름이다
둘 다 나중에 수정 가능하니 대충 적자

App Name에는 원하는 알림봇 이름을 적고 Pick a workspace to develop your app in은 아까 만든 채널이 속한 워크스페이스를 선택한다
물론 나중에 충분히 수정 가능 !!!

완료를 누르면 이렇게 내 앱이 생긴다 ㅎㅎ
이번에는 앱을 조금 더 예쁘게 꾸며보자!

왼쪽 Basic Information 항목에서 꾸며주자!
나는 아이콘은 flaticon에서 가져왔다
슬랙 워크스페이스에 알림을 보내기 위해서는 범위 설정을 해야 한다
오른쪽 항목에서 OAuth & Permissions를 선택하자

그리고 쭉 내리다보면 Scopes가 있는데 이 부분을 수정하자

Add an OAuth Scope를 누르면 선택을 할 수 있는데 그 중에서 chat:write를 누르자

채널에 보내기 위해서는 Webhooks을 설정해야 한다

오른쪽 항목에서 Incoming Webhooks를 클릭하자

그리고 Webhooks을 활성화하자

그리고 밑에 Add New Webhooks을 누르자

그러면 어디에액세스할지 선택해야 하는데 이건 아까 우리가 만든 채널을 선택하면 된다
허용까지 누르자
그러면 이렇게 권한이 생긴 것을 볼 수 있다
앱을 누르면 설치할 수 있다고 나오고
이거 누르고 어디에 설치할지 나오는데 만들어둔 채널을 선택하자

그럼 이렇게 만들어진 것을 확인할 수 있다 !!

만약 수정사항이 있다면 Install App에서 Reinstall to <워크스페이스>를 클릭하면 된다
이제 템플릿에 맞게 시간마다 알림을 보낼 수 있도록 코드를 작성해보자
일단 검색해보았을 때 실행 구조가 무조건 서버에서 코드가 실행되야 하는 것 같았다
아닐 수도 있음 ㅜㅜ
그래서 코드를 어딘가에 배포해두고 주기적으로 실행해서 알림을 보내는 느낌
물론 잠깐 찾아본거라 아닐수도 있음 ..ㅎ
근데 일단 아무것도모르는 상태라 찾아본 거 위주로 구현해볼 예정 !
그래서 뭘 할거냐면
리눅스로 세팅해둔 맥미니에서 알림을 보내는 코드를 작성하고 crontab을 통해 하루 2번 정해진 시간에 실행 시킬 예정
일단 이렇게 구현해두고 더 찾아보고 좋은 방법이 있다면 나중에 변경할 예정 !!!
물론 맥미니를 맨날 켜두고 돌리고는 있지만 혹시 애가 죽을 수 있기 때문에 .. ㅎ
며칠 전에 왜인지 모르겠는데 죽어있어서 노트북에 실습 했다 ...
뭐 이건 걍 여담이니깐 대충 넘어가고 코드를 얼른 작성해보자 !
일단 찾아보니깐 누군가가 쉽게 할 수 있도록 라이브러리로 만들어 둔것 같다
그래서 그걸 활용해보려고 한다

바로 slack_sdk!
진짜 오픈소스 어케 만드는 거징
링크는 아래
간단하게 pip 설치가 가능한거 같아서 얼른 설치해보자 ㅎㅎ

일단 slack_bot이라는 디렉터리를 하나 만들고 냅다 설치하기 ㅎ
가상환경으로 분리해서 써야 하지만 . .. . . .
이러면 안 되지만 ..

환경변수로 사용할 건 두 개 정도
SLACK_BOT_TOKEN과 CHANNEL_NAME
각각 접근 토큰과 채널 이름이다


import os from slack_sdk import WebClient from slack_sdk.errors import SlackApiError from dotenv import load_dotenv load_dotenv() SLACK_BOT_TOKEN = os.getenv("SLACK_BOT_TOKEN") CHANNEL_NAME = os.getenv("CHANNEL_NAME") client = WebClient(token=os.environ['SLACK_BOT_TOKEN']) try: response = client.chat_postMessage(channel=f'#{CHANNEL_NAME}', text="Hello world!") assert response["message"]["text"] == "Hello world!" except SlackApiError as e: # You will get a SlackApiError if "ok" is False assert e.response["ok"] is False assert e.response["error"] # str like 'invalid_auth', 'channel_not_found' print(f"Got an error: {e.response['error']}") # Also receive a corresponding status_code assert isinstance(e.response.status_code, int) print(f"Received a response status_code: {e.response.status_code}")
위 코드는 깃허브에 있는 코드에 환경변수 부분만 살짝 추가한 코드!
SLACK_BOT_TOKEN은 .env 파일에서 가져와서 넣고
CHANNEL_NAME도 가져온다
근데 CHANNEL_NAME은 #를 붙여서 보내야 하기 때문에 매칭해서 넣어준다
try - except로 오류도 확인해보는 코드..
text는 내가 보낼 글인데 일단 테스트로 Hello world!를 보내보았다

코드 실패하면 이렇게 나오고

성공하면 이렇게!
나중에 돌리면 저 부분은 삭제할 예정

여러 번 테스트했더니 약간 광기 같은데 .. 🤔

이렇게 . 도 떠있으니 이제 까먹지는 않을 듯 !!!
테스트는 끝났으니 이제 커스텀 해야지!!
일단 나는 진짜 간단하게 만드는 거라 제일 쉬운 방법으로 입실 퇴실 각각 만들어서 따로 crontab에 등록하려고 한다

커스텀 중 ...
뭐가 좋을지 고민하다 그냥 간단하게 . .

일단 세팅 완료!!

일단 리눅스 세팅을 할 때 시간타임을 서울로 해두긴했는데 혹시 모르니 시간 확인 먼저 ㅎㅎ
이번에는 crontab을 등록할건데 간단하게 crontab에 대해 알아보자
간단하게 정리하면, 리눅스에는 cron이라는 스케줄러가 있는데 이를 관리하는게 crontab이다
자세하게 보면?
리눅스에서 주기적으로 작업(스케줄링) 을 실행하는 데몬(백그라운드 프로세스)
ex) 매일 자정에 로그 백업, 매주 서버 리부트, 특정 시간에 스크립트 실행 등
사용자가 cron 작업을 등록/관리할 수 있는 명령어
각 사용자별로 개별 crontab 파일이 존재
crontab -e # 현재 사용자 crontab 편집 crontab -l # 현재 사용자 crontab 목록 확인 crontab -r # 현재 사용자 crontab 삭제
분 시 일 월 요일 실행할 명령 * * * * * 실행내용
- 분(minute): 0–59
- 시(hour): 0–23
- 일(day): 1–31
- 월(month): 1–12
- 요일(week): 0–7 (0 또는 7 = 일요일)
crontab은 꼭 이 순서대로 작성하니깐 잘 기억해두자
*: 모든 값- , : 여러 값 지정 (예: 1,15)
-: 범위 지정 (예: 1-5)- / : 주기 지정 (예: */10 = 10단위)
이렇게 보면 헷갈릴 수 있으니 예시를 보자
# 매일 새벽 3시 실행 0 3 * * * /home/user/backup.sh # 매주 월요일 9시 실행 0 9 * * 1 /home/user/script.sh # 매 10분마다 실행 */10 * * * * /home/user/check.sh # 매일 0시, 12시에 실행 0 0,12 * * * /home/user/run.sh
일단 입실부터 작성해보자
입실은 7시 20분에 실행되도록 하고 싶으니
20 7 * * 1-5 /usr/bin/python3 /home/kk21/slack_bot/slack_bot_open.py
이렇게 작성했다
이걸 이제 crontab에 저장해야 하자
먼저 파일을 열건데 nano가 익숙하지 않아서 vi로 열기 ㅎㅎ
EDITOR=vi crontab -e
그리고 위 문장을 마지막에 추가하고 저장하자!
입력은 i
저장은 :wq

그러고 확인하면 이렇게 등록이 잘 되어 있다!
이번에는 퇴실을 등록하자
50 17 * * 1-5 /usr/bin/python3 /home/kk21/slack_bot/slack_bot_close.py >> /home/kk21/slack_bot/cron.log 2>&1
다시 확인해보면 등록 완료!

일단 이렇게 잘 등록은 했는데 cron이 잘 실행되는지 모르겠으니 테스트 크론도 등록해보자
쉬는 시간을 활용해서 ..
지금 시간이 10시 1분이라 10시 2분으로 등록해보았는데 잘 된다 ^.^

사실 슬랙봇 만들어보고 싶다는 생각을 하긴 했는데 막상 못하고 있었다 ㅎ
근데 그래도 각잡고 하니 재미있고 뿌듯 ...
일단은 급하게 써야 하니깐 이렇게만 구현해두고 끝내고 어케 디벨롭할지 조금 더 고민해봐야겠다 !!!
고민할 거
1. 코드 실행
서버에서 이렇게 돌리는 게 맞는지(다른 방법 없는지)2. 기능 확장
지금은 단순하게 알림 두 번인데 다른 좋은 건 없을지
체크 하는 페이지에서 체크가 안 되어 있으면 할 때까지 알림을 보낸다거나..3. 앱 배포
슬랙 앱 마켓에 배포도 가능할지?
그럼 끝!