사이트 출석 체크를 자동으로 하자-a
배경
나는 커뮤니티에 가입은 했지만 포인트를 어디서 쓰는지 모르고 필요성을 못 느껴서 로그인을 안 하고 사이트를 이용 중이었다. 이벤트 참여에 포인트가 필요한 것을 알고 3일 정도 동안 출석 체크를 하면서 프로그램을 만들자고 생각했다. 하지만 나는 자바스크립트, html, css 같은 웹 관련 지식들이 적으므로 구글에 검색해서 얻은 코드를 수정해보자. 목표는 퀘X사존이다.
※ 글쓴이가 초보기 때문에 초보자에게 알려주는 목적으로 쓰는 글입니다.
검색
구글에 사이트 자동 출석체크를 검색해보자.
가장 위의 글은 코드와 방법이 적혀있지만 우리가 원하는 사이트에 적용하기 위해 바꿀 수 있을 정도로 자세한 설명은 없다. 두 번째 글은 맥 환경에서의 방법이라 우리가 할 수 없다. 세 번째는 어플을 알려주는 사이트가 떴다. 이처럼 구글에 검색했을 때 우리가 원하는 것을 바로 못 찾으면 대부분 검색을 잘못한 것이다.
적절한 블로그를 찾았다. jjanggu1612.tistory.com/159
파이썬을 이용한 웹로그인 2
파이썬을 이용한 웹 로그인 2 안녕하세요. 오늘은 지난번 시간에 이어서 웹 자동 로그인을 해보겠습니다. 오늘의 포스팅은 지난번 강의와 이어져 있으니 지난번 강의를 보셔야 이해가 되실 것입
jjanggu1612.tistory.com
블로그를 그대로 따라 해 보면 (파이썬 설치) Selenium 설치, 크롬 웹 드라이버 받기, 낚시 사이트의 로그인과 출석체크에 필요한 소스들을 얻을 것이다. 이제 url 주소들을 퀘이사존에 맞게 바꾸면 된다. 즐겁게 주소와 개인정보들과 경로를 수정하면 된다.
파이썬을 잘 모르지만 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]
퀘이사존은 클래스명을 예쁘게 로그인 버튼이라 해 놓았다. 아마 클래스 이름을 하나만 할 수 있을 테니 [@id="form"]을 약간 바꿔서 [@class="login-bt"]로 하고 input을 하위에 하나밖에 없는 a로 해준다.
browser.find_element_by_xpath('//*[@class="login-bt"]/a').click()
이제 글을 쓰게 된 원인인 출석체크다.
로그인 때와 마찬가지로 약간 바꾼다. 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 파일을 만들어야 한다.
cmd 혹은 명령 프롬프트 검색 후 실행하고 pip install pyinstaller 를 입력해서 pyinstaller 를 설치한다.
그다음 cd를 이용해서 .py 와 크롬 드라이버가 같이 있는 곳으로 간다. 서로 다른 곳에 있다면 한 곳에 넣어주고 경로를 수정해주자. 다른 컴퓨터에는 크롬 웹드라이버가 없을 경우가 있을 테니 같이 포장하는 것이 좋다. 이때 cd 를 이용해 파일이 있는 곳으로 가는 방법을 모른다면
다른 드라이브면 약간 방식이 다른데 이는 구글에 검색하거나 파일을 바탕화면에 두는 게 마음이 편하다.
이후 pyinstaller --onefile --add-binary "chromedriver.exe";"." .py 를 입력하면 된다.
이것은 이분의 블로그를 참조했습니다. 감사합니다 센세
blog.naver.com/yhs11145/221450157087
pyinstaller로 파이썬 exe 파일 만들기
파이썬을 이용해 여러 가지 소스들을 만들어 재미있게 실행해봤을 거에요.!그런데, 여기서!!내가 만든 ...
blog.naver.com
쿠키
프로그램은 만들었으나 이것을 매일 실행시키는 것도 까먹기 쉬운 일이다. 나도 만들었지만 이미지에 출석이 놓친 것들이 꽤 있다. 구글에 찾아보면 bat 파일을 만들어 윈도우 작업 스케줄러에 등록하거나 다른 스케줄러 프로그램을 사용해야 하지만 이 작은 일 때문에 컴퓨터가 켜졌다 꺼지는 것은 전기가 아깝기도 하고 집에 라즈베리파이가 있으니 이것을 이용해보자.