원래는 윈도우에 스케쥴링으로 구성해놨었다..
근데 윈도우서버가 노후되고 실행이 잘안되서 도커로 이전작업을 한뒤에 클라우드에 도커 컨테이너 방식으로 올려볼 예정이다.
현재 작업된 소스를 도커 컨테이너 방식에 맞게 수정하고 하나씩 실행해보고 문제여부를 체크해본다.
에서 만들었던 도커파일을 계속사용한다. 도커에 소스폴더를 마운트 했기때문에 외부에서 소스 작업후 도커에서 실행하게 할수 있다. 정말 좋다 도커 최고!
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 파일을 실행한다.
기본적인 출석체크 흐름
- 출석체크 페이지를 간다.
- 로그인을 한다.
- 출석체크를 한다.
- 출석체크 결과를 리턴한다.
출석체크 결과 리턴에는 여러가지가 있지만 텔레그램 알림을 이용할 예정
텔레그램으로 알림보내고 그결과를 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
반응형