이 프로젝트는 텔레그램 봇(@LmsNotion_bot)에 ‘할 일’이라고 보내면 강의영상, 레포트, 퀴즈의 리스트를 자동으로 탐색한다. 셀레니움을 통해 정보를 가져오고, 봇을 이용해 하지 않은 것들은 제목과 함께 링크를 첨부하며 하라고 알려주고, 모두 했으면 완료했다고 메세지를 보내준다.
셀레니움을 이용해 LMS 사이트를 크롤링하는 class
class LecFinder:
def __init__(self):
- 강의 group_id 입력(주소창에 5자리 숫자로 존재)
- LMS 아이디 입력
- LMS 비밀번호 입력
def lec_report(self, driver):
- 입력된 group_id로 format시켜 LMS 레포트 사이트 주소를 가져온다.
- elements = 위의 사이트에서 레포트를 내용을 가지고있는 부분을 css selector로 가져온다.
- elements의 개수를 세고 1개 이상이면 if문을 시행한다.
- 과제제목, 제출기한, 제출여부를 포함시킬 빈 리스트를 생성한다.
- for문을 이용해 사이트에서 제목, 기한, 제출여부의 정보를 가져와 각각의 리스트에 추가해준다.
- for문이 끝나고 pandas의 DataFrame을 이용하여 각 리스트들을 테이블화한다.
- 이 테이블들은 df로 정의되며 위의 if문을 만족시킬 때 df를 돌려준다.
- 레포트 개수가 없다면 '레포트는 없습니다.'라는 문자열을 돌려준다.
# def lec_report와 lec_video, lec_quiz는 동일하다.
def report_result(self, driver):
- lec_report의 return값을 df라고 저장한다.
- 그 결과가 문자열이라면 '레포트는 없습니다.'라는 문자열을 돌려준다.
- 아니라면 먼저 과제제목 테이블의 요소 개수를 세고 확인을 위한 count_correct라는 빈 리스트를 생성한다.
- 만약 df[제출여부]가 '미제출'이라면 각 df[과제제목]과 df[제출기간]을 리스트에 포함한다.
- 그 후 count_correct리스트의 원소 개수가 1개 이상이라면 리스트를 돌려주고,
아니라면 '레포트는 없습니다'라는 문자열을 돌려준다.
# def report_result와 video_result, quiz_result 동일하다.
크롤링한 정보들을 텔레그램 봇을 통해 메세지 전달하는 class
class NotionTelegramBot:
def __init__(self):
- lecfinder.py 불러와 lf라고 지정한다.
- Lms Notion Bot 토큰
- 텔레그램 채팅 아이디 입력
- 텔레그램 봇에 토큰을 넘겨준다.
- 텔레그램으로부터 업데이트를 받아온다.
def handler(self, update, context):
- 사용자가 보낸 메세지를 불러온다.
- 사용자가 '할일'이라고 보내면 '로딩중∙∙∙'을 먼저 보낸다.
- selenium의 webdriver를 이용하여 Chrome에서 전북대 LMS 사이트를 실행한다.
- 2초 뒤 아이디와 비밀번호를 입력할 칸을 xpath로 위치를 입력하고
lecfinder에서 입력한 아이디와 비밀번호를 입력한다.
- 로그인버튼을 xpath로 위치를 입력하고 버튼을 클릭한다.
- lecfinder에서 가져온 값들을 아래와 같이 저장한다.
- report = lecfinder에서 가져온 report_result 값
- video = lecfinder에서 가져온 video_result 값
- quiz = lecfinder에서 가져온 quiz_result 값
- 만약 report의 값이 '레포트는 없습니다.'라는 문자열일 때
텔레그램 봇을 이용해 '[레포트]완료'라고 사용자에게 전송한다.
- 아니라면 send_telegram_msg의 값과 이 강의 사이트 주소를 같이 전송한다.
- 위 두줄의 과정을 video와 quiz에도 똑같이 적용시킨다.
- 모두 하고 나면 사이트에서 로그아웃 버튼을 xpath로 위치를 찾고 클릭하며 로그아웃한다.
def send_telegram_msg(self, report):
- report의 반환값이 list일때 for문을 통해 사용자에게 메세지를 전송한다.
- list에는 과제제목과 기간 총 두가지의 요소가 포함되어 있다.
이 요소를 video_report라고 지정하고 인덱스 슬라이싱을 통해 format하며 '[기한: {}]\n{}'이라고 전송한다.
- 반환값이 list가 아니라면 그대로 report의 반환값을 그대로 보내준다.
def main():
- 위에서 만든 NotionTelegramBot()이라는 class를 notionbot이라고 저장한다.
- MessageHandler를 이용해 '할일'이라는 메세지를 받으면 echo대로 행동한다.
- notionbot의 규칙을 추가한다.
- 강의의 고유한 group_id를 주소창에서 찾아 groupid_lec에 입력해야한다. group_id 주소창 제일 마지막에 5자리 숫자로 존재한다.
- 본인의 LMS 아이디와 비밀번호를 입력해야한다.
self.groupid_lec1 = 강의 group_id(5자리수)
self.groupid_lec2 = 강의 group_id(5자리수)
self.lms_id = 'LMS 로그인 아이디'
self.lms_pw = 'LMS 로그인 비밀번호'
- 본인의 텔레그램 채팅 아이디를 입력해야한다.
self.telegramid = '텔레그램 채팅 아이디'
- 먼저 봇을 검색해 '할일'이라고 치면 Selenium이 실행될 동안 '로딩중'이라는 메세지가 발송된다.
- 탐색을 마치면, 결과를 사용자에게 보낸다. 해야할 일이 남았다면 그 카테고리의 이름과 기한, 링크를 첨부해 메세지를 보내고, 다 했다면 각 카테고리 별로 완료라는 메세지를 보낸다.