오늘의 코로나 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을 적용해주면 될 듯 하다 ㅎㅎ
'Slackbot' 카테고리의 다른 글
1/27 디버깅#4 DISPLAY 오류 (0) | 2021.01.27 |
---|---|
1/26 디버깅#3 AWS EC2에 PyAutoGUI가 적용되지 않는 문제 발생 (1) | 2021.01.26 |
1/24 PyAutoGUI로 특정 영역 캡쳐하기 (0) | 2021.01.24 |
디버깅 #2 HTTPConnectionPool 오류 (0) | 2021.01.24 |
디버깅 #1 EC2 가상환경이 삭제된 문제 (0) | 2021.01.15 |