python:每日疫情上報,完成后發送截圖到郵箱
- 前言
- 1.疫情上報(以哈工大(深圳)為例)
- 1.1安裝selenium
- 1.2安裝webdriver瀏覽器驅動(以Egde為例)
- 1.3 代碼介紹
- 2.SMTP發送郵件(QQ郵箱為例)
- 2.1需要修改的部分
- 2.2 效果圖
- 3.設定為定時上報
- 4.整體代碼
- 5.不足
- 參考博客
前言
開學以來,學校一直都要求每日疫情上報,時常會忘記,為了更好的配合學校作業,按時上報,在室友的提醒下,想到寫一個python腳本完成此任務,完成方式主要兩種,方法一直接用 selenium 模擬瀏覽器操作實作動態HTML處理,完成報送,方法二是根據資料特征直接封裝有效的post包發至目標服務器,實作資訊報送,并監聽服務器回應,
方法一其實是屬于“半自動化”,存在一些弊端,但是實作簡單,本著以最快的最容易理解的方式撰寫程式,選用此法,方法二是最好的實作方式,但是較為復雜,教程可參考:疫情期間每日健康報送任務的自動化處理
1.疫情上報(以哈工大(深圳)為例)
1.1安裝selenium
Selenium 是一個用于Web應用程式測驗的工具,Selenium測驗直接運行在瀏覽器中,就像真正的用戶在操作一樣,支持的瀏覽器包括IE,Mozilla Firefox,Safari,Google Chrome,Opera,Edge等,
安裝方法:win+r 輸入cmd,然后安裝selenium:
pip install selenium
可以通過下面命令,查看selenium資訊,確認已經安裝完畢,
pip show selenium
安裝程序截圖如下,我已安裝selenium,故輸入第一個命令時會顯示已安裝,

1.2安裝webdriver瀏覽器驅動(以Egde為例)
1.首次按打開網頁設定,查看Egde瀏覽器版本號,

2. 點擊msedgedriver.exe下載鏈接,下載對應版本號的瀏覽器驅動,一般都是64位作業系統,點擊x64進行下載,

3.下載解壓后將msedgedriver.exe拷貝到瀏覽器安裝檔案夾(桌面右擊瀏覽器圖示,打開檔案位置即可找到),記住msedgedriver.exe檔案位置,后面程式中設定會用到,(注:另外一種方法,將其加入環境變數的path,程式中就不用設定,暫不介紹,)

注: 其他瀏覽器的webdriver下載鏈接可在此博文中(點擊跳轉)找到,該博文是以chrome為例進行講解的,
1.3 代碼介紹
本著以簡單快捷的方式完成哈工大(深圳)疫情上報,在此只介紹關鍵部分,其他學校或者對相關內容感興趣的同學可做深層次了解,以便修改完善功能,此部分代碼實作的功能是疫情上報,并將截圖保存至檔案夾中,用于下一部分的郵件發送,
1.3.1需要修改的部分(代碼10、11行):
輸入學號和密碼,可支持輸入多個同學的學號與密碼,實作多人上報,
stu_number = ['20S153xxx(1)', '20S153xxx(2)', '20S153xxx(3)', '20S153xxx(4)'] # 輸入不同同學的學號,需修改
stu_password = ['xxxxx(1)', 'xxxxx(2)', 'xxxxx(3)', 'xxxxx(4)'] # 輸入不同同學的密碼,需修改
修改瀏覽器驅動存放的位置(代碼17行):
driver_url = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedgedriver.exe" # 輸入webdriver放置的路徑
注:其他學校的同學要修改上報官網(代碼20行),
# 進入疫情上報官網,根據學校上報網址進行修改,
driver.get("https://sso.hitsz.edu.cn:7002/cas/login?service=http%3A%2F%2Fxgsm.hitsz.edu.cn%2Fzhxy-xgzs%2Fcommon%2FcasLogin%3Fparams%3DL3hnX21vYmlsZS94c0hvbWU%3D")
1.3.2 部分代碼介紹:
程式中很關鍵的部分是找到對應的元素,并進行點擊、輸入或修改等相關的操作,詳細的定位與操作可參考博客:Python語言selenium包webdriver,定位網頁元素的8種方法
在本程式中用到了以下幾種:
1.id定位:find_element_by_id(“id值”);id屬性是唯一的
2.class定位:元素的類名,find_element_by_class_name(“class值”)
3.link定位:專門用來定位文本鏈接,find_element_by_link_name(“text”);
4.XPath定位:find_element_by_xpath(""),分為絕對定位和相對定位,
在登陸界面使用的是id和class定位,打開網頁,按F12查看網頁源代碼,查找相應位置,

