클라우드 엔지니어/Docker

출석체크 셀레니움 도커 이전작업 1일차 함수들 만들어두기

해아's 2023. 1. 25. 16:40

원래는 윈도우에 스케쥴링으로 구성해놨었다..

근데 윈도우서버가 노후되고 실행이 잘안되서 도커로 이전작업을 한뒤에 클라우드에 도커 컨테이너 방식으로 올려볼 예정이다.

 

현재 작업된 소스를 도커 컨테이너 방식에 맞게 수정하고 하나씩 실행해보고 문제여부를 체크해본다.

https://blog.yos.kr/218

 

Docker 가지고 놀기 1탄 - 웹 크롤링(docker,python,selenium 등등)

일단 1탄이다. 시작은 반이니까.. 흐름은 이렇다. 도커로 만든 크롤러가 특정사이트에서 특정 상품이 있는지 체크하고 있으면 텔레그램으로 알려주는 기능이다. 일단 도커파일 만들기 FROM python:3

blog.yos.kr

에서 만들었던 도커파일을 계속사용한다. 도커에 소스폴더를 마운트 했기때문에 외부에서 소스 작업후 도커에서 실행하게 할수 있다. 정말 좋다 도커 최고!

docker run -d --name hyundy --volume /volume1/SSD_DATA/chrome/app/:/usr/src/app/ yoskr/chrome:0.2

위와같이 도커를 실행해놨으니 도커안에서 파이썬을 실행하기위해선 아래와 같이 입력하면된다.

 

docker exec -it hyundy python /usr/src/app/m2.py

도커에서 실행한다. 다만 실행내용을 보이게 hyundy 라는 이름을 가진 도커 컨테이너에 /usr/src/app/m2.py 파일을 실행한다.

 

기본적인 출석체크 흐름

  1. 출석체크 페이지를 간다.
  2. 로그인을 한다.
  3. 출석체크를 한다.
  4. 출석체크 결과를 리턴한다.

출석체크 결과 리턴에는 여러가지가 있지만 텔레그램 알림을 이용할 예정

https://blog.yos.kr/151

 

파이썬을 이용한 자동화 연습

python 설치 https://www.python.org/downloads/ Download Python The official home of the Python Programming Language www.python.org cmd로 셋팅할폴더로 이동 pip install selenium chromedriver_autoinstaller telegram python-telegram-bot https://api.te

blog.yos.kr

텔레그램으로 알림보내고 그결과를 DB에 저장한다.

def tele_sand_msg(msg): 
    telegram_option = 1
    func_name = sys._getframe(1).f_code.co_name
    if os.path.isfile('/usr/src/app/telegram.txt') == True: telegram_option = 1
    if telegram_option == 1:
        import telegram
        with open('/usr/src/app/telegram.txt', mode='r', encoding='UTF8') as file: t = file.read()
        token, chat_id = t.split(',')
        bot = telegram.Bot(token=token)
    msg = "["+func_name+"]: "+msg
    if telegram_option == 1: 
        asyncio.run(bot.send_message(chat_id=chat_id, text=msg))
        cur = conn.cursor()
        nowtime = datetime.datetime.now()
        sql="INSERT INTO attendance (name,msg,regdate) VALUES(%s,%s,%s)"
        val=(func_name, msg , nowtime)
        cur.execute(sql,val)
        conn.commit()

주요함수 asyncio >> 비동기식 전송으로 텔레그램 함수가 에러가 나서 검색하니 이녀석을 사용하라고 하더라

/usr/src/app/telegram.txt 파일에는 챗 아이디와 키값이 저장되어있다.

 

클릭이벤트를 실행한후 경고창이나 팝업창이 나타났는지 체크하고 그걸활용한다.

 

def close_new_tabs(driver):
    tabs = driver.window_handles
    while len(tabs) != 1:
        driver.switch_to.window(tabs[1])
        driver.close()
        tabs = driver.window_handles
    driver.switch_to.window(tabs[0])

def alert_end_asndmag(driver):
    from selenium.common.exceptions import NoAlertPresentException
    if EC.alert_is_present():
        try:
            msg1 = driver.switch_to.alert.text
            driver.switch_to.alert.accept()
        except NoAlertPresentException:
            msg1 = "noalert"
    else:
        msg1 = "noalert"
        driver.switch_to.parent_frame()

    if "로그인" not in msg1.lower():
        if "이미" not in msg1.lower():
            if msg1 !="noalert" : tele_sand_msg(msg1)


def check_alert(driver):
    print("check_alert")
    alert_end_asndmag(driver)
    close_new_tabs(driver)

로그인이나 이미 라는 내용의 경고창이 아니면 내용을 텔레그램으로 전송한다.

팝업창에서도 내용을 체크해서 텔레그램으로 보낼수도 있고 팝업창을 스크린샷해서 텔레그램으로 보낼수도 있다.

 

스크린샷 촬영후 텔레그램으로 전송 함수

def screenshot(driver):
    func_name = sys._getframe(1).f_code.co_name
    scr_dir = '/usr/src/app/screenshots'
    if not os.path.exists(scr_dir):
        os.mkdir(scr_dir)
    nows = datetime.datetime.now()
    filenames1= nows.strftime("%Y.%m.%d_%H_%M_%S")
    imgsrc = scr_dir+'/scr_'+func_name+filenames1+".png"
    driver.save_screenshot(imgsrc)
    telegram_option = 1
    if os.path.isfile('/usr/src/app/telegram.txt') == True:     telegram_option = 1
    if telegram_option == 1:
        import telegram
        with open('/usr/src/app/telegram.txt', mode='r', encoding='UTF8') as file: t = file.read()
        token, chat_id = t.split(',')
        bot = telegram.Bot(token=token)
    if telegram_option == 1:  asyncio.run(bot.send_photo(chat_id=chat_id, photo=open(imgsrc,'rb')))

스크린샷 파일명을 이 함수를 호출한 함수명으로 저장한다.

 

 

728x90
반응형