ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 척추를 건강하게! 30분마다 알람을 보내는 slack 척추 알람봇 만들기
    생각 2023. 4. 16. 21:11

    매일 매일 거북목 자세로 일을 하다보니 목이 너무 아프기 시작했다.

    목이 아프면 두통이 오게 되는데, 두통에 너무 너무 민감한 나로서는 예민한 사항이다....

     

    그래서 슬랙으로 30분마다 척추를 펴게 해 주는 척추봇을 만들어 보았다! 

    처음엔 너무 쉬웠다고 적었는데 하루종일 트러블슈팅을 하다 보니 너무 힘들었다 ㅋㅋㅋ

     그래도 아무나 할수있겠지만 기록을 남겨본다. ^_^!

     


    1.슬랙에서 봇 생성하기

    여기서 앱을 생성!
    세팅 란에 들어가서 봇을 활성화 시켜준다.

    1. 슬랙 워크스페이스에서 봇을 생성하자. Slack API 페이지에서 "Create New App"을 선택하고, 앱의 이름과 워크스페이스를 선택한 후 "Create App"을 클릭한다.

     

    2. 앱을 생성한 후, "Bot" 기능을 활성화하자. 앱 설정 페이지에서 "Bot"을 선택하고, "Add a Bot User"을 클릭하여 봇을 추가하면 된다.

     

    3. "OAuth & Permissions" 탭에서 "Bot Token Scopes"를 설정하자. 이때, chat:write 권한을 부여하여 봇이 메시지를 보낼 수 있도록 설정한다.

     

    4. 봇 토큰을 저장! 봇 토큰은 나중에 파이썬 코드에서 사용되기 때문에 저장시켜 놓자.

     

    2. 파이썬에서 코드 실행 

    import datetime
    import schedule
    import time
    from slack_sdk import WebClient
    from slack_sdk.errors import SlackApiError
    
    SLACK_BOT_TOKEN = "비밀!"
    CHANNEL_ID = "비밀!"
    MESSAGE = "30분이 지났습니다. 목과 허리를 곧게 펴고 스트레칭하세요."
    
    def send_message():
        client = WebClient(token=SLACK_BOT_TOKEN)
        try:
            response = client.chat_postMessage(channel=CHANNEL_ID, text=MESSAGE)
            print("Message sent: ", response["ts"])
        except SlackApiError as e:
            print("Error sending message: {}".format(e))
    
    def job():
        dayOfWeek = datetime.datetime.today().weekday()
        if dayOfWeek < 5: # 월요일부터 금요일까지만 작동
            now = datetime.datetime.now()
            start_time = now.replace(hour=10, minute=0, second=0, microsecond=0)
            end_time = now.replace(hour=21, minute=0, second=0, microsecond=0)
            if start_time <= now <= end_time:
                schedule.every(30).minutes.do(send_message)
    
    while True:
        schedule.run_pending()
        time.sleep(1)

    다음을 실행하면 된다.

     

    하지만!!

     

    나는 켜자마자 자동으로 실행되는걸 원하지 매일매일 이걸 실행하는건 너무 귀찮다.

    그러므로, 스케줄러를 이용해 경로를 저장시키고 컴퓨터가 켜질 때마다 실행시키도록 하자. 

     

    3. 스케줄러에 저장 

    윈도우 탐색기에서 "작업 스케줄러"를 검색하여 실행하면 된다.
    "동작" 탭에서 "작업 만들기"를 선택하고, "일반" 탭에서 "이름"과 "설명"을 입력한다.


    "트리거" 탭에서 "새로 만들기"를 선택하고, 시작 시간과 주기를 설정,
    "동작" 탭에서 "새로 만들기"를 선택하고, 프로그램 경로와 옵션을 입력하자.

    나머지는 클릭해서 보도록 하고,확인을 눌러 작업을 저장하면 된다.

     

    나는 컴퓨터가 켜질 때마다로 설정했다. 

     

    이때, 환경 변수에 파이썬의 경로와 패키지의 경로또한 지정해 준다. 

     

    끝이다!

     


    지금은 밤이고 컴퓨터가 새로 켜지지 않았으므로, 아직은 아무 소식이 없다.

    알람이 성공적으로 뜬다면 다시 와서 업데이트하겠음!! 


    Trouble 1. 코드를 실행해도 메세지가 오지 않는다.

    이 문제는 다음과 같이 해결했다.

     

    1. redirect URL을 추가한다. 이는 슬랙 api 홈페이지의 permission & outh 페이지에서 추가할 수 있다.

    2. 채팅방에 앱을 추가한다.

     

    이렇게 하니 메세지가 오기 시작했다. 문제는....

     

    Trouble 2. 메세지가 0.5초마다 한번씩 오고 있다 ㅠㅠ 

    어떻게 시간을 바꾸든, sleep시간을 바꾸든 관계없이 계속 메세지가 쏟아진다. 

    이 문제는 정말 모르겠어서 chatgpt와 함께 해결해 보았다.

    똑똑하다!

    즉 함수를 만들었으면 끝내야 하는데, while True 에 따라서 끊임없이 실행되고 있었던 것.

    return 을 아래와 같이 추가하고, 코드를 약간 수정하였다.

    코드를 수정한 이유는, return 으로 실행 자체를 끝내기 위해서 send_message가 메세지를 보내는 역할 뿐만 아니라 요일, 시간 제한을 하는 기능까지 가지게 해서 return 하나로 끝나게 하려던 것이었다.

     

    import datetime
    import schedule
    import time
    from slack_sdk import WebClient
    from slack_sdk.errors import SlackApiError
    
    SLACK_BOT_TOKEN = "비밀"
    CHANNEL_ID = "비밀"
    MESSAGE = "30분이 지났습니다. 목과 허리를 곧게 펴고 스트레칭하세요."
    
    def send_message():
        client = WebClient(token=SLACK_BOT_TOKEN)
        try:
            dayOfWeek = datetime.datetime.today().weekday()
            if dayOfWeek < 5: # 월요일부터 금요일까지만 작동
                now = datetime.datetime.now()
                start_time = now.replace(hour=10, minute=0, second=0, microsecond=0)
                end_time = now.replace(hour=21, minute=0, second=0, microsecond=0)
                if start_time <= now <= end_time:
                    response = client.chat_postMessage(channel=CHANNEL_ID, text=MESSAGE)
                    print("Message sent: ", response["ts"])
                    return 
        except SlackApiError as e:
            print("Error sending message: {}".format(e))
    
    schedule.every(30).minutes.do(send_message)
    
    while True:
        schedule.run_pending()
        time.sleep(1)

    결과는 드디어!

    눈물....

    위에는 30분이라 해놨지만 일단 검증을 위해 1분으로 해 보았는데, 1분에 한번씩 오는 것을 확인할 수 있었다.

     

    이제 내가 귀찮게 코드를 동작시키지 않아도 백그라운드 프로그램으로 잘 동작하는지 여부를 보기만 하면 된다....

    불안하다. 안 될것 같다.

     

     


    Trouble 3.  컴퓨터를 켜도 메세지가 오지 않는다.

    하... 역시나 오지 않았다. 작업 스케줄러에서 동작을 지정하는 방식에 문제가 있었던 것이 분명하다. 

     

    하루종일 구글링을 했고, 다음을 참조하였다.

    https://yeko90.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B4%88-%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD-%ED%8C%8C%EC%9D%BC-%EC%A3%BC%EA%B8%B0%EC%A0%81-%EC%8B%A4%ED%96%89-%EC%9C%88%EB%8F%84%EC%9A%B0-%EC%9E%91%EC%97%85-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%9F%AC

     

    [파이썬 기초] 가상환경 파일 주기적 실행(with 윈도우 작업 스케줄러)

    이전 포스팅에서 다루었던 방식은 raw한 파일을 주기적으로 실행시키는 방법 이었다면, 이번 포스팅에서는 가상환경 속에서 파일을 주기적으로 실행시키는 방법에 대해 알아보겠습니다. 이해를

    yeko90.tistory.com

    핵심은 bat 파일을 동작 란에 넣는 것이다. 

     

    체크한 부분에 bat 파일을 넣는다

    bat 파일의 내용은 다음과 같이 지정한다. 

    마지막에 -a ='USDJPY' 를 한 이유는, 경로에 공백이 있었기 때문에 지정하였다.

     

    아! 그리고 경로가 한글이어서 깨지는 문제가 있었기 때문에, bat 파일을 ansi로 인코딩해준다.

     

    그러고 나면, 정상적으로 동작이 되는 것을 확인할 수 있다 ㅠㅠ 기다렸어 척추봇!!!💗

     

     

Designed by Tistory.