1. 程式人生 > 其它 >學校的自動打卡

學校的自動打卡

學校每天都要讓我們去打卡,雖然時間很短,但還是要手動操作,我自己寫了個程式,來代替手動打卡。

資訊門戶登入

首先,要在資訊門戶進行登入。進行資訊蒐集,先找到登入框的使用者名稱和密碼的所在處,發現可以用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)

最終的效果圖
在這裡插入圖片描述