Python:疫情通定時自動填寫(附代碼)

前言

本文的文字及圖片來源於網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。

 

 

 

自疫情始,學校就要求學生每天在學校內系統填寫個人每日疫情相關情況,稱爲疫情通。

但是,由於個人原因,出現了下圖情況。

 

 

記性太差,人又懶,於是決定用Python實現自動化定時任務。

1、核心模塊

打開IEChrome。

 

 

打開網頁按下F12拿到請求頭和請求體。

(假裝此處有圖片)

Pycharm啓動!

根據拿到的請求頭和請求體,完成核心代碼編寫。


 
url = "https://xxcapp.xidian.edu.cn/ncov/wap/default/save"
headers = {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
           'Accept': 'application/json, text/javascript, */*; q=0.01',
           'Accept-Language': 'zh-cn',
           'Accept-Encoding': 'gzip, deflate, br',
           'Host': 'xxcapp.xidian.edu.cn',
           'Origin': 'https://xxcapp.xidian.edu.cn',
           'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/605.1.15 (KHTML, like Gecko) '
                         'Version/13.1 Safari/605.1.15',
           'Connection': 'keep-alive',
           'Referer': 'https://xxcapp.xidian.edu.cn/ncov/wap/default/index',
           'Content-Length': '2314',
           # Cookie是身份標識
           'Cookie': 'Hm_lpvt_48b682d5d22a90111e44886b972e3268=1590108209; '  # Hm_lpvt_xxxxxxx 爲當前時間戳(秒)
           # Hm_lvt_xxx 爲一串時間戳。最近的一次訪問時間戳追加在後面,最多保留4個時間戳。可以通過關閉瀏覽器然後再訪問相同頁面查看其cookie值來驗證。
                     'Hm_lvt_48b682a90111e46b9d4885d2272e3268=1590108209; UUkey=99cf86f295b522e264680402bf6b221e; '
                     'Uqn3iPIDZBpD3wJU=vqtbQwSD1sjDM; eai-sess=prshbd3vo96po8i27a4mod1i67',
           'X-Requested-With': 'XMLHttpRequest',
           }

data = {
    'uid': '123671', 'date': str(datetime.date.today() - datetime.timedelta(days=1)).replace("-", ""),
    'tw': '3',  # 體溫:第三項,36.5-36.9
    'sfcxtz': '0',  # 是否出現
    'sfyyjc': '0',  # 是否醫院檢查
    'jcjgqr': '0',  # 檢查結果確認
    'sfjcbh': '0',  # 是否接觸病患
    'sfcxzysx': '0',  # 是否出現
    'address': '', 'area': '', 'province': '',  # 地址
    'city': '', # 城市
    # 伽利略定位系統詳情
    'geo_api_info': '{"type":"complete","position":{"P":11.203296169705,"O":11.667691514757,"lng":11.667692,'
                    '"lat":11.203296},"location_type":"html5","message":"Get ipLocation failed.Get geolocation '
                    'success.Convert Success.Get address success.","accuracy":15,"isConverted":true,"status":1,'
                    '"addressComponent":{"citycode":"0001","adcode":"123456","businessAreas":[],'
                    '"neighborhoodType":"","neighborhood":"","building":"","buildingType":"","street":"",'
                    '"streetNumber":"","province":"","city":"","district":"","township":""},'
                    '"formattedAddress":"","roads":[],"crosses":[],"pois":[],'
                    '"info":"SUCCESS"}',
    'created': str(int(time.time())),  # 創建時間
    'sfzx': '0',  # 是否在校 否
    'sfjcwhry': '0',  # 是否接觸武漢人員 否
    'sfcyglq': '0',  # 是否處於隔離期 否
    'sftjwh': '0',  # 是否途徑武漢 否
    'sftjhb': '0',  # 是否途徑湖北 否
    'fjsj': '0',
    'sfjchbry': '0',  # 是否接觸湖北人員 否
    'sfsfbh': '0',  # 是否
    'jhfjsftjwh': '0',  # *****是否途徑武漢 否
    'jhfjsftjhb': '0',  # *****是否途徑湖北 否
    'szsqsfybl': '0',
    'sfygtjzzfj': '0',  # 是否
    'sfjcjwry': '0',  # 是否接觸境外人員 否
    'id': '4393912',
    'ismoved': '0',  # 與上次地點是否有不同
}
requests.post(url=url, data=data, headers=headers)

上述代碼已經可以虛擬我們的提交能力了,但是還達不到自動化需求。最終目標是能夠放在Linux服務器上每日早晨自動運行一次,並接收到反饋。所以需要再加一個模塊,我選擇了郵件通知方式。

2、通知模塊

def sendEmail(message):
    msg_from = '[email protected]'  # 發送方郵箱
    passwd = ''  # 發送方郵箱的授權碼
    msg_to = '[email protected]'  # 收件人郵箱

    subject = "疫情通"  # 主題
    msg = MIMEText(message)
    msg['Subject'] = subject
    msg['From'] = msg_from
    msg['To'] = msg_to
    try:
        s = smtplib.SMTP_SSL("smtp.qq.com", 465)  # 郵件服務器及端口號
        s.login(msg_from, passwd)
        s.sendmail(msg_from, msg_to, msg.as_string())
        print('[' + str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) + "]郵件發送成功,郵件內容:" + message)
    except s.SMTPException:
        print('[' + str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) + "]郵件發送失敗,郵件內容:" + message)
    finally:
        s.quit()

此函數接收字符串爲參,並將此字符串送至目標郵箱。

那麼核心代碼最後一行便改爲

sendEmail(eval(requests.post(url=url, data=data, headers=headers).text)['m'])

