1. 程式人生 > 程式設計 >Python實現疫情通定時自動填寫功能(附程式碼)

Python實現疫情通定時自動填寫功能(附程式碼)

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

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

Python實現疫情通定時自動填寫功能(附程式碼)

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

1、核心模組

開啟IEChrome。

Python實現疫情通定時自動填寫功能(附程式碼)

開啟網頁按下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,headers=headers).text)['m'])

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

3、自動化模組

Terminal啟動!

將本py檔案scp至伺服器,然後在同目錄下建立output.log檔案,用以記錄每日資訊(考慮到郵件傳送失敗的情況)。

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

Python實現疫情通定時自動填寫功能(附程式碼)

4、最終效果

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

Python實現疫情通定時自動填寫功能(附程式碼)

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

Python實現疫情通定時自動填寫功能(附程式碼)

5、完整程式碼

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",郵件內容:" + 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',}
data = {
  'uid': '123671',# 與上次地點是否有不同
}
sendEmail(eval(requests.post(url=url,headers=headers).text)['m'])

總結

到此這篇關於Python實現疫情通定時自動填寫功能(附程式碼)的文章就介紹到這了,更多相關Python疫情通自動填寫內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!