@TOC

起因

在这里插入图片描述
你还在为这种消息而烦恼吗???
反正我很烦这种,然后我就在网上搜索自动化脚本。唉!找到了。本文基本上都是搬运,我自己修改并优化了一下原作者的一些小小的功能。
原作者的项目地址

秃头过程

去年疫情期间,根据学校的,在 支付宝 -> 江西省终身学习卡 -> 小程序 -> 校园防疫 -> 健康签到 进行签到

结果老是忘记被班主任点名

本身也就是软件专业,直接上手干他!

iPhone使用Thor软件抓包,走一遍流程,发现这个小程序就是个套壳网页。

测试中发现cookie不会过期,登陆都省了,图方便直接使用苹果的快捷指令app做了一个发送签到请求的POST,再配合苹果的自动化,完成每日签到。

到了21年寒假,在家闲的胃疼,再加上由于需要帮妹子们(手动狗头)签到,使用快捷指令因为步骤太多很容易失败,于是便有了做程序脚本的想法。再加上个学期的Java学摸鱼摸的有点多,下学期还要学j2ee,就打算使用Java来制作签到脚本。

但是程序员懂得都懂,Java做脚本。。。。。。蛋疼,虽然没学过python,但是寒假帮闺蜜抢华为手机摸索写了个python脚本,也就啥都不怕了,肝就完事了。

