我不在校园(打卡)
我在校园打卡(第二版)
说明
第一版 : 我在校园打卡第一版, 在C站的已经被下架,原因是审核不通过,说内容违法违规
第一版 : 博客园地址 : 我在校园打卡第一版
该版主要增加了邮件提醒功能, 第一版的公众号:喵提醒操作有些繁琐, 因为是公众号的缘故, 微信对公众号的回复有限制, 超过48小时后, 公众号就不能主动回复提醒消息, 必须进行发消息交互才能激活提醒功能,可能会因为忘记激活提醒而错过消息通知。
因此这次增加用邮箱提醒, 就不用每次激活提醒。
此篇文章不再重复第一版开头的设置说明, (使用腾讯云定时运行, 抓包数据获取token值和JWsession值, 设置触发器等操作在第一版有,不再重复说明) ; 详情请看第一版 我在校园打卡第一版
邮箱使用
-
使用网易的126或163邮箱
-
需要两个不同的邮箱号; 选择一个发送邮箱, 另一个作为接收邮箱
- 我个人使用
126网易邮箱作为发送邮箱,QQ邮箱作为接收邮箱。(QQ邮箱作为接收邮箱的原因是我的QQ邮箱已经绑定微信, 一有消息就可以通知到微信上)
- 我个人使用
-
如果有网易邮箱账户最好, 没有就注册一个,任选一个邮箱(126或163都可)来作为发送邮箱
-
代码主要是在发送邮箱上, 在写代码前需要设置一下网易邮箱的
-
126网易邮箱的设置, 开启126的smtp服务器
-
-
开启后会有授权密码,使用设备可以自己定义为
邮件发送端也行;需要把它复制下来并记好,编写代码时要用, 这样用代码发邮件就不用密码登录了,直接用授权密码就行.
-
(划重点:踩过的坑) 添加联系人(接收邮箱的)和在收件人列表里面加上自己的邮箱; 原因是如果不加入联系人,系统会把多次发送的邮件当做垃圾邮件被退回, 就会一直发不出去.所以用代码发邮箱之前一定先添加好收件人。
注意发件邮箱和接收邮箱都要添加联系人, 防止系统错误拦截
多啰嗦一句 : 这是在同一个邮箱上添加两个联系人的, 也就是说同一个邮箱也可以添加该邮箱号作为联系人。
- 如果是用163网易邮箱操作也是类似的(自行操作), 都是要添加发件人和接收人的。
- 接收邮箱的话只需要设置发送邮箱为联系人即可, 防止系统把收到的邮件当垃圾邮件, 这样就起不到及时通知的效果了 (此步骤省略, 请自行操作......)
网易官方文档说明 : 什么是POP3、SMTP及IMAP?
如何用python代码发邮件
下面使用python语言编写发邮件函数 , 自定义的函数
- 首先需要导入一些必要的包:
smtplib和MIMEText
import smtplib #smtp服务器
from email.mime.text import MIMEText #邮件文本
-
下面定义一个发邮件函数
sendemail(receiver,content), 其中形参receiver是将收件人邮箱号作为参数传进去, 形参content是传入发送的邮件的内容. 下面代码用xxxxxx代替的是一定要修改的, 其他的可以自行决定。password 那里是要填刚刚设置smtp服务器时,它们给的授权密码,复制进去. 还有邮箱服务器问题 : 如果是126网易就是smtplib.SMTP_SSL("smtp.126.com",994); 如果是163就是smtplib.SMTP_SSL("smtp.163.com",994)。126免费邮客户端设置POP3和SMTP地址:
163邮箱也相似, 只要把126替换成163就行
def sendemail(receiver,content):
subject = "我在校园打卡" #邮件标题, 可以自定义其他的标题
sender = "xxxxxxxxx@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服务器,如果是126网易邮箱用这个
#smtp = smtplib.SMTP_SSL("smtp.163.com", 994) #实例化smtp服务器,如果是163网易邮箱就用这个
smtp.login(sender,password)#发件人登录
smtp.sendmail(sender,[recver],message.as_string()) #as_string 对 message 的消息进行了封装
smtp.close()
- 定义完发邮件函数后, 接下就是调用发邮件的函数了
# 举个栗子
sendemail("XXXXXXX@qq.com", "你好呀!\n"+"请问有事吗?")
- 邮件内容的效果:
额外说明 : 如果出现报错如下:
即图上的报错信息如下:raise SMTPDataError(code, resp) smtplib.SMTPDataError: (554, b\'DT:SPM 163 smtp10,DsCowABXhWVA5upgzsmjAQ--.44712S2 1626007105,please see http://mail.163.com/help/help_spam_16.htm?ip=120.230.76.129&hostid=smtp10&time=1626007105\')
那么就是被系统当做垃圾邮件退回了
- 退信代码说明:
-
554 DT:SPM发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件。请检查是否有用户发送病毒或者垃圾邮件;
-
网易官方文档说明 : 企业退信的常见问题?
我在校园打卡的python源码
三种提醒方式(任选其一)
第一种: 仅邮件提醒
- 这部分也只是在第一版的基础上增加一个函数和调用函数而已, 其他说明参照第一版
- 说明一下: 最近的"我在校园"的小程序有所升级, 增加了JWsession, 经过测试发现只要JWsession不用token是可以用的, 但是如果只有token是不能用的(说白了, 只要JWsession就行了)
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 "发生未知错误,请及时检查!"
def sendemail(receiver, content):
subject = "我不在校园打卡" # 邮件标题
sender = "xxxxxxx@126.com" # 发送方
recver = receiver # 接收方
password = "XXXXXXXXX"
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服务器,如果是126网易邮箱用这个
#smtp = smtplib.SMTP_SSL("smtp.163.com", 994) #实例化smtp服务器,如果是163网易邮箱就用这个
smtp.login(sender,password)#发件人登录
smtp.sendmail(sender,[recver],message.as_string()) #as_string 对 message 的消息进行了封装
smtp.close()
class Do:
def __init__(self):
# JWsession列表
self.jwsessionArray = ["xxxxxxxxxxx"]
self.tokenName = ["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": "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Referer": "xxxxxxxxxxxxxx",
"Content-Length": "29",
} # 以上都可以在抓包中获取参数信息
# 日检日报数据
self.data1 = {
"answers": \'["0"]\',
"seq": self.get_seq(),
"temperature": self.get_random_temprature(), # 通过随机函数进行填写体温数据
"latitude": "xxxxxxxx ", # 维度
"longitude": "xxxxxxxxx", # 经度
"country": "中国",
"city": "xx市",
"district": "xx区",
"province": "xx省",
"township": "xxx街道",
"street": "xxx路",
} # 位置信位息也是通过抓包获取之前是记录
# 健康打卡数据
self.data2 = {
"answers": \'["0"]\', #保险起见, 默认只选第一个, 根据自己的界面选项选
#"answers": \'["0","3","1","无","无","0"]\', #打卡界面的选项参数
# 把answers属性的值改为\'["0","1","1",,"0","xxxxx","1"]\'(xxxxx为填入的信息)
#其中0代表问题的第一个选项,1代表问题的第二个选项,以此类推就行.(根据需要填写).
#但是填选问题有风险,就是如果小程序里的选项发生变动,就会可能填错信息,
#那就只能时不时去看一下有没有信息变动
"latitude": "xxxxxxx ", # 维度
"longitude": "xxxxxx ", # 经度
"country": "中国",
"city": "xxxx市",
"district": "xxx区",
"province": "xx省",
"township": "xxx街道",
"street": "xxxx路",
} # 置信位息也是通过抓包获取之前是记录
# 获取随机体温
def get_random_temprature(self):
random.seed(time.ctime())
return "{:.1f}".format(random.uniform(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:
return "1"
elif 11 <= current_hour < 14:
return "2"
elif 17 <= current_hour < 20:
return "3"
else:
return "1"
def run(self):
num = 0
for i in self.jwsessionArray:
self.headers["JWSESSION"] = i
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",\
self.tokenName[num] + ",现在进行云端自动打卡" + "\n" + get_status1(res1) + "\n" + get_status2(\
res2) + "\n" + "哈哈哈\n" + "打卡时间为:" + str(datetime.datetime.now()))
else:
# 调用发邮件函数
sendemail("xxxxxxxx@qq.com",\
self.tokenName[num] + ",现在进行云端自动打卡" + "\n" + get_status1(res1) + "\n哈哈\n" + "打卡时间为:" + str(\
datetime.datetime.now()))
num = num + 1
current_hours = datetime.datetime.now()
current_hours = current_hours.hour
print(current_hours)
return True
if __name__ == "__main__":
Do().run()
def main_handler(event, context):
logger.info(\'got event{}\'.format(event))
return Do().run()
第二种 : 仅喵提醒(看第一版)
- 第一版 : 我在校园打卡第一版
import json
import logging
import requests, time, random
import datetime
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 "发生未知错误,请及时检查!"
class Do:
def __init__(self):
# Token 列表
self.jwsessionArray = ["xxxxxxxx"] # 用Fiddler抓包jwsession值
self.tokenName = ["xxxx"] # 可写微信昵称
# 喵提醒通知
self.notifytoken = \'xxxxx\' # 喵码
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": "xxxxxxxxx",
# "JWSESSION": " ",
"Content-Length": "29",
} # 以上都可以在抓包中获取参数信息
# 日检日报数据
self.data1 = {
"answers": \'["0"]\',
"seq": self.get_seq(),
"temperature": self.get_random_temprature(), # 通过随机函数进行填写体温数据
"latitude": "xxxxxxx", # 维度
"longitude": "xxxxxxxx", # 经度
"country": "中国",
"city": "xxxx市",
"district": "xxxxx区",
"province": "xxxxxx省",
"township": "xxxxxx街道",
"street": "xxxx路",
} # 位置信位息也是通过抓包获取之前是记录
# 健康打卡数据
self.data2 = {
"answers": \'["0"]\',
# "answers": \'["0","3","1","无","无","0"]\',
"latitude": "xxxxxxxx ", # 维度
"longitude": "xxxxxxxx", # 经度
"country": "xxxx",
"city": "xxxxx",
"district": "xxxx",
"province": "xxxx",
"township": "xxxx",
"street": "xxxx",
} # 置信位息也是通过抓包获取之前是记录
# 获取随机体温
def get_random_temprature(self):
random.seed(time.ctime())
return "{:.1f}".format(random.uniform(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:
return "1"
elif 11 <= current_hour < 14:
return "2"
elif 17 <= current_hour < 20:
return "3"
else:
return "1"
def run(self):
num = 0
for i in self.jwsessionArray:
self.headers["JWSESSION"] = i
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)
msg = {
"id": self.notifytoken,
"text": "记得激活48小时提醒" + \'\n\' + self.tokenName[num] + ",现在进行云端自动打卡" + \'\n\' + get_status1(
res1) + \'\n\' + get_status2(res2) + \'\n\' + "哈哈",
"type": "json"
}
else:
msg = {
"id": self.notifytoken,
"text": \'记得激活48小时提醒\' + \'\n\' + self.tokenName[num] + \',现在进行云端自动打卡\' + \'\n\' + get_status1(res1) + \'\n\',
"type": "json"
}
print(type(msg))
requests.post("http://miaotixing.com/trigger", data=msg)
num = num + 1
current_hours = datetime.datetime.now()
current_hours = current_hours.hour
print(current_hours)
return True
if __name__ == "__main__":
Do().run()
def main_handler(event, context):
logger.info(\'got event{}\'.format(event))
return Do().run()
#带xxxxxx的信息都是要修改的
第三种: 邮件和喵提醒(双重保障)
- 既有邮件提醒, 又有公众号:喵提醒, (再也不用担心忘记打卡了).
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 "Token或jwsession已失效,请及时更换Token或jwsession值"
else:
return "发生未知错误,请及时检查!"
# 健康打卡提交后字典的参数,返回中文
def get_status2(self):
if self[\'code\'] == 0:
return "自动打卡(健康打卡)成功"
elif self[\'code\'] == 1:
return "健康打卡时间结束"
elif self[\'code\'] == -10:
return "Token/jwsession已失效,请及时更换Token/jwsession值"
else:
return "发生未知错误,请及时检查!"
#定义发邮件函数sendemail()
def sendemail(receiver,content):
subject = "我不在校园打卡" #邮件标题
sender = "xxxxxxxxx@126.com" #发送方
recver = receiver #接收方
password = "xxxxxxxx"
message = MIMEText(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", 994) # 实例化smtp服务器
smtp.login(sender,password)#发件人登录
smtp.sendmail(sender,[recver],message.as_string()) #as_string 对 message 的消息进行了封装
smtp.close()
class Do:
def __init__(self):
# Token 列表
self.tokenArray = ["xxxxxxxxxxx"] #用Fiddler抓包token值和jwsession值
self.jwsessionArray = ["xxxxxxxx"]
self.tokenName = ["xxxx"] #可写微信昵称
# 喵提醒通知
self.notifytoken = \'xxxxx\' #喵码
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": "xxxxxxxxx",
#"JWSESSION": " ",
# "token": " ",
"Content-Length": "29",
} #以上都可以在抓包中获取参数信息
# 日检日报数据
self.data1 = {
"answers": \'["0"]\',
"seq": self.get_seq(),
"temperature": self.get_random_temprature(), #通过随机函数进行填写体温数据
"latitude": "xxxxxxx", # 维度
"longitude": "xxxxxxxx", # 经度
"country": "中国",
"city": "xxxx市",
"district": "xxxxx区",
"province": "xxxxxx省",
"township": "xxxxxx街道",
"street": "xxxx路",
} #位置信位息也是通过抓包获取之前是记录
# 健康打卡数据
self.data2 = {
"answers": \'["0"]\',
#"answers": \'["0","3","1","无","无","0"]\',
"latitude": "xxxxxxxx ", # 维度
"longitude": "xxxxxxxx", # 经度
"country": "xxxx",
"city": "xxxxx",
"district": "xxxx",
"province": "xxxx",
"township": "xxxx",
"street": "xxxx",
} #置信位息也是通过抓包获取之前是记录
# 获取随机体温
def get_random_temprature(self):
random.seed(time.ctime())
return "{:.1f}".format(random.uniform(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:
return "1"
elif 11 <= current_hour < 14:
return "2"
elif 17 <= current_hour < 20:
return "3"
else:
return "1"
def run(self):
num = 0
for i in self.tokenArray:
self.headers["token"] = i
self.headers["JWSESSION"] = self.jwsessionArray[num] #后加的, 2021/7/10
print("Token:" + self.headers["token"])
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("xxxxxxx@qq.com", self.tokenName[num] + ",现在进行云端自动打卡" + "\n" + get_status1(res1) + "\n" + get_status2(res2) + "\n"+"哈哈哈\n"+"打卡时间为:"+str(datetime.datetime.now())) #调用发邮件函数
msg = {
"id": self.notifytoken,
"text": "记得激活48小时提醒" + \'\n\' + self.tokenName[num] + ",现在进行云端自动打卡" + \'\n\' + get_status1(res1) + \'\n\' + get_status2(res2) + \'\n\'+"哈哈",
"type": "json"
}
else:
sendemail("xxxxxxx@qq.com", self.tokenName[num] + ",现在进行云端自动打卡" + "\n" + get_status1(res1) + "\n哈哈\n"+"打卡时间为:"+str(datetime.datetime.now())) #调用发邮件函数
msg = {
"id": self.notifytoken,
"text": \'记得激活48小时提醒\' + \'\n\' + self.tokenName[num] + \',现在进行云端自动打卡\' + \'\n\' + get_status1(res1) + \'\n\',
"type":"json"
}
print(type(msg))
requests.post("http://miaotixing.com/trigger", data=msg)
num = num + 1
current_hours = datetime.datetime.now()
current_hours = current_hours.hour
print(current_hours)
return True
if __name__ == "__main__":
Do().run()
def main_handler(event, context):
logger.info(\'got event{}\'.format(event))
return Do().run()
邮件提醒效果
最后
第二版只要是增加邮件提醒功能, 通过两个邮箱, 一个发件邮箱发送打卡消息, 另一个邮箱负责接收邮件. 过程并不复杂, 大部分说明在第一版中已经提到就不再赘述。
-
本文章的自动打卡功能仅供参考学习, 此脚本仅做正常情况下免去手动打卡之用,请勿瞒报、误报、漏报
-
不得用于非法用途(其中包括但不限于隐瞒病情用该脚本打卡;为别人打卡,你承担不了这个责任;通过帮别人打卡赚取利益等等)。用于非法行为终究会受到法律的惩罚。
-
本自动打卡仅适用于个人经常宅家里, 身体状况正常的人使用。如有身体上的不适,请停止该自动打卡,并如实上报自身情况, 疫情之下谎报打卡信息是犯法的,望周知!
-
如使用者存在以下异常情况:位于风险地区、接触确诊病例、接触疑似病例、本人疑似患病、本人确诊患病等,请立即停止使用此脚本,并在小程序中如实填报
-
使用者请务必不要泄露自己的 accessToken,防止被他人利用乱打卡
-
使用此脚本产生的任何问题由使用者负责,与作者无关
如果有错误,欢迎指正, 或者有什么比较好的想法都可以在评论区留言!
内容声明 : 这是从CSDN中搬运过来的, 这篇博客来自CSDN博主 : CS@zeny