본문 바로가기

슬랙봇(Slack bot) 만들기

회사를 다니면서 헬스케어 산업에 대한 관심이 많아졌다. 따라서 슬랙을 활용하여 관련 뉴스를 받아보는 뉴스봇을 개발해보았다.

1. 개요 : Webhook을 통해 특정 사이트의 특정 키워드를 포함하는 뉴스기사를 슬랙 App을 통해 전달
2. 사이트 : Platum - 스타트업 전문 미디어
3. 키워드 : 헬스, 케어, 금융, 핀테크 - 관심사 키워드

1. 패키지 설치

# 패키지 설치
import time
import requests
import datetime
import json
from bs4 import BeautifulSoup

2. 코드

최근 1주일 동안 위의 키워드를 포함하는 뉴스 기사를 크롤링해보기로 했다.

keyword_list =  keyword_list # 키워드 설정
n = n # 키워드당 n개
days = days # 최근 n일

크롤링하는 코드는 아래와 같다. 뉴스기사 전체를 가져오면 내용이 너무 많으니 제목과 업로드 날짜, 자세히 보기 위해 기사 URL까지 크롤링했다.

# 크롤링
title = []
url = []
date = []
for i in range(len(keyword_list)) :
    keyword = keyword_list[i]
    url_keyword = "https://platum.kr//?s=" + keyword

    soup = requests.get(url_keyword).text
    html = BeautifulSoup(soup, 'html.parser')

# 키워드당 n개 기사
    for j in range(n) : 
        title.append(html.find_all('h5')[j].find('a')['title'])
        url.append(html.find_all('h5')[j].find('a')['href'])
        date.append(html.find_all('span', {"class" : "post_info_date"})[j].find('a').text)

기사를 수집했다면 이제 해당 내용을 슬랙으로 보내야한다. 그 전에 슬랙 workspace를 생성하고 슬랙 API 사이트에서 앱을 설치한 후 뉴스를 받아보고자하는 채널에 앱을 추가한다. 그리고 Webhook을 활성화하면 아래와 같이 Webhook URL이 생성된다. 해당 내용은 길어서 생략한다.

Slack API 사이트

위에 수집한 기사에서 중복된 기사를 제거하고 최근 N일 동안의 기사만 추려낸다.

content = []
for i in range(len(title)) : 
    content.append({"title": title[i], "url":url[i], "date": date[i]})

# 중복제거
re_content = list(map(dict, set(tuple(sorted(d.items())) for d in content))) 

# 최근 N일 기준
for i in range(len(re_content)) :
    re_content[i]["re_date"] = re_content[i]["date"][10:]
    re_content[i]["re_date"] = datetime.datetime.strptime(re_content[i]["re_date"],'%Y/%m/%d')

content = re_content
now = datetime.datetime.now()
period = now - datetime.timedelta(days=days)

num = []
for i in range(len(content)) : 
    if period < content[i]["re_date"] :
        num.append(i)

슬랙이 마크다운을 지원하기 때문에 이를 활용하여 가독성있게 메시지를 정리한다. 그리고 아까 활성화해둔 Webhook URL을 통해 (NewsBot이 초대된)채널에 해당 봇을 통해 메시지를 보내도록 한다.

# html 마크다운 설정
temp = []
for i in num : 
    if i == num[-1] : 
        temp.append("> " + content[i]['title'] + "\n> " + content[i]['url'] + " \n> " + content[i]['date'])
    else : 
        temp.append("> " + content[i]['title'] + "\n> " + content[i]['url'] + " \n> " + content[i]['date'] + "\n\n")
temp
content = "".join(temp)

# 슬랙 전송
payload= {"text": content }
requests.post(webhook_url, data=json.dumps(payload), headers={'Content-Type':'application/json'})

보내고난 후 모습

3. 마무리

슬랙으로 크롤링한 결과를 보내는 봇을 만들긴 했으나 이를 주기적으로 작동하게 만들어야 하는 과정이 남아있다. 이를 위해선 클라우드 서버에서 매번 해당 봇을 실행하도록 해야하는데 GCP,AWS는 무료 크레딧을 어느정도 지급하니 그렇게 해도된다. 회사 다니면서 GCP를 활용했으나 크레딧을 소진하여 다른 서비스를 사용해보고자 한다.

'' 카테고리의 다른 글

Toss PO SESSION I Retention & Activation  (0) 2022.06.26
Toss PO SESSION I Carrying Capacity 2탄  (0) 2022.06.26
Toss PO SESSION I Carrying Capacity 1탄  (0) 2022.06.12