我在校园自动签到与健康打卡逻辑类似,只是设置了动态ID,所以抓包的时候要先抓取动态ID
进入正题
一.抓包
fiddler的配置和以前一样,不会的可以去看我以前写的博客(https://www.cnblogs.com/Python-Java-C-E/p/15580618.html),
点击签到,找到 (http://student.wozaixiaoyuan.com/sign/getSignMessage.json)
老样子还是User-Agent、JWSESSION、Referer三件套
点击签到,找到 (http://student.wozaixiaoyuan.com/sign/doSign.json/)
还是这3个值跟上面的一样,皮一下很开心!!!User-Agent、JWSESSION、Referer
二.代码
重点来了,代码
import json import re 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'] == -10: return "···JWSESSION已失效" else: return "!!!发生未知错误" class answer: def __init__(self): self.jwsessionName = [""] # 姓名 self.my_sender = 'xxx' # 发信人的邮箱账号 self.my_pass = 'xxxxx' # 发件人邮箱授权码 self.my_user = 'xxxxxx' # 收件人邮箱账号 getheaders = { "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": "xxxl", # Referer "Content-Length": "500", "JWSESSION": "xxx0", # JWSESSION } first = 'page=1&size=5' getapi = "http://student.wozaixiaoyuan.com/sign/getSignMessage.json" getdata = requests.post(getapi, headers=getheaders, data=first, ).json() time.sleep(1) getdata = getdata['data'] a = str(getdata).replace("[", ""); b = str(a).replace("]", ""); c = b d = re.findall(r"{(.+?)}", c) e = "{" + d[0] + "}" e = eval(e) Fid = e['id'] Lid = e['logId'] self.data = '{"id":' + Lid + "," + '"signId":' + Fid + "," + ''' "latitude":xxxxx, #维度 "longitude":xxxx, # 经度 "country":"中国", "province":"xx省", "city":"xx市", "district":"xx区", "township":"xxxx街道"''' + "}" # 打卡位置 print(self.data) self.api="http://student.wozaixiaoyuan.com/sign/doSign.json/" self.headers ={ "Host": "student.wozaixiaoyuan.com", "Content-Type": "application/json", "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive", "User-Agent": "xxxx", # User-Agent "Referer": "xxxx", # Referer "Content-Length": "500", "Cookie":"", "JWSESSION": "xxxx", # JWSESSION } 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.encode(),).json() # 打卡提交 time.sleep(1) 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 return False return True if __name__ == "__main__": answer().run() def main_handler(event, context): logger.info('got event{}'.format(event)) return answer().run()
这里继续使用QQ邮箱给我们返回签到结果(马总记得给我打钱)
关于QQ授权码和经纬度看我上面提到的博客,这里就不赘述了
三.云函数
由于腾讯云改版,python3.7不支持库内置依赖库,所以选择版本的时候选python3.6
后面的操作与之前的一样!部署云函数,设置触发器............
其他
关于云函数的一些bug
如果代码在pycharm中可以运行不报错,部署到云函数后报{"errorCode":-1,"errorMessage":"Invoking task timed out after 3 seconds","requestId":"5df4adf3-414e-4109-8df8-10650359a265","statusCode":433}
解决办法,将函数配置中的执行时间改长,这里改成30s
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现