发布于 

如何让打卡更加自动化

2022-05-13 更新

学校已经强制统一身份认证登录填写验证码,这个可以通过使用类似 ddddocr 的方式解决,读者可以自行添加。

另外,健康填报新增了填报信息,由于我现在已经改为每天手动打卡,代码已经没有更新的必要,使用者可以自行在代码中补充这些内容。

原文

之前写了一个简单的打卡脚本,通过 Termux 来实现自动化,参见:如何在手机上设置南大 APP 自动打卡。然而这种方法存在两个问题,一是配置比较复杂,二是 Termux 不能稳定地运行在手机后台,有打卡失败的可能。

前几天在 Github 上偶然看到 OrangeX4 的南大自动打卡代码,流程是类似的,加密部分同样是直接套用原有的 JS 代码,不过它的功能更加完善,并且具有 邮件提醒 (现在已经寄了——2022-05-13) 和使用 Github Actions 完成的每日自动打卡功能。

虽然轮子已经造好了,但是自己实现一下也是挺有趣的。于是打算把我写的代码拓展一下,添加提醒与自动打卡功能,用来学习 Github Actions 的使用。具体可以查看 我的 Github 仓库

另外,为了更简洁地使用邮件提醒服务,我利用 Vercel 的 SeverlessFunction 搭建了一个简单的邮件 API 服务,同时也学习了一下 IBMCloudant 数据库的使用。值得一提的是,Cloudant 的官方文档中提供了常用接口的 Python 示例,可以帮助使用者尽快上手。这个项目可以点击 这里(这个项目已经转为私有仓库,以后可能会开放——2022-05-13)

我选择 IBM 的云服务主要是因为 Azure 注册需要信用卡,AWS 的宁夏免费服务需要企业认证,而 IBM 的轻量用户是不需要信用卡就可以注册的,Google Cloud 没有尝试注册。免费的 Cloudant 账户提供 1G 的 JSON 数据库,位置在美国达拉斯。不过我发现 SeaTable 居然提供官方 API,而我有 20G 的空间容量,之后可以探索一下这些 API 具体可以做些什么。

邮件推送服务使用的是阿里云的免费服务,200 封 / 日的免费额度。即使是没有备案的域名,在添加 TXT 和 MX 记录以后也可以使用,并且支持 API 和 SMTP 方式。阿里云的邮件服务虽然部署在华东,但是海外访问会提供加速。

Vercel 的 Serverless Function 支持 Python,并且可以使用 Flask,同时可以通过 requirements.txt 来添加第三方库。对于免费帐户,Vercel 提供 1G 的内存,并且支持自定义域名。部署位置在美国华盛顿,默认是 Python3.6 环境。

Github Actions 提供了 Windows、Mac 和一些 Linux 发行版的运行环境,并且有一个不断发展的 actions 市场,可以直接使用他人已经写好的 action。另外,Github Actions 支持直接使用 Github Secrets 作为环境变量,并且 Secrets 的内容在 Actions 的运行输出中会被以 *** 替代,保护隐私。

我之前本打算使用 Gitee Go,一个类似于 Github Actions 的服务,但是现在 Gitee Go 还没有向普通用户免费开放。使用 Github 的话,可能是服务器在美国的原因,统一身份认证偶尔会有超时的问题。参考了 OrangeX4(实际上应该是 AnnyTerfect 写的)的代码,总共进行三次登录尝试,如果三次均失败则会发送打卡失败的邮件(后期测试发现三次不是很必要,改为 Python 实现的加密代码后使用起来一直很稳定,不过也可能是巧合——2022-05-13)。

另外一点,实际在做 mail-bot 时,需要把 URL 解码。我使用的是 urllib 中的 unquote 函数,网络上有一些旧的文章使用的是 urllib.unquote ,现在(至少是 Python 3.6-3.8)已经改为urllib.parse.unquote 了,查看教程时要注意教程的发布时间。

还有一件有意思的事情。由于我看不懂统一身份认证使用的加密函数 JS 代码,所以采用直接调用的方式。我使用的是 PyExecJS。不过 PyExecJS 的作者已经停止了开发,理由是 node.js 可以很方便地在各平台安装,使用 Python3 中的 subprocess.check_output 可以直接调用 node 运行 JS 文件,获取返回值。不过这个方法我还没有尝试,之后可以尝试一下。(现在我已经把代码全部 Python 化,加密部分采用的代码来自 这里,不过链接已经无法访问,可以直接通过我的 Github 仓库查看代码)

部分参考:

GitHub Actions 入门教程 - 阮一峰的网络日志 (ruanyifeng.com)

OrangeX4/daily_health_report: 每日健康打卡 (github.com)

Edward Thomson: GitHub Actions Day 11: Secrets

python3 http.server 模块 搭建简易 http 服务器_whatday 的专栏 -CSDN 博客

SMTP 的几个端口的比较_勤劳的小蜜蜂 -CSDN 博客_smtp 端口

简单三步,用 Python 发邮件 - 知乎 (zhihu.com)

Python datetime 如何处理时区信息_python_脚本之家 (jb51.net)

Using Environment Variables & Secrets in Github Actions — _junrong — Bloggie

GitHub Actions 中 python 脚本获取仓库 secrets_深刻的博客 -CSDN 博客

使用 GitHub Actions 自动部署博客教程 - SegmentFault 思否

GitHub Actions 快速入门 - GitHub Docs

GitHub Actions 部署爬虫并定时发送邮件_深刻的博客 -CSDN 博客

How to Deploy a Python Serverless Function to Vercel | by Mahbub Zaman | Towards Data Science

Using Vercel to host a Python API. (frontend-devops.com)

python 学习之 urllib.parse.unquote() - 开飞机的贝塔 - 博客园 (cnblogs.com)

python3 subprocess.check_output 执行 shell 命令 返回结果_whatday 的专栏 -CSDN 博客_subprocess.check_output

Cloudant - IBM Cloud API Docs