본문 바로가기

programming/python

[ python 활용하기 #4 ] 파이썬 슬랙 봇 만들기 3탄 (날씨, 데드라인)

[ python 활용하기 #4 ] 파이썬 슬랙 봇 만들기 3탄 (날씨, 데드라인)

 

안녕하세요 심심한 코딩쟁이입니다.

 

오늘은 파이썬 활용하기 4번째 시간으로 파이썬과 무료로 제공되고 있는 API를 활용해

 

봇이 보내는 메시지에 유용한 데이터를 담아보도록 하겠습니다.

 

slack-logo
슬랙 로고


날씨 정보 알림 봇

 

openweathermap 라는 API를 사용해 날씨 정보를 받아보도록 하겠습니다.

 

https://openweathermap.org/

 

Sign In 버튼을 누른뒤 Create an Account 를 클릭해 계정을 만듭니다.

account
계정 생성

 

로그인 후 API 탭을 클릭한 뒤에 현재 날씨 데이터란에 Subscribe 버튼을 클릭합니다.

 

API
api 클릭
weather-data
현재 날씨 데이터 구독

 

저희는 간단하게 현재 날씨만 받아오고 싶기 때문에 무료 버전의 API 키를 받아봅시다.

 

get-free-key
무료 버전 api 키 받기

 

API 키 발급을 완료하신뒤에 API doc을 눌러보면 사용방법에 대해 알아볼 수 있습니다.

 

api-doc
api 사용법

 

My API keys 를 눌러 발급된 api 키를 복사해서 따로 저장해 둡니다.

 

api-key-copy
api 키 저장

 

이제 파이썬 requests와 json 라이브러리를 이용해 API로 날씨 정보를 받아봅시다.

 

api 키 활성화 될때까지 기다려야 합니다. 저는 대략 1시간 정도 기다렸습니다.

 

##############################################################################
#
# 날씨 정보 가져오기 봇
#
##############################################################################

import slack_sdk
import requests
import json

# 봇 토큰값 보안을 위해 파일을 읽어 사용
file = open('bot_token.txt','r')
bot_token = file.readline()
file.close()

# 봇 객체 생성
bot = slack_sdk.WebClient(token = bot_token)

# API 토큰값 보안을 위해 파일을 읽어 사용
file = open('api_key.txt','r')
api_Key = file.readline()
file.close()

city = "Seoul" #도시
lang = 'kr' #언어
units = 'metric' #섭씨 온도로 표기

# 지역, 언어, 온도표기법 설정 후 리퀘스트를 보냄 
api = f"https://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_Key}&lang={lang}&units={units}"

result = requests.get(api)
# 받은 정보를 JSON 형태로 변환
result = json.loads(result.text)

city = result['name']
weather = result['weather'][0]['description']
temp = result['main']['temp']
humidity = result['main']['humidity']

weather_Caster = f"\"{city}\" 날씨입니다.\n 기상 상태는 \"{weather}\" 입니다.\n 현재 온도는 {temp} ℃ 이며, 습도는 {humidity}입니다.\n 좋은 하루 보내세요."

bot.chat_postMessage(
    channel = 'C04GHKF79TQ', # 봇이 활동하는 채널의 ID 값
    text = weather_Caster) # 보낼 메시지의 내용을 입력. 이모티콘 사용 가능.

 

봇이 서울의 날씨 정보 메시지를 전달해주는 모습입니다.

 

bot-message
날씨 정보 메시지


데드라인 관리 봇

 

직장에서 업무를 볼때 데드라인을 지키는 것은 매우 중요합니다.

 

엑셀에 데드라인을 정리해두고 매일 봇에게 데드라인 관리 메시지를 받아봅시다.

 

오늘의 날짜는 2022-12-30 입니다.

 

  Todo 담당자 마감일
1 글 작성 sym1 2022-12-31
2 청소 sym2 2022-12-30
3 택배보내기 sym3 2023-01-06

 

위와 같은 내용의 엑셀 파일을 읽어 들여 슬랙 봇이 마감일에 대한 경고 메시지를 보낼 수 있도록 만들어보겠습니다.

 

##############################################################################
#
# 데드라인 경고 슬랙 봇
#
##############################################################################

import slack_sdk
from openpyxl import load_workbook
import datetime

# 봇 토큰 값 받아오기
file = open('bot_token.txt','r')
bot_token = file.readline()
file.close()

# 봇 객체 생성
bot = slack_sdk.WebClient(token = bot_token)

# 엑셀파일 오픈 data_only = True 로 설정해 수식없이 값으로만 읽기
wb = load_workbook("deadline.xlsx", data_only=True)

# 첫 번째 시트 오픈
ws = wb[wb.sheetnames[0]]

# 디폴트 시트 오픈
# ws = wb.active

deadline_list = []

# 엑셀 파일 데이터 정제
# 빈칸으로 비워둔 줄은 마감일 알람 대상에서 제외

for x in range(2, ws.max_row+1):
	list = []
	for y in range(2, 5): # 엑셀표에서 필요한 정보 만큼을 지정 Todo 담당자 마감일까지 지정
		if ws.cell(row=x, column=y).value == None: # 내용이 비어있는 줄은 건너뜀
			break
		else:
			list.append(ws.cell(row=x, column=y).value)		
	if len(list) != 0: # 비어있는 줄에 대한 내용은 리스트에 추가하지 않음
		deadline_list.append(list)

# 마감일 경고 메시지 유형
# 오늘 마감, 내일 마감, 일주일 후 마감

for x in range(len(deadline_list)):
    # 오늘 마감    
    if (deadline_list[x][2].date()-datetime.datetime.now().date()).days == 0:
        message = f'{deadline_list[x][1]}님!!\n:warning: 오늘은 \"{deadline_list[x][0]}\" 마감일입니다.' 
        bot.chat_postMessage(
            channel = 'C04GHKF79TQ', # 봇이 활동하는 채널의 ID 값
            text = message) # 보낼 메시지의 내용을 입력. 이모티콘 사용 가능.
    # 내일 마감    
    elif (deadline_list[x][2].date()-datetime.datetime.now().date()).days == 1:
        message = f'{deadline_list[x][1]}님!!\n:warning: 오늘은 \"{deadline_list[x][0]}\" 마감 하루 전 입니다.'
        bot.chat_postMessage(
            channel = 'C04GHKF79TQ',
            text = message)
    # 일주일 후 마감    
    elif (deadline_list[x][2].date()-datetime.datetime.now().date()).days == 7:
        message = f'{deadline_list[x][1]}님!!\n:warning: 오늘은 \"{deadline_list[x][0]}\" 마감 일주일 전 입니다.'
        bot.chat_postMessage(
            channel = 'C04GHKF79TQ',
            text = message)

 

코드에 대한 설명은 간단하게 주석으로 달아두었으니 참고해 주세요.

 

슬랙 봇이 남은 마감일에 따라 경고메시지를 보내주는 모습입니다.

 

bot-message
데드라인 관리 메시지

 

슬랙 봇이 DM을 보내려면 권한 설정이 따로 필요하므로 추후에 슬랙 봇에 다루게 된다면 알려드리도록 하겠습니다.


오늘은 API를 이용해 데이터를 받아오거나 엑셀 파일과 같이 직접 저장해둔 파일에서

 

필요한 데이터를 찾고 가공해 슬랙 봇의 메시지에 포함시켜보는 시간을 가졌습니다.

 

리눅스 서버를 항상 가동할 수 있는 환경이 있으시다면 크론탭을 이용해 주기적으로

 

코드를 실행시켜줄 수 있지만 그렇지 못한 상황에서 봇의 작업을 자동화시키기 위한 방법을

 

2탄에서 다루었습니다.

 

[ python 활용하기 #3 ] 파이썬 슬랙 봇 만들기 2탄 (특정 시간에 메시지 보내기)

 

궁금하신 점이나 만들어보면 좋을법한 아이디어가 있으시다면 댓글로 남겨주세요.

 

감사합니다.

 

반응형