写之前在gayhub随手搜了一下,居然发现已经有一位大佬@PrintNow已经使用PHP制作了一个同款脚本Jiangxi-University-Health-Check-in。所以本python脚本除了使用python来实现以外,还进行了一些功能上的优化,同时,这个脚本给了我很多的思路和帮助,包括但不限于:

  • 免登陆进入系统
  • URL中那串数字
  • 关于street参数的描述(@ChiuJun
  • 这个README文档也是从Jiangxi-University-Health-Check-in扒过来修改的哈哈哈哈哈

🧀 食用方法

很乐意解决你在使用过程中遇到的问题,但我也没系统学过python,只能尽力帮忙,欢迎 issues,尽量把整个程序以及产生的log文件全部上传。

A . 部署到自己的服务器 🐂 (适合自己有服务器的童鞋)

  1. 克隆或者下载本项目到本地

  2. 修改 sign.py第4 行签到模式,0表示单人签到 1表示多人签到

  3. 如果使用单人签到模式,即第一步signs = 0,则修改 第8 行 的yourID为你的学号。

    否则,如果使用多人签到模式,即第上一步signs = 0,则11 行的 IDs,每个学号之间同英文 , 分隔开,形如以下的模式:

    1
    IDs = '学号1,学号2,学号3,学号4'

    *Ps:部分学校可能用一卡通号等代替。可以到 https://fxgl.jx.edu.cn/你的高校代码/ 自己尝试一下,(你的高校代码 详见后文 江西省100所高校代码)*

  4. 修改第15 行 学校代码(详见后文 江西省100所高校代码

  5. 修改第18 行 身份类型(0表示学生 1表示教职工)(暂不支持教职工,部分细节有差异,如果有老师需要可以提交issues我再修改

  6. 修改第21 行 是否为毕业班级(0表示是毕业班的学生 1表示不是毕业班的学生)

  7. 修改第28 行 签到模式 (0表示获取前一日的签到定位,1表示使用输入的经纬度)

    因为为了使签到位置产生一点点差异,每次签到都会随机偏移一点。

    如果获取前一日的签到定位进行签到,长时间签到可能会偏差较大,适合多人签到且时间跨度不是不长。每次签到会在上一次签到的基础上随机偏移1.1m以内,理论上连续签到一年会偏移200m左右

    使用输入的经纬度,单人签到推荐,会在你输入的经纬度定位上随机偏移11.1m以内

  8. 如果使用输入的经纬度模式,即上一步中的参数 signType = 1,则还需要配置32行和34行的经纬度、36行的地址,建议在百度拾取坐标系统找到自己的位置。经度是较大的那个。

  9. 如果需要server酱推送,可在第38-46行了解详情并配置

  10. 部署到虚拟主机或者本机,然后cd到相关文件夹,运行命令 python3 sign.py 即可

    1
    2
    3
    4
    5
    # Ubuntu 安装 python3 方法,其它如 CentOS 可以网上搜
    sudo apt install python3
    sudo apt install python3-pip
    #安装完成后继续配置python
    pip3 install requests
  11. 对于liunx系统,建议使用 crontab 定时运行上述命令。Windows可以使用定时任务,macOS也有定时。

    crontab 使用方法可以网上查找资料

B . 部署免费GITHUB服务器(Github Workflows)🔥 (!!推荐!!)(适合自己没有服务器的童鞋)

  1. 克隆/派生本项目到你自己的仓库

  2. 克隆你的项目到本地,在本地编辑sign.py,同A方案的2-9步骤,然后提交回去

    或者直接在GitHub上编辑sign.py并保存

在这里插入图片描述

  1. 点开你项目的Actions,点击左侧Workflows-All workflows-Auto ZFB XiaoYuanFangYi Sign,点击黄色警示⚠️条右边的Enable workflow

  2. 至此,GitHub workflow已经成功开启。默认理想情况下将会在每天的凌晨0点半、9点半、18点半进行三次签到。如果想修改定时时间,可以看下一部分。

C . 部署到腾讯云云函数(免费) 🦄

自己研究咯,只是以前知道这玩意也能免费定时运行代码。

🏪关于GitHub workflow的更多说明

测试一下,怎么知道自己的能不能正常运行呢?

在成功编辑完sign.py和打开workflow后,每次 提交一次push,就可以手动出发运行workflow。此时打开项目的Action,就会发现出了一个新的workflow正在运行或刚刚运行完毕,点击即可查看详情。

点击Do sign可以查看运行详情,当然,每次运行,你的仓库log文件夹下也会自动生成了日志文件,可以进行查看。

如果你配置了SERVER酱,也会将签到日志一起推送。

如果运行失败,你的GitHub绑定的邮箱会收到相关提醒。

以上不仅适用于手动出发的action,每天自动运行的action也是一样的。

怎么修改定时运行的时间?

打开Action,找到一个运行的记录,点击右侧的三个点,再点击View workflow file(推荐)

或者在项目中打开文件夹.github/workflows/autosign.yml
在这里插入图片描述

然后点击右上角的笔进入编辑,在第十二行找到:

1
- cron: '30 */9 * * *'

至于cron的用法,大家具体百度。要注意的是,这里的时间是UTC协调世界时,简单的说,就是要在你理解的北京时间上减去8小事。比如凌晨一点,这里你要输入17点(|1点-8小时|),凌晨十二点,这里你要输入16点(|0点-8小时|),随后右上角提交即可。

注意!github action存在一定的延迟,测试发现可能是几分钟,也可能是几十分钟,也可能是一个多小时。所以到了定时时间却没有运行请不必担心,等一天你再看看。

❗ 关于 street 参数与 zddlwz 参数(平常使用支付宝和微信进行签到的童鞋直接略过)

原项目文档描述:

基于对签到数据的改动较以往数据尽量小的原则,作详细说明(感谢原项目 @ChiuJun >
issues: street参数确定是可选项吗?
定位部分为三个环境:

  1. 支付宝环境
    支付宝环境需要 street 参数,参考支付宝H5开放文档
    street 参数由返回结果的 pois[0].addresspois[0].name 拼接而成,最后再拼接成 address.zddlwz

    1
    2
    3
    address.street = result.pois[0].address + result.pois[0].name;
    //...
    var zddlwz =address.province+address.city+address.district+address.street;

    Singleton.php$street 为空,并且没有将 $street 拼接至 zddlwz ,所以造成了本签到程序提交的签到记录中缺失具体的街道信息
    考虑到大部分人的环境都是支付宝,建议将具体的街道信息加入到POST参数中
    修改 Singleton.php 第 92 行为

    1
    "zddlwz" => $province . $city . $district . $street,//自动地理位置:省市县(区)街道 拼接结果
  2. 微信环境
    微信环境中同样需要 street 参数,并且不同于支付宝环境,微信环境中 street 参数不包含 streetNumber 信息,拼接地理位置时 zddlwz 同样需要详细到街道号。
    至于 street 参数中具体填什么,建议自行查看微信小程序开发者文档。

    1
    2
    3
    address.street = addComp.street;
    //...
    address.zddlwz = addComp.province+addComp.city+addComp.district+addComp.street+addComp.streetNumber;
  3. H5环境
    H5环境 street 参数为可选项,对于H5环境的同学,不需要对 Singleton.php 做额外更改。

    1
    var addressStr = address.province + address.city + address.district;

    备注:由于据了解大家基本上都是使用的支付宝环境,所以本脚本不对H5环境,也就是通过浏览器进行签到的情况不做适配。(我感觉没有使用浏览器签到的,大家应该都是用的支付宝吧,如果有,提交issues,我再进行适配。)

🎨 相关 API 说明

  1. 登录 API

    https://fxgl.jx.edu.cn/学校标识码/public/homeQd?loginName=你的学号&loginType=0

  2. 签到 API

    https://fxgl.jx.edu.cn/学校标识码/studentQd/saveStu

  3. 签到记录页面

    https://fxgl.jx.edu.cn/学校标识码/public/xslby

  4. 是否签到

    https://fxgl.jx.edu.cn/学校标识码/studentQd/studentIsQd

    data为1即为已经签到

  5. 签到记录API

    https://fxgl.jx.edu.cn/学校标识码/studentQd/pageStudentQdInfoByXh

  6. 百度地图API

    http://api.map.baidu.com/reverse_geocoding/v3/ak=80smLnoLWKC9ZZWNLL6i7boKiQeVNEbq&output=json&coordtype=wgs84ll&location=纬度,经度

    从这个签到系统里提取出的ak,正好省了我们去申请

🙇‍ 感谢名单

感谢它们对本文做出的巨大贡献

💻测试环境

系统:macOS Big Sur 11.3 BETA ubuntu18.04

python版本:Python 3.9

🙋‍♀️ 未来计划

可能会有,可能不会有

  • 加入多人签到的完整支持
  • 支持通过server酱进行签到成功/失败通知
  • 配合GitHub Action达到利用GitHub来做服务器免费进行签到
  • 通过获取上一次的签到记录进行签到,并进行随机偏移
  • 支持通过QQ机器人(httpAPI)插件进行签到成功/失败通知

我优化的功能

在sign.py下加入的代码
我优化的主要是原作者是每一天都会重复打卡三次,所以我的手机每一天都重复收到三次消息,就很麻烦。而且使用多人打卡的话,每一个间隔时间就只有几秒钟,长时间有点危险,我就被坑,被辅导员发现了,然后我就优化了。
在这里插入图片描述
==这里的意思是每一天太平洋时间4点8点和0点运行本程序,由于太平洋时间和北京时间相差8个小时==
在这里插入图片描述
在这里插入图片描述
==我所优化的功能一定要按照我三张图片去添加,不然的话还是用原作者的。当然最好是自己主动打卡。==
放心食用,我已经食用了一两个月了。。👨‍🍳👨‍🍳👨‍🍳