时舟

  • 一、说明
  • 二、必要的准备
  • 三、抓取登陆信息 - Fiddler
  • 1.安装 Fiddler 并配置
  • 2.抓包获得用户登陆信息
  • 四、通知推送(二选一)
  • 1、PushPlus 推送加(推荐)
  • 2、QQ邮箱配置
  • 五、修改登录信息
  • 六、设置晨晚检自动签到 - 云函数
  • 七、附加内容
  • 1.QQ邮箱配置方法
  • 2.旧版代码(仅支持QQ邮箱)
  • 首页
  • 时间轴
  • Friends!

自动化 | 我在校园自动打卡

  • sizau
  • 2021-10-30
  • 0

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

一、说明

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

二、必要的准备

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

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

# User-Agent

# JWSESSION

# 邮箱账号

# 邮箱授权码

# PushPlus授权码

# 通知方式
 

三、抓取登陆信息 - Fiddler

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

1.安装 Fiddler 并配置

1.下载 Fiddler(阿里云盘),打开并安装。安装过程不断点下一步即可。安装完毕后,打开 Fiddler。
安装界面
(注:如果打开后出现下面的弹窗,直接点 No 或者 Cancel 即可。 :$(2233娘_耶) )
可能出现的弹窗
2.点击左上角的菜单栏中的 Tools 下的 Options
Tools - Options
3.在弹出的窗口中,选择 选项卡 HTTPS,并勾选 Decrypt HTTPS Traffic,弹出的的提示窗口选 Yes,之后会再次弹窗,选 是。

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

[photos]
配置 HTTPS
再次弹窗
[/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.点 设置 - 账户,往下滑。
QQ邮箱设置
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]
修改1
修改1
修改1
[/photos]

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

[photos]
修改2
修改2
[/photos]

© 2025 时舟
Theme by Wing
粤 ICP 备 2021012393 号-1
  • {{ item.name }}
  • {{ item.name }}