-
사이트 출석 체크를 자동으로 하자-bㅃㅓㄹ 짓 2020. 12. 16. 21:58
이전 글을 쓰면서 내가 설명을 엄청 못한다는 것을 깨달았다.
그래서 이제는 내가 어떤식으로 했는지 간략하게 설명한 뒤 만났던 문제들을 해결하는 방법을 중심으로 작성할 예정이다.
목표
이번 글은 라즈베리파이에서 켜질 때 마다 자동으로 출석 체크가 되게 하는것이 목표다.
요약
1. 라즈베리파이를 연결(SSH, VNC viewer)
2. 삼바(Samba)를 통해 파일전송
3. 셀레니움(Selenium) 설치
4. 크로미움 버전 및 드라이버 설치
5. crontab을 이용해 자동실행 완성
만난 문제들
1. 라즈베리파이 화면을 볼수가 없네? -> hdmi 선을 구해서 했으나 sd카드를 수정해서 하는 방법도 있다(노트북은 대부분 hdmi가 출력만 지원한다)
2. 셀레니움을 설치했는데 안된다 -> pip로 설치해서 문제였다. pip3를 사용하자
3. 그래도 안된다 -> 크롬 드라이버가 크로미움과는 잘 맞지 않는다. 크로미움 드라이버와 크로미움 버전, 크로미움 코덱의 버전을 통일한다 ex.m.blog.naver.com/dsz08082/221877958842
[Raspberrypi] 라즈베리파이 파이썬 셀레니움 설치
라즈베리파이에 파이썬 셀레니움 설치> 목차- 환경- 셀레니움- 셀레니움 장단점- 셀레니움 설치- 셀레니...
blog.naver.com
4. thonny나 python3에서는 잘 작동되는데 터미널에 치면 작동이 안된다 -> 터미널로 여는 python3의 환경변수가 python2로 연결되어 있었다. 바꿔주자(우분투에서 바꾸는 글은 많으나 라즈베리파이에서 바꾸는 것은 적다. 라즈베리파이 파일 구조를 비교하면서 적용하면 성공한다)
5. 터미널이나 thonny나 python3에서는 작동이 되나 크론탭에서 실행하면 안된다 -> 원인을 잘 모르겠으나 옆에 있던 셀레니움 작동 확인 코드에 디스플레이 없이 출력이 있었고 복붙하니 가끔 실패하나 실행된다.
오류코드
Traceback (most recent call last): File "/home/pi/Downloads/quasarzone_auto_check.py", line 22, in <module> driver = webdriver.Chrome('/usr/lib/chromium-browser/chromedriver') File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/chrome/webdriver.py", line 81, in __init__ desired_capabilities=desired_capabilities) File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__ self.start_session(capabilities, browser_profile) File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session response = self.execute(Command.NEW_SESSION, parameters) File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute self.error_handler.check_response(response) File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally. (unknown error: DevToolsActivePort file doesn't exist) (The process started from chrome location /usr/bin/chromium-browser is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
6. 크론탭이 뭔가 이상하다 -> 루트 계정으로 수정했더니 안된다. 명령에 sudo도 빼고 크론탭 작성도 일반 계정으로한다
코드
크론탭에서 재부팅 하고 100초뒤와 20분마다 한번씩 실행하고 로그를 남기게 했다.
마지막 줄을 넣어야 재부팅 했을 때 크론탭에 설정한 내용들이 남아있다. 안하면 다 사라짐.
# Edit this file to introduce tasks to be run by cron. # # Each task to run has to be defined through a single line # indicating with different fields when the task will be run # and what command to run for the task # # To define the time you can provide concrete values for # minute (m), hour (h), day of month (dom), month (mon), # and day of week (dow) or use '*' in these fields (for 'any'). # # Notice that tasks will be started based on the cron's system # daemon's notion of time and timezones. # # Output of the crontab jobs (including errors) is sent through # email to the user the crontab file belongs to (unless redirected). # # For example, you can run a backup of all your user accounts # at 5 a.m every week with: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # For more information see the manual pages of crontab(5) and cron(8) # # m h dom mon dow command */20 * * * * python3 /home/pi/Downloads/quasarzone_auto_check.py >> /home/pi/log/every10.log 2>&1 @reboot sleep 100 && python3 /home/pi/Downloads/quasarzone_auto_check.py >> /home/pi/log/reboot.log 2>&1 @reboot crontab -l > /home/pi/.local/crontab.backup
quasarzone_auto_check.py
약간의 수정이 필요하다
#!/usr/bin/env python #구글 웹드라이버를 사용하기 위한 추가구문 #혹시 이게 문제인가 해서 바꿨는데 효과가 있었나? 의문 #import selenium.webdriver as webdriver from selenium import webdriver from selenium.webdriver.common.keys import Keys import time, sys, os, datetime from selenium.webdriver.chrome.options import Options succes = 1 #이 부분이 바로 문제를 해결해준 의문의 코드 자원이 #부족해서 그런가 생각은 들지만 부족해서 일어난 문제같지 않다 from pyvirtualdisplay import Display display = Display(visible=0, size=(800,600)) display.start() #해결끝 #로그를 남기기 위해 시간을 추가했다 now = datetime.datetime.now() nowDatetime = now.strftime('%Y-%m-%d %H:%M:%S') print(nowDatetime + " start") #문제 해결을 위해 시도한것들 효과가 있는지는 의문이다 chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') #chrome_options.add_argument("start-maximized") #chrome_options.add_argument("disable-infobars") #드라이버 주소도 라즈베리파이에 맞게 수정해야한다 대부분 이대로 가면 될것이다 driver = webdriver.Chrome('/usr/lib/chromium-browser/chromedriver') #구글웹드라이버를 실행을 시킨후 해당사이트의 로그인페이지에 접속합니다. #browser = webdriver.Chrome('e:/python/chromedriver') browser = driver browser.get('https://quasarzone.com/login?nextUrl=http://quasarzone.com/') browser.implicitly_wait(3) # 자동로그인을 하기 위한 사이트의 ID, 패스워드 속성값을 적습니다. # 접속하기 위한 사이트의 아이디, 패스워드를 적습니다. browser.find_element_by_name('login_id').send_keys('아이디') browser.find_element_by_name('password').send_keys('비번') # 로그인 버튼을 눌러주자. browser.find_element_by_xpath('//*[@class="login-bt"]/a').click() # 출석체크로 넘어간다 browser.get('https://quasarzone.com/users/attendance') #로그를 위한 것들 now = datetime.datetime.now() nowDatetime = now.strftime('%Y-%m-%d %H:%M:%S') print(nowDatetime, end='') # 출석체크를 한다 # //*[@id="content"]/div[2]/a/img #browser.find_element_by_xpath('/html/body/div[@id="wrap"]/div[@id="contentArea"]/div[@id="container"]/div[@id="content"]/div[@class="sub-content-wrap"]/div[@class="left-con-wrap"]/div[@class="column-wrap"]/div[@class="calender-wrap"]/div[@class="calender-area"]/div[@class="table-area"]/table[@id="calender"]/tbody/tr[2]/td[1]').click() try: #print("try") browser.find_element_by_xpath('//*[@onclick="anttendanceCheck()"]').find_element_by_xpath('..').click() except Exception: print(" you already check!") succes = 0 #browser.find_element_by_xpath('//*[@tbody]/tr[2]/td[1]').click() if succes == 1: print(" ok") browser.get('https://quasarzone.com/users/attendance') browser.implicitly_wait(30) #time.sleep(10) #크롬드라이버를 닫는다. browser.quit() display.stop()
후기
개발중에 스크린 샷을 많이 남겨야 글쓰기가 편하다는 것을 알았지만 뻘짓을 많이 할껄 생각하면 두렵다.
'ㅃㅓㄹ 짓' 카테고리의 다른 글
Cannot currently show the desktop (0) 2022.03.26 tensorflow gpu window10 설치 (0) 2021.01.19 사이트 출석 체크를 자동으로 하자-a (3) 2020.11.29