자동 출석 매크로 - jadong chulseog maekeulo

배경

 나는 커뮤니티에 가입은 했지만 포인트를 어디서 쓰는지 모르고 필요성을 못 느껴서 로그인을 안 하고 사이트를 이용 중이었다. 이벤트 참여에 포인트가 필요한 것을 알고  3일 정도  동안 출석 체크를 하면서 프로그램을 만들자고 생각했다. 하지만 나는 자바스크립트, html, css 같은 웹 관련 지식들이 적으므로 구글에 검색해서 얻은 코드를 수정해보자. 목표는 퀘X사존이다.

Show

    ※ 글쓴이가 초보기 때문에 초보자에게 알려주는 목적으로 쓰는 글입니다.

    검색

     구글에 사이트 자동 출석체크를 검색해보자.

    자동 출석 매크로 - jadong chulseog maekeulo
    좋은 글들이 나온다

     가장 위의 글은 코드와 방법이 적혀있지만 우리가 원하는 사이트에 적용하기 위해 바꿀 수 있을 정도로 자세한 설명은 없다. 두 번째 글은 맥 환경에서의 방법이라 우리가 할 수 없다. 세 번째는 어플을 알려주는 사이트가 떴다. 이처럼 구글에 검색했을 때 우리가 원하는 것을 바로 못 찾으면 대부분 검색을 잘못한 것이다.

    자동 출석 매크로 - jadong chulseog maekeulo
    이런 관련 검색어로도 잘 못찾을 수도 있다. 그럴 경우 위에서 봤던 사이트들에서 적절한 키워드를 찾아 다시 검색해보자

      적절한 블로그를 찾았다. jjanggu1612.tistory.com/159

    파이썬을 이용한 웹로그인 2

    파이썬을 이용한 웹 로그인 2 안녕하세요. 오늘은 지난번 시간에 이어서 웹 자동 로그인을 해보겠습니다. 오늘의 포스팅은 지난번 강의와 이어져 있으니 지난번 강의를 보셔야 이해가 되실 것입

    jjanggu1612.tistory.com

    자동 출석 매크로 - jadong chulseog maekeulo

     블로그를 그대로 따라 해 보면 (파이썬 설치) Selenium 설치, 크롬 웹 드라이버 받기, 낚시 사이트의 로그인과 출석체크에 필요한 소스들을 얻을 것이다. 이제 url 주소들을 퀘이사존에 맞게 바꾸면 된다. 즐겁게 주소와 개인정보들과 경로를 수정하면 된다.

    자동 출석 매크로 - jadong chulseog maekeulo

     파이썬을 잘 모르지만 browser.find_element_by_xpath('//*[@id="form"]/div[2]/input').click() 에서

    id="form"이 있는 것의 아래 있는 div 중 위에서 2번째 div의 아래에 있는 input을 클릭하는 것을 의미하는 것이다. div[n]의 의미는 <form ~ id="form"~> 안에서 위에서 n번째 div라는 뜻일 거다.

             <form ~ id="form"~> ㅡㅡ <div>[1]

                                              ㄴ <ul>[1]

                                              ㄴ <div>[2] - <input ~>

                                              ㄴ <div>[3]

    자동 출석 매크로 - jadong chulseog maekeulo

     퀘이사존은 클래스명을 예쁘게 로그인 버튼이라 해 놓았다. 아마 클래스 이름을 하나만 할 수 있을 테니 [@id="form"]을 약간 바꿔서 [@class="login-bt"]로 하고 input을 하위에 하나밖에 없는 a로 해준다.

    browser.find_element_by_xpath('//*[@class="login-bt"]/a').click()

     이제 글을 쓰게 된 원인인 출석체크다.

    자동 출석 매크로 - jadong chulseog maekeulo
    출첵을 한 날은 버튼을 올리면 n -> <span class="active1">n (#n은 날짜) 로 바뀐다
    자동 출석 매크로 - jadong chulseog maekeulo
    오늘 출석체크를 안하면 span class가 active2로 나오고 뒤에 더 생긴다

     로그인 때와 마찬가지로 약간 바꾼다. onclick="anttendanceCheck()" 라는 출석체크를 위한 속성이 보인다. 이놈을 이용해 browser.find_element_by_xpath('//*[@onclick="anttendanceCheck()"]').click() 이런 식으로 만든다. 그러면 작동이...

    //<table>의 <tr>은 행이고 <td>은 열이다.

    /* 이 부분은 안 읽어도 상관없습니다

     안돼서 이 글을 쓰고 있는 건데 지금 다시 해보니 문제없이 작동된다...

     그래도 글의 의도와 맞게 아마 틀린 소리를 계속해보자.

    #browser.find_element_by_xpath('//*[@tbody]/tr[5]/td[1]').click()

     이런 식으로 tbody를 찾고 그 아래를 직접 경로를 입력하거나

    #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[5]/td[1]').click()

     크롬의 Xpath helper 같은 절대 주소를 찾아주는 프로그램을 이용해 경로를 넣으면 작동이 된다.  그래서 혹시

    #browser.find_element_by_xpath('//*[@onclick="anttendanceCheck()"]').click()

    가 <span ~> 안의 무언가를 주소로 생각했나 싶어

    #browser.find_element_by_xpath('//*[@onclick="anttendanceCheck()"]').find_element_by_xpath('..').click()

    find_element_by_xpath('..') <!-- 현재 Node의 부모 Node 선택 -->

    을 해보니 작동됐다.

    */

    크롬 웹드라이버 링크 - chromedriver.chromium.org/downloads

    Downloads - ChromeDriver - WebDriver for Chrome

    WebDriver for Chrome

    chromedriver.chromium.org

    자신의 크롬 버전과 맞는 버전은 다운로드해야 한다는데 다르면 안 되는지 모르겠다.

    그러면 이런 식으로 완성된다.

    #구글 웹드라이버를 사용하기 위한 추가구문
    import selenium.webdriver as webdriver
    from selenium.webdriver.common.keys import Keys
    import sys, os #exe 파일로 만들 때 필요한 코드
    
    #exe 파일로 만들 때 필요한 코드 pyinstaller를 이용하면 가능하다.
    if  getattr(sys, 'frozen', False): 
        chromedriver_path = os.path.join(sys._MEIPASS, "chromedriver.exe")
        driver = webdriver.Chrome(chromedriver_path)
    else:
        driver = webdriver.Chrome('e:/python/VScode/auto_fin/chromedriver.exe')
    
    #구글웹드라이버를 실행을 시킨후 해당사이트의 로그인페이지에 접속합니다.
    #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')
    
    # 출석체크를 한다 
    try:
        #browser.find_element_by_xpath('//*[@onclick="anttendanceCheck()"]').find_element_by_xpath('..').click()
    	browser.find_element_by_xpath('//*[@onclick="anttendanceCheck()"]').click()
    	#출첵이 하루에 한번이라 작동되는지 내일 확인해 봐야한다
        #확인해 보니 잘 되니 그냥 쓰면 된다
    except Exception:
        print("you already check!") #이미 출석체크 했으면 콘솔창에 문자열이 나타난다
    
    browser.implicitly_wait(30) #30초 대기라긴하는데 이놈이 안기다림
    
    #크롬드라이버를 닫는다.
    browser.quit()

    기타

     만약 다른 윈도우 컴퓨터에서 사용하고 싶으면 exe 파일을 만들어야 한다. 

    자동 출석 매크로 - jadong chulseog maekeulo
    혹시 문제가 있으면 관리자 권한으로 해보자

     cmd 혹은 명령 프롬프트 검색 후 실행하고 pip install pyinstaller 를 입력해서 pyinstaller 를 설치한다.

     그다음 cd를 이용해서 .py 와 크롬 드라이버가 같이 있는 곳으로 간다. 서로 다른 곳에 있다면 한 곳에 넣어주고 경로를 수정해주자. 다른 컴퓨터에는 크롬 웹드라이버가 없을 경우가 있을 테니 같이 포장하는 것이 좋다. 이때 cd 를 이용해 파일이 있는 곳으로 가는 방법을 모른다면 

    자동 출석 매크로 - jadong chulseog maekeulo
    검색창 옆에서 주소를 복사하고
    자동 출석 매크로 - jadong chulseog maekeulo
    해당 폴더로 이동하면 된다

     다른 드라이브면 약간 방식이 다른데 이는 구글에 검색하거나 파일을 바탕화면에 두는 게 마음이 편하다.

    이후 pyinstaller --onefile --add-binary "chromedriver.exe";"." .py 를 입력하면 된다.

     이것은 이분의 블로그를 참조했습니다. 감사합니다 센세

    blog.naver.com/yhs11145/221450157087

    pyinstaller로 파이썬 exe 파일 만들기

    파이썬을 이용해 여러 가지 소스들을 만들어 재미있게 실행해봤을 거에요.!​그런데, 여기서!!​내가 만든 ...

    blog.naver.com

    자동 출석 매크로 - jadong chulseog maekeulo

    쿠키

     프로그램은 만들었으나 이것을 매일 실행시키는 것도 까먹기 쉬운 일이다. 나도 만들었지만 이미지에 출석이 놓친 것들이 꽤 있다. 구글에 찾아보면 bat 파일을 만들어 윈도우 작업 스케줄러에 등록하거나 다른 스케줄러 프로그램을 사용해야 하지만 이 작은 일 때문에 컴퓨터가 켜졌다 꺼지는 것은 전기가 아깝기도 하고 집에 라즈베리파이가 있으니 이것을 이용해보자.