原理為抓包token值模擬登錄,再通過腳本將打卡數據post上傳至服務器。
大致思路:騰訊雲函數定時觸發腳本,打卡狀態通過QQ郵箱進行提醒。
一、Fiddler 抓包工具
安裝包下載: Fiddler 安裝包和 Fiddler 證書生成器
阿里雲盤地址:https://www.aliyundrive.com/s/7gtFaLxH7f5
兩個文件都下載下來后,先雙擊 FiddlerSetup.exe 進行安裝,另一個是證書生成器,暫時不用。
2.配置
打開 Fiddler ,點擊工具欄中的 Tools → Options

點擊 HTTPS 標簽,勾選框住的三項,然后點擊右邊的 Actions,選擇第二項,會彈出一個彈窗,點擊確定,之后點擊 OK 完成設置

桌面上會有一個證書

打開瀏覽器--->設置----->搜索證書

點擊“管理證書”,點擊“導入”進入證書導入向導

在桌面找到剛剛導出的證書文件,點一下證書文件,選擇打開

到這一部配置工作就完成了
3.抓包
接下來從微信電腦端打開我在校園小程序,然后打開日檢日報或者健康打卡,會發現 Fiddler 中顯示了很多內容,我們找到“student.wozaixiaoyuan.com”這一行,
雙擊打開,在右邊選擇“Headers”標簽,復制三項內容 User-Agent(設備信息)、JWSESSION(作用相當於舊版的 Token)、Referer(學校信息)。這里建議將信息寫入word (與Token不同的是JWSESSION不過期,可以一勞永逸)

二、QQ郵箱
獲取授權碼
用QQ郵箱發件也需要登錄,不是用賬號密碼,而是授權碼,接下來獲取授權碼
進入QQ郵箱網頁版,進入設置,選擇賬戶

往下翻找到 POP3/SMTP服務,確保第一項是“已開啟”狀態,如果不是,點擊后面的開啟,然后選擇下面的“生成授權碼”

根據提示驗證后,得到授權碼,把授權碼復制保存到word文檔

三、Python 代碼
代碼中直接會填入打卡的地址(需要填寫經緯度),所以代碼正常運行后,即使人不在學校,打卡也會在學校
可以用高德地圖開放平台獲取坐標 地址:https://lbs.amap.com/tools/picker

python代碼
import json import logging import requests, time, random import datetime import smtplib from email.mime.text import MIMEText from email.utils import formataddr logger = logging.getLogger() logger.setLevel(logging.INFO) def get_status(self): if self['code'] == 0: return "健康打卡成功" elif self['code'] == 1: return "健康打卡時間結束" elif self['code'] == -10: return "···JWSESSION已失效" else: return "發生未知錯誤" class answer: def __init__(self): self.jwsessionName = ["xxx"] # 姓名 self.my_sender = 'XXX' # 發信人的郵箱賬號(寫自己賬號) self.my_pass = 'xxx' # 郵箱授權碼(與發件人賬號的授權碼一致) self.my_user = 'xxx' # 收件人郵箱賬號(寫自己的或者小號) #注意: 郵箱賬號不是QQ號 self.api = "https://student.wozaixiaoyuan.com/health/save.json" self.headers = { "Host": "student.wozaixiaoyuan.com", "Content-Type": "application/x-www-form-urlencoded", "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive", "User-Agent": "xxx", # User-Agent "Referer": "xxx", # Referer "Content-Length": "360", "JWSESSION": "xxx", # JWSESSION } self.data = { #answers為我在校園的問題,從上往下,0代表第一個選項,三個xxx代表體溫 "answers": '["0","xxx","xxx","xxx"]', #所以三個xxx要改成適當的體溫(36-37) # 打卡地址 "longitude": "xxx", # 經度 "latitude": "xxx", # 緯度 "country": "中國", "province": "xxx省", "city": "xxx市", "district": "xxx區", "township": "xxx街道", "street": "xxx路", } def get_seq(self): current_hour = datetime.datetime.now() current_hour = current_hour.hour + 8 if 0 <= current_hour <=18: return 0 else: return 1 def run(self): print("JWSESSION:" + self.headers["JWSESSION"]) print(datetime.datetime.now()) res = requests.post(self.api, headers=self.headers, data=self.data, ).json() # 打卡提交 time.sleep(1) print(res) print(random.randint(1, 100)) try: msg = MIMEText(self.jwsessionName[0]+" "+get_status(res), 'plain', 'utf-8') # 填寫郵件內容 msg['From'] = formataddr(["我在校園", self.my_sender]) # 發件人郵箱昵稱、發件人郵箱賬號 msg['To'] = formataddr(["Me", self.my_user]) # 收件人郵箱昵稱、收件人郵箱賬號 msg['Subject'] = get_status(res) # 郵件的主題,也可以說是標題 server = smtplib.SMTP_SSL("smtp.qq.com", 465) # 發件人郵箱中的SMTP服務器 server.login(self.my_sender, self.my_pass) # 發件人郵箱賬號、郵箱授權碼 server.sendmail(self.my_sender, [self.my_user, ], msg.as_string()) # 發件人郵箱賬號、收件人郵箱賬號、發送郵件 server.quit() # 關閉連接 except Exception: # 如果 try 中的語句沒有執行,則會執行下面的 ret=False res = False return True if __name__ == "__main__": answer().run() def main_handler(event, context): logger.info('got event{}'.format(event)) return answer().run
代碼寫好並運行!就可以實現打卡
但是這個無法實現自動打卡,所以把代碼部署到騰訊雲(也可以是其他雲,這里選擇騰訊雲 馬總記得給我打錢)
四、騰訊雲函數
注冊完記得完成實名認證,騰訊雲:騰訊雲(tencent.com)
進入騰訊雲先登錄,搜索雲函數

點擊控制台

再點擊函數服務--->新建

選擇自定義創建
往下翻,函數代碼選擇在線編輯,把剛剛編輯好的代碼粘貼在這里

然后點擊完成
再函數管理中選擇你創建的函數,點擊函數代碼,點擊測試

這時你會收到一封自己發來的郵件,健康打卡成功!!!
最后就是創建定時觸發器了,讓騰訊雲定時幫你運行代碼
觸發管理 → 創建觸發器

這里有兩種方案,默認的,即定時觸發器,觸發周期每天(0點0分執行一次)

第二種方案選擇自定義周期

這里需要了解Cron表達式

舉例:每天10點運行的表達式為: 00 00 10 * * * *
每一位用空格隔開
最后點擊提交
每天10點雲函數會自動幫你健康打卡,打卡地點是代碼上寫的經緯度地點
道高一尺魔高一丈,期待我在校園的再次改
