python+selenium 實現疫情自動填報(前面兩個都不會也可以做)

0.前言

疫情如此嚴峻,學校也每日監督每個學生去打卡,可能由於某天因爲事情耽擱了,導員在大羣裏@我的時候就很尷尬,就想着學習一下如何實現自動打卡。也在網上找了很多博客,發現好像都很複雜,也難以入手。沒得辦法最後只得硬挑一個博客去看去學習。
在過程中也發現基本上是兩種方法去實現自動打卡的:

  • 模擬客戶端向服務端直接發送報文
  • 利用瀏覽器驅動去模仿人操作瀏覽器去填報

個人覺得第二個方法簡單一點,所需知識也不多(真正大佬請忽略)。

1.安裝python和selenium以及瀏覽器驅動(chrome爲例)

1.1安裝python

Python官網:https://www.python.org/ 不過速度較慢
百度網盤:本人使用的版本 爲python 3.7.1
鏈接:https://pan.baidu.com/s/1SudrBM5ILIyTReImZrDGuA
提取碼:410n
下載後,雙擊下載包,進入 Python 安裝嚮導,安裝非常簡單,你只需要使用默認的設置一直點擊"下一步"直到安裝完成即可。
如果沒有填加到環境變量中,請添加至環境變量中:
在這裏插入圖片描述

1.2安裝selenium

selenium是一個瀏覽器爲web自動化測試工具,原本是用來檢測瀏覽器的。由於selenium可以控制瀏覽器,即用selenium打開的瀏覽器內容都可以通過特定的方式獲取到。一般用於獲取javaScript動態渲染的頁面。
最簡單的方法:win+r打開命令行,輸入:

pip install selenium 

靜待安裝完成。安裝完成後,在輸入:

pip list

即可查看是否安裝成功。在這裏插入圖片描述
如果說過程中報錯了或者沒有成功。可能是沒有下載pycharm。請參考下載教程:https://www.runoob.com/w3cnote/pycharm-windows-install.html
下載專業版本(教師或者學生可以免費使用,具體申請可以自行百度),
如果先麻煩的話,社區版完全免費,對於此項目也是完全可行的。

1.3下載對應瀏覽器驅動(以chrome爲例)

1.3.1查看自己的瀏覽器版本

瀏覽器地址欄輸入:chrome://version 會得到關於你的chrome瀏覽器的具體信息。以下爲部分截圖:在這裏插入圖片描述
例如 我使用的就是上圖中第一行所寫的:78.0.3904.70 (正式版本)

1.3.2下載對應瀏覽器驅動

下載地址:

下載完成後,進行解壓。解壓後將webdriver移動/複製到chrome瀏覽器安裝目錄下。在這裏插入圖片描述
最後將chrome.exe的路徑添加到環境變量的path中去:
在這裏插入圖片描述

2.編寫代碼

這一部分是核心,卻也是最簡單的部分。因爲此次使用的方法是模擬瀏覽器操作,想一想也就兩步:

  1. 找到一個元素
  2. 輸入或者點擊

完事了!!!
本文是以西工大和西電的健康填報爲例。

2.1定位一個元素

selenium webdriver中有很多的定位方法:
By.id()、By.xpath()、By.linkText()、By.partialLinkText() 、By.tagName() 、By.className()、By.cssSelector()等等
通過名字也都可以看出來,無非是每一個標籤的id、name、class、xpath等等去定位的。在網頁中摁f12,可以查看源代碼。就能準確獲知每一個標籤的屬性了,通過屬性去定位就OK了。
本人說一下我使用的最笨的方法,不管你啥標籤,我都是用xpath去定位,又準又好(對於一些學習前端的小夥伴,建議都去試一試)。
那麼xpath是什麼呢?問得好,不知道,自個百度吧,我也講不清
雖然講不清,但是不妨礙我去獲取標籤的xpath:
f12打開源代碼,找到網頁上對應的元素。右鍵單擊-》copy-》copy xpath 。
這樣就講該元素的xpath複製到了剪貼板了。
使用下面這個函數就可以定位了:
driver.find_element_by_xpath()
其他的也一樣例如:
driver.find_element_by_partial_link_text()

