西安电子科技大学健康卡自动打卡脚本,基于无头 Chromium 浏览器。
基于无头浏览器(无界面浏览器 Puppeteer),相当于模拟真实操作。与直接发送 POST 请求相比,能够更稳定的工作。理论上只要前端不发生变化就能正常工作。
缺点的话就是在服务器上部署比较麻烦,需要安装很多 Chromium 运行所需的库。 阿里云函数计算、腾讯云函数等 Serverless 环境部署十分麻烦,所以不推荐在这类服务上部署。
因为是启动了真正的浏览器,所以运行起来会相对慢一些。
不过打卡追求什么效率呢?打上就行了!
第一次使用前,请确保在你的所在城市至少手动打卡过一次,并且开启自动打卡后中途不再切换城市。
点击右上角的「Fork」按钮。
在这个页面获取位置信息。
- 点击「获取定位信息」。
- 若提示需要权限,请允许。
- 获取成功后,点击「复制打卡用数据」,此时位置信息已存储至剪贴板。
该步骤设置你的信息。
- 依次点开「Settings → Secrets → Actions」。
- 点击「New repository secret」。
- Name 填入
USERNAME
,Value 填入你的学号。 - 点击「Add secret」,此时你已经成功新建了一个 repository secret,Name 为
USERNAME
,Value 为你的学号。 - 同理,新建一个 repository secret,Name 为
PASSWORD
,Value 为你的密码。 - 同理,新建一个 repository secret,Name 为
GEO_INFO
,Value 为你的位置信息,请粘贴刚才复制的位置信息。
- 点击「Actions」,选择「Auto Health Card Check-in」。
- 点击「Run workflow」,在弹出窗口中点击「Run workflow」。
- 等待运行结果即可。如果运行成功会显示绿色的✅。
默认配置是每天早上八点进行打卡。
可以编辑「.github/workflows」里的「run-script.yml」进行自定义设置。该配置文件的第 6 行与定时相关,是一个 cron 表达式。
0 0 * * *
这五项分别代表:分,时,日,月,星期。
表示每天 UTC 时间 0:00,即北京时间 8:00 执行此 action。
北京时间的小时数减去 8 就是 UTC 时间了。如果减出来是个负数,请加上 24,所以注意换算哦。
这里举几个例子
1 23 * * *
:每天 UTC 时间 23:01,即北京时间 7:01 执行。30 10 * * *
:每天北京时间 18:30 执行。
所以看到这里,我相信你应该明白了如何修改打卡时间了。
修改后点击「Start commit」,在弹出窗口中点击「Commit changes」即可保存修改。
更多 cron 表达式的高级用法请看这里。
该脚本执行需要 node.js 环境。请先确保个人电脑或服务器上安装了 node.js。
以下命令如无特别注明,则均在项目文件夹里执行。
你也可以克隆仓库。请确保下面的指令均在包含该文件的文件夹(即项目文件夹)内运行。
执行下面的指令,安装 puppeteer。
npm i puppeteer
如果使用 yarn,可执行 yarn add puppeteer
。
如果你发现安装的 puppeteer 没有附带浏览器(特点是 node_modules 文件夹不到 100 MB),请参考下面的「指定外部浏览器」。
使用文本编辑器(如 VS Code、Sublime Text,记事本也算)打开 yqt-check.js。
username = '你的学号';
password = '你的密码';
🔼 这两个字符串分别替换成统一身份认证的学号和密码。注意是字符串格式,带引号。
geoData = {
"type": "complete",
// ...
"info": "SUCCESS"
};
🔼 geoData
是位置信息数据。可以在这个页面获取(建议使用手机打开,定位更精准,以免出现奇妙 bug)。获取完之后点击「复制可视化数据」。复制之后可以直接粘贴,替换掉花括号及其内部的内容。
注意:这个数据一定要保证和上一次手动打卡在一个城市,否则会打卡失败(因为填写时需要选择切换城市,以及原因,脚本可不会自动处理这种情况)。
如果更换城市,请手动更换成最新获取的 geoData
,并且下一次手动打卡。
在 yqt-check.js 的第 27 行,有
const browser = await puppeteer.launch();
下面提到的修改浏览器启动参数,改的就是这一行 launch()
括号里面的内容。
如果你对 JavaScript 有了解,应该明白括号里面是个 Object。
如果你使用的不是 Linux 系统,可以跳过这一步。
如果你使用的是 Linux 系统,可能会出现浏览器无法启动的情况,这时候就需要修改浏览器启动参数
const browser = await puppeteer.launch({
args: ['--no-sandbox', '--disable-setuid-sandbox'],
});
这样做关闭了 Chromium 的沙箱机制,官方并不推荐这种做法,因为不够安全,但确实是最简单的方法。 官方也提供了其他的替代方案(更安全)。
如果你的 puppeteer 带了浏览器,可以跳过这一步。
修改浏览器启动参数,指定 Chrome/Chromium 启动路径。
这里的示例是 macOS 的 Chrome 路径,其他平台按需填写。如:Windows 平台是 chrome.exe 的路径)。这里的浏览器需要是 Chromium 内核的。
const browser = await puppeteer.launch({
executablePath: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
// 指定 Chrome/Chromium 启动路径
});
执行指令,如果输出为 { e: 0, m: '操作成功', d: {} }
或 { e: 1, m: '今天已经填报了', d: {} }
就算成功了。如果想要偷懒,设置定时运行即可。
node yqt-check.js
如果想要定时在 Windows 电脑上运行,请用「Windows 计划任务」功能。注意打卡时电脑不能睡眠或关机。
如果想要定时在 Linux 服务器上运行,请用 crontab 。
个人测试该脚本在完整 Windows 环境下能够正常运行。
Linux 系统可能会因为或多或少的库缺失无法运行。启动时如果有缺失的库会报错,以及缺失库的名字。一般缺哪个装哪个就好了。
该网站是托管于 GitHub Pages 的纯静态网站,不会收集任何信息。所使用的 API 是从健康卡打卡网页扒的 API,保证获取数据的可用性。
网站源代码也在项目里,即 index.html 。如果网站挂了或者域名到期了,可以在本地部署使用。