我在校园"不打卡" (第三版)
前段时间有小伙伴说JWsession失效很快, 每次都要抓包, 当时我还不信, 因为没遇到过。直到昨天突然发现JWsession值失效了, 我还是和往常一样去抓包获取JWsession值, 可到第二天就惊呆了, 第一次发现这玩意失效这么快, 我寻思着不能每次都这么干吧,这就失去方便我们打卡的意义了。
内心是
通过查找些资料, 查到了用账号和密码登录的操作。
这里借鉴了这篇博客的方法 :https://blog.csdn.net/qq_43531216/article/details/119428517, 通过账号和密码来获取JWsessio的方法
话不多, 先解决获取JWsession
的问题 :
注意 : 这里只是在测试 JWsession 怎么获取
测试JWsession获取
import requests
import json
# 登陆接口
# self.loginUrl = "https://gw.wozaixiaoyuan.com/basicinfo/mobile/login/username"
# 登陆
class Login:
def __init__(self):
# 账户名或者手机号
self.username = "xxxxxxxx" #一般是手机号
# 登录密码
self.password = "xxxxxxxx" #数字密码
# 登陆接口
self.loginUrl = "https://student.wozaixiaoyuan.com/basicinfo/mobile/login/username"
# 请求头
self.header = {
"Host": "student.wozaixiaoyuan.com",
"Content-Type": "application/x-www-form-urlencoded",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "keep-alive",
"User-Agent": "xxxxxxxxxxxxxxx",
"Content-Length": "29",
}
# 请求体(必须有) self.body = "{}"
self.body = "{}"
def login(self):
# 用户名或账号
url = self.loginUrl + "?username=" + self.username + "&password=" + self.password
self.session = requests.session()
response = self.session.post(url=url, data=self.body, headers=self.header)
res = json.loads(response.text)
if res["code"] == 0:
print("登陆成功")
# 登录成功获取JWSESSION
jwsession = response.headers['JWSESSION']
print(jwsession)
return True
else:
print("登陆失败,请检查账号信息和密码是否正确")
self.status_code = 4
return False
if __name__ == "__main__":
Login().login()
在pycharm中运行的结果 :
经过测试获取JWsession没问题; 那接下来就插入代码中
账号和密码的问题
去年的版本应该是没有账号的, 都是直接用微信登录的, 今年增加了绑定手机号和设置密码, 如果忘记密码了,也不要着急, 用手机验证码就能修改
首先打开我在校园
的微信小程序, 点击我的
点击设置
点击密码修改
忘记密码的话选验证手机
, 记得密码的话, 想修改密码可以直接修改
ok, 记住密码和账号就可以操作了
总代码
接下来修改基于第一版和第二版的代码:
以下代码还是需要第一次抓包的信息的, 不会抓包的小伙伴可以看第一版的, 第一版的有抓包过程描述, 只需抓一次包后, 后续没啥问题就不用抓包了.
如果没有看过第一第二版的小伙伴可以去看一下,再来操作会方便很多, 之前的方法就不赘述了.
第一版 : https://blog.csdn.net/honorzoey/article/details/111386632?spm=1001.2014.3001.5501
第二版 : https://blog.csdn.net/honorzoey/article/details/118658903?spm=1001.2014.3001.5501
博客园地址 : 我在校园打卡第一版
博客园地址 : 我在校园打卡第二版
有些改动为了尽量简洁, 这里没有提供多账号打卡, 下面代码是一个账号打卡的, 然后xxxxxxx的地方是需要根据自己的信息填的(个人隐私的原因,在我的代码能运行成功后的部分代码含有个人信息, 我就都用 xxxx 代替了), 还是希望小伙伴能认真看一下代码, 不要全部照搬, 根据自身情况修改, 代码不难的, 有基础都是可以的. 如果有个别模块(库)的用法不清楚的, 可自行上网查找或者查看python的官方文档, 这也是学习的过程呀!
import json
import logging
import requests, time, random
import datetime
# 新加的发邮件功能
import smtplib # smtp服务器
from email.mime.text import MIMEText # 邮件文本
logger = logging.getLogger()
logger.setLevel(logging.INFO)
# 日检日报提交后字典的参数,返回中文
def get_status1(self):
if self['code'] == 0:
# return "日检日报成功"
return "自动打卡(日检日报)成功"
elif self['code'] == 1:
return "日检日报打卡时间结束"
elif self['code'] == -10:
return "jwsession已失效,请及时更换jwsession值"
else:
return "发生未知错误,请及时检查!"
# 健康打卡提交后字典的参数,返回中文
def get_status2(self):
if self['code'] == 0:
return "自动打卡(健康打卡)成功"
elif self['code'] == 1:
return "健康打卡时间结束"
elif self['code'] == -10:
return "jwsession已失效,请及时更换jwsession值"
else:
return "发生未知错误,请及时检查!"
# 定义发邮件函数sendemail()
def sendemail(receiver, content):
subject = "我不在校园打卡" # 邮件标题
sender = "xxxxxxxxxx@126.com" # 发送方的邮件
recver = receiver # 接收方
password = "xxxxxxxx" # 邮箱的授权密码; 注意是授权密码, 不是邮箱密码; 详情看第二版
message = MIMEText(content, "plain", "utf-8")
# content 发送内容 "plain"文本格式 utf-8 编码格式
message['Subject'] = subject # 邮件标题
message['To'] = recver # 收件人
message['From'] = sender # 发件人
smtp = smtplib.SMTP_SSL("smtp.126.com", 994) # 实例化smtp服务器
# smtp = smtplib.SMTP_SSL("smtp.163.com", 465) # 实例化smtp服务器
smtp.login(sender, password) # 发件人登录
smtp.sendmail(sender, [recver], message.as_string()) # as_string 对 message 的消息进行了封装
smtp.close()
# 定义用密码登录的函数
def login(username,password):
# 登陆接口
loginUrl = "https://student.wozaixiaoyuan.com/basicinfo/mobile/login/username"
url = loginUrl + "?username=" + username + "&password=" + password
session = requests.session()
# 请求头
headers = {
"Host": "student.wozaixiaoyuan.com",
"Content-Type": "application/x-www-form-urlencoded",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "keep-alive",
"User-Agent": "xxxxxxxxxxxxxxxxx", #这个第一次抓包都有,换上自己的就行
"Content-Length": "29",
}
# 请求体(必须有) body = "{}"
body = "{}"
response = session.post(url=url, data=body, headers=headers)
res = json.loads(response.text)
if res["code"] == 0:
print("登陆成功")
# 登录成功获取JWSESSION
jwsession = response.headers['JWSESSION']
print(jwsession)
record = "登陆成功 jwsession值为"+jwsession
return jwsession
else:
print("登陆失败,请检查账号信息和密码是否正确")
record = "登陆失败,请检查账号信息和密码是否正确"
return False
class Do:
def __init__(self):
self.wechatName = "xxxxxxx" # 可写微信昵称, 不修改也可
# 喵提醒通知
self.notifytoken = 'xxxx' # 喵码
self.api1 = "https://student.wozaixiaoyuan.com/heat/save.json" # 日检日报 提交地址
self.api2 = "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": "xxxxxxxxxxxxxx", # 自行修改
"Referer": "xxxxxxxxxxx", # 第一次抓包都有的
"Content-Length": "29",
} # 以上都可以在抓包中获取参数信息
# 请求体(必须有) self.body = "{}"
self.body = "{}"
# 日检日报数据
self.data1 = {
"answers": '["0"]',
"seq": self.get_seq(),
"temperature": self.get_random_temprature(), # 通过随机函数进行填写体温数据
"latitude": "xxxxxxxx", # 维度
"longitude": "xxxxxxxx", # 经度
"country": "xx",
"city": "xxx市",
"district": "xx区",
"province": "xxx省",
"township": "xxxx街道",
"street": "xxxxx",
} # 位置信位息也是通过抓包获取之前是记录
# 健康打卡数据
self.data2 = {
# "answers": '["0"]',
"answers": '["0","3","1","无","无","0"]', # 根据自己的打卡的选项写哈, 别搞错了呀, 不然被隔离就惨了
"latitude": "xxxxxxx", # 维度
"longitude": "xxxxxxxxx", # 经度
"country": "中国",
"city": "xx市",
"district": "xx区",
"province": "xx省",
"township": "xxx街道",
"street": "xxxxx",
} # 置信位息也是通过抓包获取之前是记录
# 获取随机体温
def get_random_temprature(self):
random.seed(time.ctime())
return "{:.1f}".format(random.uniform(36.1, 36.7)) #随机获取温度 范围在36.1到36.7的正常温度
# seq的1,2,3代表着早,中,晚 , 根据触发器定的触发运行时间来决定运行哪段代码
def get_seq(self):
current_hour = datetime.datetime.now()
# current_hour = current_hour.hour + 8
current_hour = current_hour.hour
if 0 <= current_hour <= 8: # 0点到8点这个时间段能运行代码的话就触发第一个打卡即有健康打卡和日检日报的打卡
return "1"
elif 11 <= current_hour < 14: # 11点到12点内仅仅触发日检日报的打卡
return "2"
elif 17 <= current_hour < 20: # 17点到20点内仅仅触发日检日报的打卡
return "3"
else: # 除了上述时间外的时间, 都触发两个打卡即健康打卡和日检日报的打卡
return "1"
def run(self):
# 账户名或者手机号
username = "xxxxxxxxxxx" #一般是手机号码
# 登录密码
password = "xxxxxx" # 一般是6到8位纯数字密码
lo = login(username, password)
if lo == False:
print("登录失败!有可能是账号或密码错误")
sendemail("xxxxxxxxxx@qq.com", "打卡失败; 登录失败!有可能是账号或密码错误" + "\n" + "时间为:" + str(
datetime.datetime.now())) # 调用发邮件函数, 这个邮箱是接收邮箱
msg = {
"id": self.notifytoken,
"text": '记得激活48小时提醒' + '\n' + "打卡失败; 登录失败!有可能是账号或密码错误" + "\n" + "时间为:" + str(
datetime.datetime.now()),
"type": "json"
}
else:
self.headers["JWSESSION"] = lo
print("JWsession:" + self.headers["JWSESSION"])
print(datetime.datetime.now())
res1 = requests.post(self.api1, headers=self.headers, data=self.data1, ).json() # 日检日报
time.sleep(1)
print(res1)
if self.get_seq() == "1":
res2 = requests.post(self.api2, headers=self.headers, data=self.data2, ).json() # 健康打卡提交
time.sleep(1)
print(res2)
sendemail("xxxxxxxx@qq.com", "现在进行云端自动打卡" + "\n" + get_status1(res1) + "\n" + get_status2(
res2) + "\n" + "哈哈哈\n" + "打卡时间为:" + str(datetime.datetime.now()) ) # 调用发邮件函数,这个邮箱是接收邮箱
msg = {
"id": self.notifytoken,
"text": "记得激活48小时提醒" + '\n' + self.wechatName + ",现在进行云端自动打卡" + '\n' + get_status1(
res1) + '\n' + get_status2(res2) + '\n' + "哈哈" ,
"type": "json"
}
else:
sendemail("xxxxxxxx@qq.com", "现在进行云端自动打卡" + "\n" + get_status1(res1) + "\n哈哈\n" + "打卡时间为:" + str(
datetime.datetime.now())) # 调用发邮件函数, 这个邮箱是接收邮箱
msg = {
"id": self.notifytoken,
"text": '记得激活48小时提醒' + '\n' + self.wechatName + ',现在进行云端自动打卡' + '\n' + get_status1(res1) + '\n' ,
"type": "json"
}
print(type(msg))
requests.post("http://miaotixing.com/trigger", data=msg)
current_hours = datetime.datetime.now()
current_hours = current_hours.hour
print(current_hours)
return True
if __name__ == "__main__":
uses = Do()
uses.run()
def main_handler(event, context):
logger.info('got event{}'.format(event))
return Do().run()
以上代码有邮件提醒和公众号:喵提醒的功能; 如果不需要提醒可自行修改或注释掉部分代码; 以上代码仅供参考, 可能还有其他问题存在, 以实际情况为准.
注意 : 随着代码增加, 执行时间也在增长, 需要在云函数上设置执行超时时间(尽量设置长些)
说明一下, 如果代码太庞大, 云函数不一定能运行的起来, 适当增加功能就好, 我就是试过在pycharm上能跑得出, 到云函数上就不行了.
- 第三版的改动主要是以不用手动抓包获取JWsession为主, 其他的没啥新增, 希望小伙伴能都能测试成功!
附加
有个小伙伴反应,运行代码的时候账号被冻结, 貌似这种方法也不太稳定, 我也遇到了, 有时候密码和账号都正确也登录不上..... 确实很不稳
但冻结之后通过手机验证码修改密码还是可以在小程序上登录的
以上内容仅供参考学习, 有问题欢迎评论区留言