用python做一個自動簽到程序(網頁)


背景:疫情期間,學校要求每天在上午10點之前填報信息。有時容易忘記填報,就會受輔導員懲罰。

我們可以使用網站訪問簽到頁面,所以這里用這個例子來圖文演示如何實現自動簽到功能

程序中使用到的Python庫有:

selenium:selenium是一個用電腦模擬人操作瀏覽器網頁,可以實現自動化,測試等的庫。

time:此模塊提供各種時間相關功能。會用到其sleep()方法讓程序掛起一會兒。

1、准備工作

  1. 這里python使用chrome瀏覽器來打開網頁。就需要安裝chrome瀏覽器的驅動——chromedrive。

    1. 首先康康本電腦chrome瀏覽器的版本。

      用python做一個自動簽到程序_查看chrome版本

      用python做一個自動簽到程序_查看chrome版本2

    2. 下載版本對應的瀏覽器驅動。

      下載位置:https://chromedriver.chromium.org/downloads

      這里咱們下載96.0.4664.45版本

      用python做一個自動簽到程序_下載chrome驅動1

      用python做一個自動簽到程序_下載chrome驅動2

    3. 將驅動解壓放到指定文件夾內。

      用python做一個自動簽到程序_解壓放到指定文件夾

      解壓后,要將文件放到兩個位置

      1. chrome文件位置

        用python做一個自動簽到程序_chromedriver2

      2. python解釋器(Scripts文件夾中)

        用python做一個自動簽到程序_當前解釋器的位置

        用python做一個自動簽到程序_chromedriver

    4. 將chrome文件位置添加到環境變量

      用戶變量-->Path 添加chrome瀏覽器的文件位置

      用python做一個自動簽到程序_環境變量

  2. 當驅動配置完成后,試試python是否能自動打開chrome並訪問指定url。

用python做一個自動簽到程序_成功啟動chrome訪問url

上圖是python成功打開瀏覽器並訪問指定url。那么此時准備工作全部完成。

2、代碼實現

以下代碼為示例,但核心功能就是這一小段:

from selenium import webdriver
import time
from selenium.webdriver.common.by import By


def sign_in():
    driver = webdriver.Chrome()
    url = 'https://xxxxxx'
    driver.get(url)

    # 載入到這個網頁后,掛起5秒,再繼續執行。
    # 掛起5秒是因為加載網頁是需要一定時間的,當網頁還沒完全加載出來時,程序早就執行到下一句了,而下一句代碼是		到網頁中尋找指定元素。所以,當網頁還沒加載出來時,程序會因為找不到指定元素而報錯。
    time.sleep(5)
    # 用xpath的方式尋找指定元素。
    # confirmElement = driver.find_element_by_xpath('//*[@id="CHECK"]/div[2]/div[2]/input')。
    # 上面的寫法在新版本中被selenium棄用了,改用下面的寫法。
      confirmElement = driver.find_element(By_XPATH, '//*[@id="CHECK"]/div[2]/div[2]/input')
    # 點擊指定元素
    confirmElement.click()


if __name__ == '__main__':
    sign_in()

這里提一下如何獲取元素的xpath:

用python做一個自動簽到程序_元素xpath

3、python部分踩過的坑和建議:

曾經也用過這種方法,當時每次都是失敗,就是因為沒有 time.sleep() 導致程序總是報錯 “找不到該元素”

這是個大坑。

所以,在每個點擊之前,需要加載的地方都加一個 time.sleep() 會更好,確保能夠找到所需元素。

現在,這個程序可以幫你完成點擊簽到的任務。那么,想要每天自動簽到的話就只剩讓他定時執行了。

但是要讓他每天定時自動執行,自動簽到的話,最好將該程序部署到網絡服務器上。

4、部署到服務器上

我這里使用了騰訊雲服務器。

准備工作:

  • Linux服務器上要安裝python 3解釋器(python3以上版本)。linux系統安裝python3和pip

    用python做一個自動簽到程序_Linux安裝python3

  • 安裝python運行時必要的庫。(selenium、time、requests)

    pip3 install selenium
    pip3 install time
    pip3 install requests
    
  • 安裝Linux版本的chrome。

    (嘗試過安裝指定版本的chrome,但是沒找到方法,只能安裝最新版chrome)

    yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
    
  • 安裝chrome必要的庫。

    yum install mesa-libOSMesa-devel gnu-free-sans-fonts wqy-zenhei-fonts
    
  • 下載Linux上chrome對應版本的chromedriver,並放入Linux系統中。可以使用 Xftp 從Windows系統將文件傳輸到Linux服務器上。

    下載位置:https://chromedriver.chromium.org/downloads

    google-chrome --version	#查看chrome版本
    
  • 解壓下載的chromedriver。

    unzip chromedriver_linux64.zip
    
  • 將解壓的文件放到 /usr/bin/文件夾下

    mv chromedriver /usr/bin
    
  • 給予執行權限

    chmod +x /usr/bin/chromedriver
    

