學校的自動打卡
阿新 • • 發佈:2021-03-15
學校每天都要讓我們去打卡,雖然時間很短,但還是要手動操作,我自己寫了個程式,來代替手動打卡。
資訊門戶登入
首先,要在資訊門戶進行登入。進行資訊蒐集,先找到登入框的使用者名稱和密碼的所在處,發現可以用id來進行定位
然後再查詢登入按鈕的所在處,也是可以用id定位
所以可以先定位,然後用send_keys()
函式將賬號和密碼輸入進去,click()
函式實現點選。如果賬號或密碼輸入錯誤,會顯示認證資訊無效
,可以用一個if
迴圈實現
username_btn = bro.find_element_by_id('username')
password_btn = bro.find_element_by_id( 'password')
username_btn.send_keys('xxxxxxxxx')
password_btn.send_keys('xxxxxx')
login_btn = bro.find_element_by_id('passbutton')
login_btn.click()
if '認證資訊無效' in bro.page_source:
print('登入失敗,賬號密碼可能錯誤')
else:
print('登入成功')
這個網站登陸後會有一個bug,顯示訪問頁面出錯,應對的操作是需要返回一下
if '重新登入' in bro.page_source:
bro. back()
進入打卡頁面
接下來是點選打卡,進入打卡頁面,可以看到,點健康資訊打卡下面的星星也是能進去的,所以在標籤定位時可以選擇星星,然後利用class
標籤進去
clock_in_btn = bro.find_element_by_class_name('stars')
clock_in_btn.click()
print('已進入打卡頁面')
因為打卡介面是一個新的控制代碼,並不是在當前控制代碼頁,所以要進行控制代碼的切換。先獲取當前瀏覽器的所有控制代碼,然後選擇打卡頁面的控制代碼。
sleep(3)
n = bro.window_handles # 獲取當前瀏覽器所有視窗控制代碼
# print('當前控制代碼:', n)
bro.switch_to.window(n[-1]) # 切換到打卡視窗的控制代碼
取消彈窗
進去後,如果當日打過卡,會有一個彈窗,問你當日已打過卡,是否需要繼續打卡。這裡可以選擇點選x
將視窗關閉。定位的話可以選用xpath
# 如果當日提交過,選擇關閉按鈕
if '當日' in bro.page_source:
close_btn = bro.find_element_by_xpath('/html/body/div[8]/div[3]/a[1]')
close_btn.click()
資料填寫及提交
在這個打卡中,絕大部分的資訊是已經填寫好的,只差一個昨晚體溫和今晨體溫,我們可以全部填36.7,在開發者工具中檢視,發現可以用id定位
# 體溫數值填入
tw = bro.find_element_by_id('input_tw')
tw.send_keys('36.7')
zwtw = bro.find_element_by_id('input_zwtw')
zwtw.send_keys('36.7')
print('溫度已填寫')
最後就是點選提交按鈕了,這裡我一開始是用的class標籤定位,發現一直不成功,後面改用xpath就成功了,也不知道啥原因。
# 提交
submit_btn = bro.find_element_by_xpath('/html/body/div[1]/div/div/div/div[2]/div/div/button[1]')
submit_btn.click()
print('打卡成功')
完整程式碼
from selenium import webdriver
from time import sleep
from lxml import etree
if __name__ == '__main__':
bro = webdriver.Chrome('./chromedriver.exe')
bro.get('http://ids2.just.edu.cn/cas/login?service=http%3A%2F%2Fmy.just.edu.cn%2F')
print('資訊門戶載入完成')
username_btn = bro.find_element_by_id('username')
password_btn = bro.find_element_by_id('password')
username_btn.send_keys('xxxxxxxx')
password_btn.send_keys('xxxxx')
login_btn = bro.find_element_by_id('passbutton')
login_btn.click()
if '認證資訊無效' in bro.page_source:
print('登入失敗,賬號密碼可能錯誤')
else:
print('登入成功')
# 資訊門戶的bug,要返回上一頁
bro.back()
# 開始點選打卡
daka_btn = bro.find_element_by_class_name('stars')
daka_btn.click()
print('已進入打卡頁面')
# 將舊url更新到打卡的url
sleep(3)
n = bro.window_handles # 獲取當前瀏覽器所有視窗控制代碼
# print('當前控制代碼:', n)
bro.switch_to.window(n[-1]) # 切換到打卡視窗的控制代碼
# 如果當日提交過,選擇關閉按鈕
if '當日' in bro.page_source:
close_btn = bro.find_element_by_xpath('/html/body/div[8]/div[3]/a[1]')
close_btn.click()
# 體溫數值填入
tw = bro.find_element_by_id('input_tw')
tw.send_keys('36.7')
zwtw = bro.find_element_by_id('input_zwtw')
zwtw.send_keys('36.7')
print('溫度已填寫')
# 提交
submit_btn = bro.find_element_by_xpath('/html/body/div[1]/div/div/div/div[2]/div/div/button[1]')
submit_btn.click()
print('打卡成功')
sleep(3)
bro.quit()
函式實現打卡
使用這個程式碼可能會幫很多人打卡,可以選擇將上面的打卡程式碼封裝為一個函式,這樣就可以實現多人打卡,並且,在打卡的時候看不看彈出的瀏覽器內容也不是那麼的重要,可以選擇將瀏覽器彈窗隱藏。
from selenium import webdriver
from time import sleep
from lxml import etree
from selenium.webdriver.chrome.options import Options
def clock_in(uname, passwd):
# 實現無視覺化操作
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
bro = webdriver.Chrome(executable_path='./chromedriver.exe', options=chrome_options)
bro.get('http://ids2.just.edu.cn/cas/login?service=http%3A%2F%2Fmy.just.edu.cn%2F')
print('資訊門戶載入完成')
username_btn = bro.find_element_by_id('username')
password_btn = bro.find_element_by_id('password')
username_btn.send_keys(uname)
password_btn.send_keys(passwd)
login_btn = bro.find_element_by_id('passbutton')
login_btn.click()
if '認證資訊無效' in bro.page_source:
print('登入失敗,賬號或密碼可能錯誤')
else:
print('登入成功')
# 資訊門戶的bug,要返回上一頁
if '重新登入' in bro.page_source:
bro.back()
# 開始點選打卡
clock_in_btn = bro.find_element_by_class_name('stars')
clock_in_btn.click()
print('已進入打卡頁面')
# 將舊url更新到打卡的url
sleep(3)
n = bro.window_handles # 獲取當前瀏覽器所有視窗控制代碼
# print('當前控制代碼:', n)
bro.switch_to.window(n[-1]) # 切換到打卡視窗的控制代碼
# 如果當日提交過,選擇關閉按鈕
if '當日' in bro.page_source:
close_btn = bro.find_element_by_xpath('/html/body/div[8]/div[3]/a[1]')
close_btn.click()
# 體溫數值填入
tw = bro.find_element_by_id('input_tw')
tw.send_keys('36.7')
zwtw = bro.find_element_by_id('input_zwtw')
zwtw.send_keys('36.7')
print('溫度已填寫')
# 提交
submit_btn = bro.find_element_by_xpath('/html/body/div[1]/div/div/div/div[2]/div/div/button[1]')
submit_btn.click()
print('打卡成功')
bro.quit()
if __name__ == '__main__':
username = 'xxxxxx'
password = 'xxxxxx'
# username = input('請輸入學號:')
# password = input('請輸入密碼:')
clock_in(username, password)
最終的效果圖