由于疫情原因,幼儿园要求每天健康码打卡,每天都需要花时间重复这个动作,作为程序员,这肯定是不能容忍的,必须脚本安排起!
抓包分析API
首先我们需要做的就是抓包,提取API接口,有两种方式,一种是PC微信 + Fiddler
,还有一种就是直接手机抓取,手机需要安装Http Canary
,这是付费软件,当然也有破解版。
我这里就采用第一种方式了,Fiddler
使用的是果壳破解版,下面就讲一下过程中遇到的问题。
-
首先
Fiddler
抓取微信小程序,刚开始无法抓取,在网上搜了很多文章,发现问题出在微信小程序上,微信修改了框架导致的。 -
然后是上传图片到OBS的问题:
- 虽然上在options中指定了host,但在headers中还是必须再加上Host
- 需要手动指定
boundary
和Content-Length
{ host: "obs.jielong.co", headers: { Host: "obs.jielong.co", "Content-Length": await replaceCb2promise(form.getLength.bind(form), [])[1], 'Content-Type': 'multipart/form-data; boundary=' + form.getBoundary(), }, body: form, }
-
接着就是提交打卡记录,需要注意的是:
- 提交时需要添加
Authorization
Content-Type
需要修改为application/json
- 提交时需要添加
接口分析其实是很简单的,结合以上需要规避的问题,基本上写自动化脚本就没啥问题了。
自动生成每日打卡截图
提交接口没问题了,打卡需要健康码截图,这里我就稍微偷了个懒,没有直接使用每日的健康码截图,而是将健康码截图后使用ps抹去了日期相关的信息,然后通过程序对图片写入响应日期信息。
整个脚本程序我使用tinyhttp写的,TS在处理图片方面还是比较麻烦,只能借用第三方库来处理,这里推荐两个库jimp和node-images,这里我采用的是jimp
,需要说明的是在图片上生成日期的时候,jimp
不支持丰富的样式,只能简单的字体。设置稍微复杂一点的文字就不行,比如字体颜色,不同字体大小等。这里我借助了其他人写的脚本来实现的。
先说下这个脚本的思路:
-
先创建透明图片,在图片上写入字体
-
用需要的颜色替换掉图片中字体的颜色
-
再将图片叠加到需要做水印的图片上
-
我在脚本源代码的基础上做了些许修改以适应通用场景
-
调用
serviceGenImage(path.join(__dirname, "images/owner.png"))
定时框架
脚本有了,健康码截图也有了,然后就是解放每日双手,程序自动运行,定时打卡了,ts下也有定时任务框架:cron
、silkyTimer
,相关对而言silkyTimer
更符合我的口味,但是该框架还在测试阶段,稳定性不够。所以就选择了已经很成熟、稳定的corn
,配置也很简单,就是个java下的corn一模一样,直接移植过来的,就不多介绍了。