對應代碼如下,send_keys()用于輸入資訊,click()模擬點擊:
username = driver.find_element_by_id('username') # 學號定位
username.send_keys(stu_number[i]) # 輸入學號
password = driver.find_element_by_id('password') # 密碼定位
password.send_keys(stu_password[i]) # 輸入密碼
driver.find_element_by_id('rememberMe').click() # 點擊記住密碼
driver.find_element_by_class_name('landing_btn_bg').click() # 登錄
第二個界面,點擊每日上報,使用link定位:

對應代碼:
driver.find_element_by_partial_link_text('每日上報').click()
第三個界面的新增元素,產用的是xpath相對定位,
對應代碼:
driver.find_element_by_xpath('//*[@class="weui-btn_cell weui-btn_cell-primary open-popup"]/div[1]').click() # 點擊新增
time.sleep(5) # 注意程式延時問題,時間短導致未提交就已經退出了,
第四個界面填報相關資訊,由于哈工大(深圳)填報后會有之前的記錄,所以直接提交即可,使用id定位和XPath絕對定位,

對應代碼:
# 因為哈工大會自動記錄上一天的資訊,所以不需要填報其他資訊可直接提交
driver.find_element_by_id('txfscheckbox').click() # 我已仔細閱讀并同意
time.sleep(1)
driver.find_element_by_xpath('/html/body/div[5]').click()
time.sleep(5) # 延時,完成后界面回傳進行截圖,
此后的操作便是截圖保存,詳細資訊見第四部分-整體代碼
2.SMTP發送郵件(QQ郵箱為例)
此部分實作的功能的是使用SMTPF發送郵件,并將疫情上報截圖發送到對應同學郵箱,
SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議,它是一組用于由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式,python的smtplib提供了一種很方便的途徑發送電子郵件,它對smtp協議進行了簡單的封裝,(參考:Python SMTP發送郵件)
2.1需要修改的部分
from_address = 'xxxxxx@qq.com' # 發送方郵箱(自己的郵箱)
password_email = 'xxxxxxxx' # 進入qq郵箱->設定->賬戶->找到stmp服務,點擊開啟,驗證后會給你一個授權碼,直接復制,填入下方即可
to_address = ['xxx(1)@qq.com', 'xxx(2)@qq.com', 'xxx(3)@qq.com', 'xxx(4)@qq.com'] # 收信方郵箱
QQ郵箱授權碼獲取方式如下,進入qq郵箱->設定->賬戶->找到stmp服務,點擊開啟:


郵件發送的內容是:文字+圖片+附件,具體的代碼介紹見第四部分-整體代碼,有詳細注釋,
2.2 效果圖

3.設定為定時上報
由于沒有服務器,所以只有定時開機+計劃任務的方式執行python腳本,
1.win10設定計劃任務執行python,不重復介紹,參看教程:win10計劃任務定時啟動python程式
注意設定之后要勾選使用最高權限,不然不能訪問截圖:

任務截圖:

