一亩三分地自动签到:识别Discuz验证码

每日签到领大米,这种东西最适合自动化完成了,不过一亩三分地签到有验证码,似乎没人做过这个,得自己造个轮子了2333

一亩三分地是Discuz论坛,可以自己搭一个,搭出来在后台看是这样子的:
Snipaste_2020-12-13_16-57-50

Discuz支持验证码样式的灵活配置,我们照着一亩三分地的验证码自己调整一下,调整出这样的配置:
宽150高60
随机图片背景
随机背景图形
随机颜色
文字阴影
GIF动画

选择了这些选项以后效果如下。
1607774918706_5

然后我们可以用我们的测试站批量造验证码数据,方法是在验证码生成的php逻辑里加一个输出后门,如下:
1607774690121_2

然后就可以在HTTP响应头中得到验证码的结果:
1607774781219_3

一口气造了60000张,50000做训练集,10000做测试集。

接下来去炼个丹,网上有现成的项目可以直接拿来改,如我用了这个: https://github.com/ice-tong/pytorch-captcha
需要把CNN模型稍微改一下,匹配我们的图片大小。
1607786320384_7
训练效果还是不错的。最后炼成的丹大小大概2.3M,使用的时候占用内存70M左右。

顺便一提,Discuz这种GIF动画其实并不难解,因为它一共只包含10帧,其中一帧是真正的验证码内容,剩下9帧是短暂的光影,那一帧我们真正感兴趣的验证码内容其实有明显的特点,就是它的duration很长,2.9~3秒,其他的都不超过0.2秒,很容易把验证码帧提取出来,然后就是直接扔给CNN。

剩下的就是抓包写交互了,基本上没有什么可讲的。

除了每日签到,还有一个是每日答题,答对可以再+1,答错-1。似乎这个题库很久没有变过了,以至于已经有人做了一个油猴脚本用来辅助答题,其中包含了结构化的题库数据:https://github.com/eagleoflqj/p1a3_script/blob/master/QA.js

我们直接把这个拿来用就好了。

部署上以后不管了。