国内的疫情最近几天在往好的方向发展,好多天山东都没有新增的新冠病毒感染者了,反观国外倒是愈发严重。每天都会上网看看疫情新闻,屋里睡睡懒觉,比较平淡。github 上发现一个团队整理的疫情timeline,而且每天还在持续更新,非常棒。
比较烦的是,还是得每天带着口罩出门、上班,可能接下来半年口罩都是必需品了吧。年前买的口罩,无良商家迟迟不给发货,不知是被政府征用了,还是嫌当时卖的太便宜了。幸运的是,政府政务网上还有的卖,而且良心价格,只是每周得抢购(5 个/人/周)。虽说不是那么难抢,可手残的我还是抢了好几次才抢到。周末闲的没事,花一个小时写个小脚本,以后每周都有口罩带了!
抢购平台分析
一般来说,政府的网站都是比较简单的,而且为应对疫情这种突发情况而设计的,更是不会太过复杂。果不其然,微信公众号上的链接,可以直接在 PC 浏览器上使用,整体界面也是简单明了。直接填入个人信息和验证码,提交就可以了。
这里唯一的难点在于验证码的识别,因为这是提交前的关键一步。只要解决了验证码,就可以把信息直接提交给服务器
Python 脚本逻辑
对网站响应的分析,我发现:
- 验证码图片,是来自一个固定的 URL;而且网站内只要出现验证码的地方,均为同一个
- 每次刷新验证码 URL,都会更新 cookie 值
- cookie 值将服务器验证码图片、post 回服务器的验证码信息相匹配。以此来保证,每次 get 与 post 的验证码是一一相对的。
因此,我的做法也是分了三部:访问验证码 URL,获取并识别验证码,将验证码与个人信息一同返回给服务器。
需要注意的是,为保证期间 cookie 值一直,这里要用 requests 库的 Session 会话,使得整个响应是在一整条会话中。
验证码识别
所有代码的逻辑都清楚了,但其中最麻烦的应该是验证码的识别了。网站中的验证码类似于如下的样式,是常见的 captcha 验证码,识别难度不高,github 上有很多相关的例子。但是,这个口罩抢购脚本我每周只用一次,而且抢购难度没那么大,我就没想再去折腾。直接采用人工识别的方式,将验证码下载到本地,我自己来识别。方便,准确率最高^_^
总结
整个过程使用到的库只有 requests、Pillow,除去个人信息资料外,关键性代码也只有 10 行左右。小身板,大能量!