至此,已經能在服務器中執行該自動簽到的python程序了。還差最后一步——定時執行

5、定時任務

需要每天自動簽到的話,必須讓這個程序在每天定時運行一次。Linux上可以直接使用crontab進行定時任務。

crond 是linux下用來周期性的執行某種任務或等待處理某些事件的一個守護進程,與windows下的計划任務類似

Linux Crontab定時運行python程序

# 每天0點30分定時執行/export/python/Demo.py。(執行必須使用python3全路徑,只用python3無反應)
30 0 * * * /usr/local/python3.8/bin/python3 /export/python/Demo.py

6、源碼

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
import requests
from selenium.webdriver.common.by import By


def automatic(person):
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')
    chrome_options.add_argument("window-size=1024,768")
    # 由於是在Linux中運行,沒有chrome頁面。所以要使用添加沙盒模式(不顯示運行)
    chrome_options.add_argument("--no-sandbox")
    driver = webdriver.Chrome(options=chrome_options)
    try:
        url = 'http://dw10.fdzcxy.edu.cn/datawarn/ReportServer?formlet=app/sjkrb.frm&op=h5&userno=' + person[1] + '#/form'
        driver.get(url)

        # 載入到這個網頁后,睡5秒讓頁面元素全部加載出來,再繼續執行。
        # 不然當頁面元素還沒加載出來就執行以下代碼,會報錯。
        time.sleep(5)

        # 選擇省份
        province = driver.find_element(By.XPATH, '//*[@id="SHENG"]/div[2]')
        province.click()
        time.sleep(3)
        province_input = driver.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div/div/div/div[2]/div/div[1]/div/div[1]/div/input')
        province_input.click()
        time.sleep(3)
        province_input.send_keys(person[2])
        time.sleep(7)
        check = driver.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div/div/div/div[2]/div/div[2]/div/div/div/div/div/div[3]/div')
        check.click()

        time.sleep(5)
        # 選擇市
        city = driver.find_element(By.XPATH, '//*[@id="SHI"]/div[2]')
        city.click()
        time.sleep(3)
        city_input = driver.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div/div/div/div[2]/div/div[1]/div/div[1]/div/input')
        city_input.click()
        time.sleep(3)
        city_input.send_keys(person[3])
        time.sleep(7)
        check = driver.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div/div/div/div[2]/div/div[2]/div/div/div/div/div/div[3]/div')
        check.click()

        time.sleep(5)
        # 選擇市
        counties = driver.find_element(By.XPATH, '//*[@id="QU"]/div[2]')
        counties.click()
        time.sleep(3)
        counties_input = driver.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div/div/div/div[2]/div/div[1]/div/div[1]/div/input')
        counties_input.click()
        time.sleep(3)
        counties_input.send_keys(person[4])
        time.sleep(7)
        check = driver.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div/div/div/div[2]/div/div[2]/div/div/div/div/div/div[3]/div')
        check.click()

        time.sleep(5)
        # 點擊“承諾”按鈕
        confirmElement = driver.find_element(By.XPATH, '//*[@id="CHECK"]/div[2]/div[2]/input')
        confirmElement.click()

        time.sleep(5)
        # 點擊“提交”按鈕
        submitElement = driver.find_element(By.XPATH, '//*[@id="SUBMIT"]/div[2]')
        submitElement.click()

        time.sleep(5)
        # 點擊“確認”按鈕
        lastElement = driver.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div/div/div[2]')
        lastElement.click()

        time.sleep(1)

        # 用pushplus公眾號向微信推送消息,提示每次簽到成功。(預防某天簽到失敗還能有手動再簽的機會)
        content = person[0] + '每日填報成功'
        send_message_url = 'http://www.pushplus.plus/send?token=' + person[5] + '&content=' + content
        requests.get(url=send_message_url)
    finally:
        driver.quit()


if __name__ == '__main__':
    persons = [
        ['(姓名)', '(學號)', '福建省', '福州市', '鼓樓區', '(pushplus的token)']
    ]
    for p in persons:
        print(p)
        automatic(p)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM