[notice]本文内容已过时且不可用,目前仅用于存档查看以及技术参考。静待花开。[/notice]
一、说明
- 本教程根据广外的实际情况、基于 dominic548 的 教程 修改、简化和补全,如果你来自其他学校建议观看原教程...
- 不需要编程基础也可使用,需要一点点点点操作能力,需要使用电脑观看并操作
- 配置成功后能够长时间维持,从此解放双手 :@(脸红)
- 点开图片可显示大图,如果有哪里模糊不懂的地方请在评论区反馈 :&(蛆音娘_偷看)
- 不在学校也能打卡~
- 仅供参考,可能造成的后果由您本人承担
二、必要的准备
- 搭载 Windows 的电脑(这不废话么 :&(蛆音娘_吃瓜)
- 微信电脑版(具有小程序功能的版本)
- 注册并登录 腾讯云,需要实名认证,过程不赘述
打开 记事本 或者 Word 或者 其他什么东西,把下面这串字符先复制进去,方便后续操作:
# User-Agent
# JWSESSION
# 邮箱账号
# 邮箱授权码
# PushPlus授权码
# 通知方式
三、抓取登陆信息 - Fiddler
这个部分主要讲解 Fiddler 的安装和登陆信息的抓取。
1.安装 Fiddler 并配置
1.下载 Fiddler(阿里云盘),打开并安装。安装过程不断点下一步即可。安装完毕后,打开 Fiddler。
(注:如果打开后出现下面的弹窗,直接点 No 或者 Cancel 即可。 :$(2233娘_耶) )
2.点击左上角的菜单栏中的 Tools 下的 Options
3.在弹出的窗口中,选择 选项卡 HTTPS,并勾选 Decrypt HTTPS Traffic,弹出的的提示窗口选 Yes,之后会再次弹窗,选 是。
如果期间有申请管理员权限的窗口,直接选是。
[photos]
[/photos]
4.勾选Decrypt HTTPS Traffic下方的 Ignore Server Certificate Errors (Unsafe)(勾选后会变成红字),然后点OK关闭窗口。
2.抓包获得用户登陆信息
1.保持 Fiddler 运行,从微信电脑端打开我在校园小程序,授权登录(确保登陆成功且界面显示广东外语外贸大学 :@(暗地观察) )。
2.点开 Fiddler,按 F12 或者 左上角 Files 中的 Capture Traffic,取消选中(意思就是如果有勾把勾点掉),暂停抓包
3.在 Fiddler 主界面按 Ctrl+F 搜索 /basicinfo/mobile/home ,所有符合的项目会高亮显示
4.从各个高亮的项目中寻找并双击点开存在和下面这张图类似的包括 JWSESSION 的数据
5.右键 Copy Values Only ,复制 JWSESSION、User-Agent ,并保存备用,
注意:如果有等号或者冒号复制等号或者冒号右侧内容即可,如果 User-Agent 很长看起来很烦可以在打开格式中的自动换行
[photos]
[/photos]
完成上述步骤后后,关闭 Fiddler 即可。
四、通知推送(二选一)
实现效果区别不大,PushPlus 推送加更简便。
1、PushPlus 推送加(推荐)
搜索 pushplus,关注公众号。
关注后公众号会自动发送一个授权码,复制备用。
完成后跳往第五步即可。
2、QQ邮箱配置
请查看附加内容部分(末尾)。
五、修改登录信息
经过上述步骤,我们已经获得了 JWSESSION、User-Agent以及PushPlus授权码/邮箱账号、邮箱授权码 :@(欢呼) 接下来我们修改一下代码里面的数据就可以啦~
1030更新:优化代码结构,现在修改起来更简单方便了。旧版代码请查看附加部分。
代码如下(一整块从import到run(),不要漏!! 无脑复制即可:@(惊喜) ):
import datetime
import logging
import random
import smtplib
import time
from email.header import Header
from email.mime.text import MIMEText
from email.utils import formataddr
import requests
logger = logging.getLogger()
logger.setLevel(logging.INFO)
class answer:
def __init__(self):
data = [
# 所有的内容填进引号,如果不需要直接留空,不要删除!
"", # 你的名字,可随意填写
"", # User-Agent
"", # JWSESSION
"", # 通知方式,可以填写 mail 或者 pushplus
"", # QQ邮箱账号(通知方式为邮箱时填写,否则留空)
"", # QQ邮箱授权码(通知方式为邮箱时填写,否则留空)
"", # PushPlus 的授权码(通知方式为推送加时填写,否则留空)
]
self.jwsessionName = ["{}".format(data[0])]
self.push_method = data[3]
self.pushplus_token = data[6]
self.my_sender = data[4]
self.my_pass = data[5]
self.my_user = self.my_sender
self.api = "https://student.wozaixiaoyuan.com/heat/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": data[1],
"Referer": "https://servicewechat.com/wxce6d08f781975d91/{}/page-frame.html".format(
random.randrange(160, 180, 1)),
"Content-Length": "360",
"JWSESSION": data[2],
}
self.data = {
"answers": '["0"]',
"seq": self.get_seq(),
"temperature": self.get_random_temprature(),
"longitude": "23.{}".format(self.get_random_location()),
"latitude": "113.{}".format(self.get_random_location()),
"country": "中国",
"province": "广东省",
"city": "广州市",
"district": "番禺区",
"township": "小谷围街道",
"street": "大学城中环东路",
"myArea": "南校区",
"areacode": "440113",
}
def get_random_temprature(self):
random.seed(time.ctime())
return "{:.1f}".format(random.uniform(36.0, 36.9))
def get_seq(self):
current_hour = datetime.datetime.now()
current_hour = current_hour.hour + 8
if 6 <= current_hour <= 10:
return "1"
elif 19 <= current_hour < 23:
return "3"
else:
return 1
def get_status(self, res_code):
if res_code == 0:
return "日检日报打卡成功。"
elif res_code == 1:
return "当前非日检日报时间。"
elif res_code == -10:
return "JWSESSION 已失效,请重新抓包。"
else:
return "未知错误,错误代码为{}。".format(res_code if res_code != "" else "空")
def run(self):
res = requests.post(self.api, headers=self.headers, data=self.data, ).json()
time.sleep(1)
res_code = res["code"]
mail_content = self.get_status(res_code)
if self.push_method == "mail":
try:
msg = MIMEText(self.jwsessionName[0] + " " + mail_content, 'plain', 'utf-8')
msg['From'] = formataddr((Header("我在校园", 'utf-8').encode(), self.my_sender))
msg['From'] = formataddr((Header("Me", 'utf-8').encode(), self.my_user))
msg['Subject'] = mail_content
server = smtplib.SMTP_SSL("smtp.qq.com", 465)
server.login(self.my_sender, self.my_pass)
server.sendmail(self.my_sender, [self.my_user, ], msg.as_string())
server.quit()
except Exception:
res = False
return True
elif self.push_method == "pushplus":
pushplus = requests.post("https://www.pushplus.plus/send", data={
"token": self.pushplus_token,
"title": mail_content,
"content": self.jwsessionName[0] + " " + mail_content,
"channel": 'wechat',
}, ).json()
return True
else:
return True
def get_random_location(self):
loc = ""
for i in range(14):
loc += str(random.randrange(0, 9, 1))
return loc
if __name__ == "__main__":
answer().run()
def main_handler(event, context):
logger.info('got event{}'.format(event))
return answer().run()
1.把代码粘贴进入 PythonTutor(或者记事本)
2.对应填入数据(下面是修改后的示例),保存,并进行第六步
# 使用 PushPlus
data = [
# 所有的内容填进引号,如果不需要直接留空,不要删除!
"时舟", # 你的名字,可随意填写
"很长一大段", # User-Agent
"1a2b3c4d5e6f", # JWSESSION
"mail", # 通知方式,可以填写 mail 或者 pushplus
"1a2b3c4d5e6f@qq.com", # QQ邮箱账号(通知方式为邮箱时填写,否则留空)
"1a2b3c4d5e6f", # QQ邮箱授权码(通知方式为邮箱时填写,否则留空)
"", # PushPlus 的授权码(通知方式为推送加时填写,否则留空)
]
# 使用 QQ邮箱
data = [
# 所有的内容填进引号,如果不需要直接留空,不要删除!
"时舟", # 你的名字,可随意填写
"很长一大段", # User-Agent
"1a2b3c4d5e6f", # JWSESSION
"pushplus", # 通知方式,可以填写 mail 或者 pushplus
"", # QQ邮箱账号(通知方式为邮箱时填写,否则留空)
"", # QQ邮箱授权码(通知方式为邮箱时填写,否则留空)
"1a2b3c4d5e6f", # PushPlus 的授权码(通知方式为推送加时填写,否则留空)
]
六、设置晨晚检自动签到 - 云函数
1.登录腾讯云,打开腾讯云函数界面
2.点开 函数服务 - 新建。
创建方式:自定义创建;修改函数名称:随便填写即可,不修改也行。
其他选项不需要改动,往下滑到Cloud Studio,把所有代码粘贴进index.py的代码窗口内,点击完成。
[photos]
[/photos]
3.完成后点开函数,在函数管理页面点击测试,测试邮件收发,如果收到邮件/ Pushplus 微信消息 说明配置成功。
[photos]
[/photos]
4.点开触发管理,创建触发器,触发周期选自定义触发周期,Cron 表达式填写 0 15 6,19 * * * *
[photos]
[/photos]
至此配置完成,每天早上六点十五分和晚上七点十五分会自动打卡并邮箱推送通知。
为避免问题,请先观察一天看具体执行情况。 :@(亲亲)
如果问题请在评论区留言~本教程将不断进行完善。 :@(赞一个)
七、附加内容
1.QQ邮箱配置方法
利用QQ邮箱推送晨检晚检的通知,具体效果如下图。 :@(高兴)
1.登录QQ邮箱,复制并保存邮箱账号备用。
2.点 设置 - 账户,往下滑。
3.找到”POP3...服务“,方便起见,建议全部选项打开
4.点生成授权码,复制授权码保存备用。(虽然显示有空格,实际上没有空格!!)
2.旧版代码(仅支持QQ邮箱)
为了方便修改代码,此处建议打开 PythonTutor 方便定位所在的行修改,用记事本也行,但是找起来会很麻烦 :@(无奈)
代码如下(一整块从import到run(),不要漏!! 无脑复制即可:@(惊喜) ):
import datetime
import logging
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
import random
import requests
import time
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 "未知错误,错误代码为{}。".format(self['code'] if self['code'] != "" else "空")
def get_random_location():
loc = ""
for i in range(14):
loc += str(random.randrange(0, 9, 1))
return loc
class answer:
def __init__(self):
# 此处以QQ邮箱为例
self.jwsessionName = ["XXX"] # 修改**发信人昵称**
self.my_sender = 'XXX@qq.com' # 修改**发信人的QQ邮箱账号**,格式为 1234567890@qq.com
self.my_pass = 'XXX' # 修改**发件人邮箱授权码**
self.my_user = self.my_sender # 收信人账号还是自己。
self.api = "https://student.wozaixiaoyuan.com/heat/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": "https://servicewechat.com/wxce6d08f781975d91/{}/page-frame.html".format(
random.randrange(160, 180, 10)),
"Content-Length": "360",
"JWSESSION": "XXX", # 修改 JWSESSION
}
self.data = {
"answers": '["0"]',
"seq": self.get_seq(),
"temperature": self.get_random_temprature(),
"longitude": "23.{}".format(get_random_location()),
"latitude": "113.{}".format(get_random_location()),
"country": "中国",
"province": "广东省",
"city": "广州市",
"district": "番禺区",
"township": "小谷围街道",
"street": "大学城中环东路",
"myArea": "南校区",
"areacode": "440113",
}
# 获取随机体温
def get_random_temprature(self):
random.seed(time.ctime())
return "{:.1f}".format(random.uniform(36.0, 36.9))
def get_seq(self):
current_hour = datetime.datetime.now()
current_hour = current_hour.hour + 8
if 6 <= current_hour <= 10:
return "1"
elif 19 <= current_hour < 23:
return "3"
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 中的语句没有执行,则会执行下面的 res=False
res = False
return True
if __name__ == "__main__":
answer().run()
def main_handler(event, context):
logger.info('got event{}'.format(event))
return answer().run()
1.把代码粘贴进入 PythonTutor(或者记事本)
2.修改37、38、39行(分别为昵称、邮箱账号、授权码)中的XXX
[photos]
[/photos]
3.修改47、52行(分别为User-Agent、JWSESSION)中的XXX
[photos]
[/photos]