代碼編寫完畢,文末有完整版。接下來實現自動化運行。

3、自動化模塊

Terminal啓動!

將本py文件scp至服務器,然後在同目錄下創建output.log文件,用以記錄每日信息(考慮到郵件發送失敗的情況)。

編輯/etc/crontab,在最後的#上面加上下圖內容,最後兩個分別是py文件和log文件的路徑,整行內容表示的是在每天8:30以root身份自動運行右側命令。

 

 

4、最終效果

由下圖log文件內容可知,2020-05-25早8時30分3秒完成此任務,也就是說此任務運行一次需要三秒。

 

 

 

在郵箱中也可以看到已經收到郵件。

 

5、完整代碼

歡迎點擊左上角關注小編,除了分享技術文章之外還有很多福利,私信學習資料可以領取包括不限於Python實戰演練、PDF電子文檔、面試集錦、學習資料等。


 
import time
import requests
import smtplib
import datetime
from email.mime.text import MIMEText


def sendEmail(message):
    msg_from = '[email protected]'  # 發送方郵箱
    passwd = ''  # 發送方郵箱的授權碼
    msg_to = '[email protected]'  # 收件人郵箱

    subject = "疫情通"  # 主題
    msg = MIMEText(message)
    msg['Subject'] = subject
    msg['From'] = msg_from
    msg['To'] = msg_to
    try:
        s = smtplib.SMTP_SSL("smtp.qq.com", 465)  # 郵件服務器及端口號
        s.login(msg_from, passwd)
        s.sendmail(msg_from, msg_to, msg.as_string())
        print('[' + str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) + "]郵件發送成功,郵件內容:" + message)
    except s.SMTPException:
        print('[' + str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) + "]郵件發送失敗,郵件內容:" + message)
    finally:
        s.quit()


url = "https://xxcapp.xidian.edu.cn/ncov/wap/default/save"
headers = {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
           'Accept': 'application/json, text/javascript, */*; q=0.01',
           'Accept-Language': 'zh-cn',
           'Accept-Encoding': 'gzip, deflate, br',
           'Host': 'xxcapp.xidian.edu.cn',
           'Origin': 'https://xxcapp.xidian.edu.cn',
           'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/605.1.15 (KHTML, like Gecko) '
                         'Version/13.1 Safari/605.1.15',
           'Connection': 'keep-alive',
           'Referer': 'https://xxcapp.xidian.edu.cn/ncov/wap/default/index',
           'Content-Length': '2314',
           # Cookie是身份標識
           'Cookie': 'Hm_lpvt_48b682d5d22a90111e44886b972e3268=1590108209; '  # Hm_lpvt_xxxxxxx 爲當前時間戳(秒)
           # Hm_lvt_xxx 爲一串時間戳。最近的一次訪問時間戳追加在後面,最多保留4個時間戳。可以通過關閉瀏覽器然後再訪問相同頁面查看其cookie值來驗證。
                     'Hm_lvt_48b682a90111e46b9d4885d2272e3268=1590108209; UUkey=99cf86f295b522e264680402bf6b221e; '
                     'Uqn3iPIDZBpD3wJU=vqtbQwSD1sjDM; eai-sess=prshbd3vo96po8i27a4mod1i67',
           'X-Requested-With': 'XMLHttpRequest',
           }

data = {
    'uid': '123671', 'date': str(datetime.date.today() - datetime.timedelta(days=1)).replace("-", ""),
    'tw': '3',  # 體溫:第三項,36.5-36.9
    'sfcxtz': '0',  # 是否出現
    'sfyyjc': '0',  # 是否醫院檢查
    'jcjgqr': '0',  # 檢查結果確認
    'sfjcbh': '0',  # 是否接觸病患
    'sfcxzysx': '0',  # 是否出現
    'address': '', 'area': '', 'province': '',  # 地址
    'city': '',  # 城市
    # 伽利略定位系統詳情
    'geo_api_info': '{"type":"complete","position":{"P":11.203296169705,"O":11.667691514757,"lng":11.667692,'
                    '"lat":11.203296},"location_type":"html5","message":"Get ipLocation failed.Get geolocation '
                    'success.Convert Success.Get address success.","accuracy":15,"isConverted":true,"status":1,'
                    '"addressComponent":{"citycode":"0001","adcode":"123456","businessAreas":[],'
                    '"neighborhoodType":"","neighborhood":"","building":"","buildingType":"","street":"",'
                    '"streetNumber":"","province":"","city":"","district":"","township":""},'
                    '"formattedAddress":"","roads":[],"crosses":[],"pois":[],'
                    '"info":"SUCCESS"}',
    'created': str(int(time.time())),  # 創建時間
    'sfzx': '0',  # 是否在校 否
    'sfjcwhry': '0',  # 是否接觸武漢人員 否
    'sfcyglq': '0',  # 是否處於隔離期 否
    'sftjwh': '0',  # 是否途徑武漢 否
    'sftjhb': '0',  # 是否途徑湖北 否
    'fjsj': '0',
    'sfjchbry': '0',  # 是否接觸湖北人員 否
    'sfsfbh': '0',  # 是否
    'jhfjsftjwh': '0',  # *****是否途徑武漢 否
    'jhfjsftjhb': '0',  # *****是否途徑湖北 否
    'szsqsfybl': '0',
    'sfygtjzzfj': '0',  # 是否
    'sfjcjwry': '0',  # 是否接觸境外人員 否
    'id': '4393912',
    'ismoved': '0',  # 與上次地點是否有不同
}
sendEmail(eval(requests.post(url=url, data=data, headers=headers).text)['m'])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章