[학내공지를 이메일로!] 1. 전공변경생의 첫 발걸음.

Intro

학교마다 다를지는 모르겠지만, 우리 학교에 경우 학내공지의 의존도가 참 높다. 또한 코로나까지 겹침에 따라, 나를 포함해서 많은 학생들이 학내공지를 하루에도 여러차례 들락날락거리며 시간을 낭비해왔다. 어느새 컴퓨터를 키면 가장 먼저 확인하는 것이 학내공지를 확인하는 것이되어버렸고, 대부분의 경우 업로드된 글이 없거나, 있더라도 무의미한 글인 경우가 대부분이였다. 때마침 같이 연구실 인턴을 하는 동생이 텔레그램을 이용하여 공지를 전달받고 있다고 들었고, 나도 한번 나만의 방식으로 이를 구현해 보고자 했다.

웹 크롤링

우선 우리 학교사이트의 경우에는, 게시글의 목록에 경우는 권한없이 볼수 있지만, 그 글의 내용을 보기 위해서는 로그인을 필요로 한다. 그렇기에, requests를 통하여 그 목록을 기존의 목록과 비교하고, 그 목록의 변화가 생겼을 때 selenium을 통하여 로그인하고 그 글의 정보를 BeautifulSoup을 활용하여 parsing하여 활용했다.
처음엔 크롤링이 잘되다 어느 순간부터 크롬드라이버가 켜지지 않아서 htop을 봤더니 메모리가 크롬드라이버로 까득 차있었다. 그렇다 내 코드에는 driver.quit()을 빼먹었었다..

SMTP (이메일로 보내기)

나에 경우 크롤링한 정보를 이메일로 보내는 방법을 선택했다. 썬더버드를 사용한 이후, 메일 관리가 너무 간편해졌으며, 대부분의 시간을 노트북과 함께하기에 어플보다는 이메일을 선택했다. 또한 이메일을 핸드폰으로 확인하기도 너무 쉽기 때문에 이 방법을 선택했다.
smtplib와 email.mime 파이썬 라이브러리를 이용하여 쉽게 메일에 파일을 첨부하고 본문과 제목을 추가하여 보낼 수 있었다. 우리 학교 메일을 이용하여 보냈을 때, 이유는 모르겠지만 인코딩된 파일이름들이 디코딩 되지않은 채로 그냥 보였다. 학교 정보팀에 문의하였지만, 대차게 씹히고 그냥 우리학교 메일을 보내지 않기로 했다.(절이 싫으면 중이 떠나야지>..)
처음에는 파일을 첨부하지 않고 메일 내용만을 전달했었는데, 이게 공지에 올라온 첨부파일을 첨부하다보니 메일 하나하나 가는 시간이 너무 오래걸렸다. 처음 첨부파일을 보내는 방식으로 바꿨을 때, 테스트를 위해 크론탭을 1분 간격으로 실행했는데 메일을 보내는 시간이 너무 오래걸려서 가장 최신 파일로 업데이트가 되지않아 5번연속으로 같은 메일이 같던 것이 기억이 난다. 무료로 제공되는 ec2를 사용중인데, 클라이언트의 수가 더 늘어나게 됬을 때 이를 해결해야할 방법을 모색해야한다.

크론탭

우선 크론탭을 사용하는데도 애를 참 많이 먹었다. 크론탭을 지정할 때, 새로운 터미널이 켜지기에 절대주소를 사용해야한다. 문제는 파이썬 파일 내부에서도 그 주소를 지정해줘야한다.

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
f = open(os.path.join(BASE_DIR,"emails.txt"))

나 같은 경우에는 현재 5분마다 스크립트를 실행시키고, 그 stdout과 stderr를 cron.log로 저장하게끔 설정하였다. 또한 실행시간을 오전 9시부터 오후 9시까지로 한정하였는데, ec2 우분투의 경우 ntp.ubuntu.com에 timesync를 주기적으로 실행이 되는데 이 설정을 바꾸기 귀찮아서 그냥 시차만큼 더해서 사용중이다.

# m h  dom mon dow   command
*/5 00-12 * * * /home/ubuntu/playground/crawler/GIST_INFO.sh >> /home/ubuntu/playground/crawler/log/cron.log 2>&1

cron자체의 log를 보기위해서는 다음과 같은 방법을 사용하면 된다.

/etc/rsyslog.d/50-defualt.conf
Find a line
#cron.* -> uncomment it

sudo service rsyslog restart

/var/log/cron.log 에서 로그를 확인할 수 있다. 지금 봐봤더니 /var/log/cron.log.1이라는 같은 내용을 담고 있는 파일도 생성이 되었는데,, 정체를 모르겠다.

실행 결과 예시


개인 적으로 Gmail이 최고인 것 같다.

앞으로의 목표와 여담

작게나마 지인들을 통해 대략 10명정도 서비스를 운영해봤는데, 전반적으로 괜찮은 피드백들이 있었다. 하지만, 몇몇의 경우 안그래도 많은 메일에 더 많은 메일이 쌓여 취소해달라는 경우도 있었다. 또한, 개인적으로 너무나 편하게 사용하고 있는 중이라, 그 서비스의 크기를 더욱 키워 더 많은 사람들이 이용할 수 있게 제공하고 싶다. 그러기 위해서는 여러가지 필요조건이 필요하다.
(-> 2020년 12월 현재 30명정도의 학생들이 운영하고 있다. 글쓴이의 귀찮음으로 서비스를 유지하는 정도..)

  1. 구독 시스템의 도입
    이름 학번 이메일 정도로 학내공지를 메일로 구독을 할 수 있고, 또한 쉽게 구독취소를 하게끔 구현하고 싶다. 이 기능을 구현하기 위해서는 우선 유저정보를 저장하고 그 구독여부를 설정할 수 있는 데이터베이스를 만들어야한다. 또한, 서버용 컴퓨터를 하나 두어서 이를 통해 그 요청을 처리할 수도 있겠지만, 자주 발생하는 요청이 아닌 만큼 AWS람다 함수를 이용하여 진행하고 싶다.

  2. 많은 사람에게 메일을 보내는 트래픽
    특히 크기가 큰 파일을 첨부하게 되면, 그 메일을 보내는 시간이 더욱더 커지게 된다. 현재 낮은 cpu성능의 ec2에서 과연 그 트래픽을 다 처리할 수 있는지 의문이 든다. 또한 현제 gmail을 이용하고 있는데, 하루에 보낼 수 있는 메일의 한계가 500개로 정해져있는데 이에 대한 대한 또한 제시해야 할것이다. 그리고 하나의 공지가 올라오자 마자 바로 다음 공지가 올라오게 되면, 이에 대한 해결책도 강구해야한다.

전체 코드는 여기에서 확인 가능합니다. 어떠한 클래스도 쓰지 않고, 단순히 쓰고 싶은 기능들을 열거하고, 몇몇 기능만 나름 함수화?를 진행한 코드이며, 파이썬을 가지고는 처음 작업한 코드입니다..
아직 미숙한 부분이 많지만, 한가지 한가지 기능을 추가할 예정이며 계속 업로드 할것이며, 피드백 주시면 매우 감사하겠습니다.!

좋은 웹페이지 즐겨찾기