ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 사이트 출석 체크를 자동으로 하자-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
Designed by Tistory.