2.2 對定位到的元素模擬操作。

  • 點擊:調用click()函數就模擬了一次點擊
  • 清空文本框:clear()
  • 輸入文本:send_keys()
    以上內容就足以填寫所有的東西了。

2.3大功告成,完整代碼(供參考,內爲西工大和西電)

西工大版本(可以提交多次,拿來作實驗):

from selenium import webdriver
import time

#西工大
# 打開chrome瀏覽器
driver = webdriver.Chrome()
# 進入健康情況填報官網
url = r'http://yqtb.nwpu.edu.cn/wx/xg/yz-mobile/index.jsp'
driver.get(url)
# 最大化窗口
driver.maximize_window()
# 登錄信息
username = driver.find_element_by_id('username')
stu_number = '自己的學號'
username.send_keys(stu_number)
stu_password = '自己的密碼'
password = driver.find_element_by_id('password')
password.send_keys(stu_password)
# 點擊登錄
driver.find_element_by_class_name('submit_button').click()
time.sleep(1)
# 點擊健康登記
driver.find_element_by_partial_link_text('健康登記').click()

# 因爲西工大會自動記錄上一天的信息,所以不需要填報其他信息可直接提交
'''
#如果需要更改一些內容可參考以下代碼
# 當前所在位置
driver.find_element_by_xpath('//*[@id="rbxx_div"]/div[3]/label[3]').click()

# 由於本人選取的國內,所有還有省市區的選擇
driver.find_element_by_xpath('//*[@id="province"]/option[18]').click()
driver.find_element_by_xpath('//*[@id="city"]/option[4]').click()
driver.find_element_by_xpath('//*[@id="district"]/option[4]').click()

# 近15天是否前往或經停過武漢市、湖北省,或其他有病例報告的社區?
driver.find_element_by_xpath('//*[@id="rbxx_div"]/div[6]/label[3]').click()
driver.find_element_by_xpath('//*[@id="sfjthb_ms"]').clear()
driver.find_element_by_xpath('//*[@id="sfjthb_ms"]').send_keys('人在湖北')

# 近15天接觸過出入或居住在武漢市、湖北省的人員,以及其它有病例社區的發熱或呼吸道症狀患者?
driver.find_element_by_xpath('//*[@id="rbxx_div"]/div[8]/label[3]').click()
driver.find_element_by_xpath('//*[@id="hbjry_ms"]').clear()
driver.find_element_by_xpath('//*[@id="hbjry_ms"]').send_keys('人在湖北')

# 近15天您或家屬是否接觸過疑似或確診患者,或無症狀感染患者(核酸檢測陽性者)?
driver.find_element_by_xpath('//*[@id="rbxx_div"]/div[10]/label[1]').click()

# 今天的體溫範圍
driver.find_element_by_xpath('//*[@id="rbxx_div"]/div[12]/label[1]').click()

# 您或家屬有無疑似症狀?(可多選) 選擇不上不明原因
driver.find_element_by_xpath('//*[@id="rbxx_div"]/div[14]/label[1]/div[1]').click()

# 您或家屬當前健康狀態
driver.find_element_by_xpath('//*[@id="rbxx_div"]/div[17]/label[1]').click()

# 您或家屬是否正在隔離?(隔離是根據上級單位、醫院相關要求的居家或封閉性隔離,宅在家的不屬隔離)
driver.find_element_by_xpath('//*[@id="rbxx_div"]/div[20]/label[1]').click()
'''
# 點擊提交信息
driver.find_element_by_partial_link_text('提交填報信息').click()
time.sleep(1)
# 鄭重承諾
driver.find_element_by_xpath('//*[@id="qrxx_div"]/div[2]/div[25]').click()
# 確認提交
driver.find_element_by_partial_link_text('確認提交').click()
time.sleep(2)
# 關閉瀏覽器
driver.close()

