Today Sangmin Learned
article thumbnail
728x90

오늘의 코로나 Slackbot에 이미지도 함께 추가하도록 개선했다.

노력의 흔적들,,,

우선, 어떻게 특정 사이트에서 이미지를 캡쳐해올까부터 고민했다. 구글링을 한 결과 pyautogui 를 사용해서 특정 페이지에 접근해 시작 픽셀과 x축과 y축 얼마만큼의 픽셀을 캡쳐할지를 정해주면 해당 부분만 캡쳐할 수 있었다. pyautogui는 chromedriver를 필요로 해서, 따로 깔아줘야 한다. webdriver를 통해 파이썬이 해당 페이지에 들어가게끔 하는 것인데, 이 webdriver는 Selenium을 필요로 하기 때문에

from selenium import webdriver
import pyautogui

를 해줘야 한다. 아, 그리고 import webdriver를 하는 과정에서 삽질을 좀 했는데, No Module named 'selenium'이 계속 떠서 나를 힘들게 했다. VSCode에서는 잘 안됐는데 PyCharm에서는 잘 돼서 뭐지.. 이상하다.. 싶었는데, 알고보니 가상환경을 켜주지 않았기 때문이었다. 그래서, 가상환경을 켜주고 해당 .py를 실행하니 잘 되었다.

def runImage():
    wd = webdriver.Chrome('/Users/sangminpark/downloads/chromedriver')
    # 크롬드라이버를 이용해 웹드라이버를 크롬으로 설정
    url = 'http://ncov.mohw.go.kr/' 
    # 확진자수를 가져오는 사이트
    time.sleep(3) 
    # 3초간의 시간 지연 후 (문제 발생 방지를 위함)
    wd.get(url) 
    # url을 크롬 드라이버를 통해 실행하기.
	# 여기까지 하면 이제 .py 실행시 알아서 해당 페이지를 띄워준다.

    pyautogui.screenshot(
        '/Users/sangminpark/downloads/screenshot.png', region=(60, 1630, 940, 480))
	# pyautogui를 통해 (60, 1630)px부터 x축 방향으로 940px, y축 방향으로 480px 만큼 스크린샷을 찍기
    wd.quit()
	# 웹페이지 나가기

이 파이썬 코드를 실행하면 알아서 크롬으로 해당 페이지에 들어간 후 특정 영역을 스크린샷을 찍은 뒤 웹사이트를 빠져나오게 된다.

그 다음에는 이전 Slackbot에 내가 구현한 것과 크게 다르지 않다.

#!/Library/Frameworks/Python.framework/Versions/3.8/bin/python3.8

from slacker import Slacker
from datetime import datetime
from urllib import request
from bs4 import BeautifulSoup
from selenium import webdriver
import time
import webbrowser
import pyautogui

token = '앱의 토큰'


def send_slack_message(msg):
    full_msg = msg
    slack = Slacker(token)
    slack.files.upload(
        '/Users/sangminpark/downloads/screenshot.png', channels='#bots-playground')
   	# Slacker의 기능 중 특정 채널에 특정 파일을 업로드하는 기능이 있다. 이것을 활용한 것.
    slack.chat.post_message('#bots-playground', full_msg, as_user=True)


def run():
    target = request.urlopen("http://ncov.mohw.go.kr/")
    soup = BeautifulSoup(target, "html.parser")
    nums = []

    for item in soup.select("div.datalist"):
        for data in item.select("span.data"):
            data.string = data.string.replace(',', '')
            nums.append(int(data.string))

    send_slack_message(f"오늘 기록한 어제 코로나 확진자수는: {sum(nums)}명입니다.")


def runImage():
    wd = webdriver.Chrome('/Users/sangminpark/downloads/chromedriver')
    url = 'http://ncov.mohw.go.kr/'
    time.sleep(3)
    wd.get(url)

    pyautogui.screenshot(
        '/Users/sangminpark/downloads/screenshot.png', region=(60, 1630, 940, 480))

    wd.quit()


if __name__ == "__main__":
    try:
        runImage()
        # runImage() 먼저 실행되게 함으로써 run()을 통해 Slack 채널에 올라갈 스크린샷을 미리 따놓는다.
        run()
    except Exception as e:
        send_slack_message(e)

 

이렇게 하고 가상환경을 켠 후 python3 slackbot.py를 실행했을 때

이렇게 뜨게 된다. ㅋㅋ 이미지와 함께 띄우는 것 또한 성공했고.. 이제 AWS EC2에 Selenium, Chrome, Chromedriver를 깔고 crontab을 적용해주면 될 듯 하다 ㅎㅎ

profile

Today Sangmin Learned

@steadily-worked

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!