原理为抓包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点云函数会自动帮你健康打卡,打卡地点是代码上写的经纬度地点
道高一尺魔高一丈,期待我在校园的再次改