西電版本(僅可提交一次,請慎重):

from selenium import webdriver
import time

# 西電
# 打開chrome瀏覽器
driver = webdriver.Chrome()
# 進入健康情況填報官網
url = r'https://xxcapp.xidian.edu.cn/ncov/wap/default'
driver.get(url)
# 最大化窗口
#driver.maximize_window()

# 登錄信息
username = driver.find_element_by_xpath('//*[@id="app"]/div[2]/div[1]/input');
stu_number = '自己的學號'
username.send_keys(stu_number)
stu_password = '自己的密碼'
password = driver.find_element_by_xpath('//*[@id="app"]/div[2]/div[2]/input');
password.send_keys(stu_password)
# 點擊登錄
driver.find_element_by_xpath('//*[@id="app"]/div[3]').click()
time.sleep(5)
# 由於西電也會保存上日記錄,所以只需要獲取當前位置即可。如果想改變某些內容,可參考上西工大版本
driver.find_element_by_xpath('/html/body/div[1]/div/div/section/div[4]/ul/li[8]/div/input').click()
# 等待獲取地理位置
time.sleep(5)
# 提交
driver.find_element_by_xpath('/html/body/div[1]/div/div/section/div[5]/div/a').click();
time.sleep(5)
# 確認提交
driver.find_element_by_xpath('//*[@id="wapcf"]/div/div[2]/div[2]').click()
# 提交成功確定
driver.find_element_by_xpath('//*[@id="wapat"]/div/div[2]/div').click()
# 關閉瀏覽器
driver.close()

PS:代碼中的time.sleep()是讓線程暫停一段時間,單位爲秒(s)。目的是爲了防止部分頁面打開(跳轉)較慢,導致後續代碼運行失敗。

2.4 發個qq郵件通知(不需要也可以直接跳過)

先上代碼:填好對應的郵箱、授權碼(獲取方法在註釋中)、以及發送內容即可。

import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 發送給個人郵箱
# 用於構建郵件頭
# 發信方的信息:發信郵箱,QQ 郵箱授權碼
from_addr = '發送方@qq.com'
# 進入qq郵箱->設置->賬戶->找到stmp服務,點擊開啓。驗證後會給你一個授權碼,直接複製,填入下方即可
password = '自己的授權碼'

# 收信方郵箱
to_addr = '收信方@qq.com'

# 發信服務器
smtp_server = 'smtp.qq.com'

# 郵箱正文內容,第一個參數爲內容(正文部分),第二個參數爲格式(plain 爲純文本),第三個參數爲編碼
msg = MIMEText('今日已經填報好健康信息', 'plain', 'utf-8')

# 郵件頭信息
msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
msg['Subject'] = Header('每日疫情填報情況')

# 開啓發信服務,這裏使用的是加密傳輸
server = smtplib.SMTP_SSL(smtp_server)
server.connect(smtp_server, 465)
# 登錄發信郵箱
server.login(from_addr, password)
# 發送郵件
server.sendmail(from_addr, to_addr, msg.as_string())
# 關閉服務器
server.quit()

2.5 配合自動開關機,實現自動打卡。

定時自動關機的方法很簡單:
控制面板-》搜索計劃任務-》打開計劃任務-》點擊右側創建基本任務-》輸入名稱(必填)及詳細內容(選填)-》下一步,觸發器選擇‘每天’-》下一步,選擇好每一天的觸發時間-》下一步,操作選擇‘啓動程序’-》下一步,程序或腳本 中填入 ‘shutdown’,參數爲 ‘-s -t 00’ 意思是延遲0s關機,也就是觸發時立即關機。-》完成。
關於定時開機:
我嘗試了很多種方法,包括創建計劃任務、修改註冊表、定時開關機軟件等等,都沒能夠成功。本人也正在努力!

以上就是全部內容了,有知道如何自動開機的小夥伴,一定要評論告訴我呀!

歡迎評論和指正!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章