本文内容已过时且不可用,目前仅用于存档查看以及技术参考。静待花开。

一、说明

  • 本教程根据广外的实际情况、基于 dominic548教程 修改、简化和补全,如果你来自其他学校建议观看原教程...
  • 不需要编程基础也可使用,需要一点点点点操作能力,需要使用电脑观看并操作
  • 配置成功后能够长时间维持,从此解放双手
  • 点开图片可显示大图,如果有哪里模糊不懂的地方请在评论区反馈
  • 不在学校也能打卡~
  • 仅供参考,可能造成的后果由您本人承担

二、必要的准备

  • 搭载 Windows 的电脑(这不废话么
  • 微信电脑版(具有小程序功能的版本)
  • 注册并登录 腾讯云,需要实名认证,过程不赘述

打开 记事本 或者 Word 或者 其他什么东西,把下面这串字符先复制进去,方便后续操作:

# User-Agent

# JWSESSION

# 邮箱账号

# 邮箱授权码

# PushPlus授权码

# 通知方式
 

三、抓取登陆信息 - Fiddler

这个部分主要讲解 Fiddler 的安装和登陆信息的抓取。

1.安装 Fiddler 并配置

1.下载 Fiddler(阿里云盘),打开并安装。安装过程不断点下一步即可。安装完毕后,打开 Fiddler。

安装界面
安装界面

(注:如果打开后出现下面的弹窗,直接点 No 或者 Cancel 即可。
可能出现的弹窗
可能出现的弹窗

2.点击左上角的菜单栏中的 Tools 下的 Options
Tools - Options
Tools - Options

3.在弹出的窗口中,选择 选项卡 HTTPS,并勾选 Decrypt HTTPS Traffic,弹出的的提示窗口选 Yes,之后会再次弹窗,选

如果期间有申请管理员权限的窗口,直接选

配置 HTTPS
配置 HTTPS
再次弹窗
再次弹窗

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 很长看起来很烦可以在打开格式中的自动换行

右键复制
右键复制
保存备用以及自动换行操作方法
保存备用以及自动换行操作方法

完成上述步骤后后,关闭 Fiddler 即可。

四、通知推送(二选一)

实现效果区别不大,PushPlus 推送加更简便。

1、PushPlus 推送加(推荐)

搜索 pushplus,关注公众号。
关注后公众号会自动发送一个授权码,复制备用

推送加
推送加

完成后跳往第五步即可。

2、QQ邮箱配置

请查看附加内容部分(末尾)。

五、修改登录信息

经过上述步骤,我们已经获得了 JWSESSION、User-Agent以及PushPlus授权码/邮箱账号、邮箱授权码 接下来我们修改一下代码里面的数据就可以啦~
1030更新:优化代码结构,现在修改起来更简单方便了。旧版代码请查看附加部分。

代码如下(一整块从importrun(),不要漏!! 无脑复制即可 ):

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的代码窗口内,点击完成

粘贴代码
粘贴代码
完成
完成

3.完成后点开函数,在函数管理页面点击测试,测试邮件收发,如果收到邮件/ Pushplus 微信消息 说明配置成功

测试
测试
收信
收信

4.点开触发管理创建触发器触发周期自定义触发周期,Cron 表达式填写 0 15 6,19 * * * *

触发器
触发器
配置保存
配置保存

至此配置完成,每天早上六点十五分和晚上七点十五分会自动打卡并邮箱推送通知。

配置完成
配置完成

为避免问题,请先观察一天看具体执行情况。

签到成功
签到成功

如果问题请在评论区留言~本教程将不断进行完善。

七、附加内容

1.QQ邮箱配置方法

利用QQ邮箱推送晨检晚检的通知,具体效果如下图。

邮箱通知
邮箱通知

1.登录QQ邮箱,复制并保存邮箱账号备用。
2.点 设置 - 账户,往下滑。
QQ邮箱设置
QQ邮箱设置

3.找到”POP3...服务“,方便起见,建议全部选项打开
打开发信设置,生成授权码
打开发信设置,生成授权码

4.点生成授权码,复制授权码保存备用。(虽然显示有空格,实际上没有空格!!)
保存备用
保存备用

2.旧版代码(仅支持QQ邮箱)

为了方便修改代码,此处建议打开 PythonTutor 方便定位所在的行修改,用记事本也行,但是找起来会很麻烦

代码如下(一整块从importrun(),不要漏!! 无脑复制即可 ):

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

修改1
修改1
修改1
修改1
修改1
修改1

3.修改47、52行(分别为User-Agent、JWSESSION)中的XXX

修改2
修改2
修改2
修改2