2.定時開機需要進入bios,前提是bios支持電源管理(每個主板bios設定不同)參看教程:怎樣讓電腦定時開機
4.整體代碼
哈工大(深圳)的同學修改賬戶郵箱資訊后直接使用,可實作單人或者多人疫情上報,有兩點需要特別注意:1.點擊新增后的延時程式時間一定夠,否則會顯示未提交;2.工大每天只能上報一次,請慎重進行代碼測驗,
from selenium import webdriver
import time
from pathlib import Path
import smtplib
from email.mime.multipart import MIMEMultipart # 構建多個元素
from email.mime.image import MIMEImage # 構建郵件圖片
from email.mime.text import MIMEText # 構建郵件文本
from email.header import Header # 呼叫header檔案
# 需要修改的部分
stu_number = ['20S153xxx(1)', '20S153xxx(2)', '20S153xxx(3)', '20S153xxx(4)'] # 輸入不同同學的學號,需修改
stu_password = ['xxxxx(1)', 'xxxxx(2)', 'xxxxx(3)', 'xxxxx(4)'] # 輸入不同同學的密碼,需修改
stu_name = ['xxx(1)', 'xxx(2)', 'xxx(3)', 'xxx(4)'] # 附件加上同學名字首寫字母前綴,用以區分,不必須
from_address = 'xxxxxx@qq.com' # 發送方郵箱(自己的郵箱)
password_email = 'xxxxxxxx' # 進入qq郵箱->設定->賬戶->找到stmp服務,點擊開啟,驗證后會給你一個授權碼,直接復制,填入下方即可
to_address = ['xxx(1)@qq.com', 'xxx(2)@qq.com', 'xxx(3)@qq.com', 'xxx(4)@qq.com'] # 收信方郵箱
for i in range(len(stu_number)):
driver_url = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedgedriver.exe" # 輸入webdriver放置的路徑
driver = webdriver.Edge(executable_path=driver_url)
# 進入疫情上報官網,根據學校上報網址進行修改,
driver.get("https://sso.hitsz.edu.cn:7002/cas/login?service=http%3A%2F%2Fxgsm.hitsz.edu.cn%2Fzhxy-xgzs%2Fcommon%2FcasLogin%3Fparams%3DL3hnX21vYmlsZS94c0hvbWU%3D")
driver.maximize_window() # 最大化視窗
# 登錄資訊
time.sleep(1)
username = driver.find_element_by_id('username') # 學號定位
username.send_keys(stu_number[i]) # 輸入學號
password = driver.find_element_by_id('password') # 密碼定位
password.send_keys(stu_password[i]) # 輸入密碼
driver.find_element_by_id('rememberMe').click() # 點擊記住密碼
driver.find_element_by_class_name('landing_btn_bg').click() # 登錄
time.sleep(1)
driver.find_element_by_partial_link_text('每日上報').click()
time.sleep(1)
driver.find_element_by_xpath('//*[@class="weui-btn_cell weui-btn_cell-primary open-popup"]/div[1]').click() # 點擊新增
time.sleep(5) # 注意程式延時問題,時間短導致未提交就已經退出了,
# 因為哈工大會自動記錄上一天的資訊,所以不需要填報其他資訊可直接提交
driver.find_element_by_id('txfscheckbox').click() # 確認
time.sleep(1)
driver.find_element_by_xpath('/html/body/div[5]').click()
time.sleep(5) # 延時,完成后界面回傳進行截圖,
current_time = time.strftime(stu_name[i]+"%Y-%m-%d-%H_%M_%S", time.localtime(time.time())) # 記錄截圖時間,并以該時間命名
filename = u'.\\image' # 新創建路徑“.”表示當前整個.py檔案的路徑所在的位置,“\\”路徑分割符,其中的一個是"\"轉義符
pic_path = filename + '\\' + current_time + '.png'
if Path(filename).is_dir(): # 判斷檔案夾是否存在,不存在就新建一個新的
pass
else:
Path(filename).mkdir()
time.sleep(2)
driver.save_screenshot(pic_path) # 截取當前url頁面的圖片,并且將截取的圖片保存在指定的路徑并以截圖時間命名)
print(pic_path) # 列印路徑
time.sleep(1)
driver.close() # 關閉網頁
# 發信服務器
msg = MIMEMultipart('related') # mixed -- 混合型 alternative--文本混合 related--多媒體元素
# 郵件頭資訊
msg['From'] = Header(from_address)
msg['To'] = Header(to_address[i])
msg['Subject'] = Header('每日疫情填報情況', 'utf-8')
# 開啟發信服務,這里使用的是加密傳輸
# 正文-圖片 通過html格式來放圖片,可通過cid 編號實作上傳多個圖片
mail_msg = '''
<p>今日疫情上報,無需回復,</p>
<p>\n\t 上報截圖:</p>
<p><img src="cid:image1"></p>
'''
msg.attach(MIMEText(mail_msg, 'html', 'utf-8'))
# 添加圖片
file = open(pic_path, "rb")
img = MIMEImage(file.read())
file.close()
img.add_header('Content-ID', '<image1>')
msg.attach(img) # 正文添加圖片
# 下面的代碼是上傳附件,不必須,正文中有圖片就可以注釋掉,
file = open(pic_path, "rb")
img = MIMEImage(file.read())
file.close()
img.add_header('Content-Disposition', 'attachment', filename=current_time+'疫情上報.png')
msg.attach(img) # 正文添加附件
smtp_server = 'smtp.qq.com' # 選擇用QQ郵箱發送
server = smtplib.SMTP_SSL(smtp_server)
server.connect(smtp_server, 465) # 465 為 SMTP 埠號
server.login(from_address, password_email) # 登錄發信郵箱
server.sendmail(from_address, to_address[i], msg.as_string()) # 發送郵件
server.quit() # 關閉服務器
5.不足
1.沒有服務器,只能采取定時開機+計劃任務的方法執行程式,
2.每日上報的資訊一樣,比如溫度,程式中未修改體溫,而是使用以前填寫的體溫,直接上報,感興趣的同學可以增加此功能,
3.此實作方法只能算“半自動化”,存在需要webdriver等環境依賴,體積大,運行慢,不便封裝;每次報送需定位,程序慢,容錯率低,且不支持異地主機自動化處理;明文存盤賬戶資訊等缺點,若感興趣且有時間可用發送報文的方式實作,
參考博客
1.python+selenium 實作疫情自動填報(前面兩個都不會也可以做)
2.Python+Selenium 疫情上報自動打卡截圖發郵箱
3.Python語言selenium包webdriver,定位網頁元素的8種方法
4.Python SMTP發送郵件
5.win10計劃任務定時啟動python程式
6.怎樣讓電腦定時開機
7.疫情期間每日健康報送任務的自動化處理
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/271355.html
標籤:python
下一篇:python某漫畫app逆向
