去年下半年申请了居转户,据说最多要等1年半,所以偶尔会要去上海居转户的网站上查询一下状态。
既然是重复性的劳动,那就写个脚本来处理吧。
Short version
用Chrome抓包,分析一下网页的表单,然后用python的各种库发送请求、解析验证码,最后得到结果。
工具放在了github上,执行shjzh_username=$your_id_number shjzh_password=$your_password ./query.py -q
,把your_id_number
, your_password
替换成自己的身份证号、密码,或者设置为环境变量即可。
结果大概长这样:
['例子', '123123199001011234', '受理通过']
Long version
首先通过Chrome把登录网站、查询的过程抓成har包,方便之后分析。
整个过程包含:
- 第一次HTTP GET访问网站,得到cookie(即requests里的session)
- 发送一次HTTP GET请求验证码
- 发送一次HTTP POST把用户名、密码、验证码发送到网站
- 成功登陆后,发送一次HTTP POST点击”我接受”的按钮
- 进入后续的页面,再发送一次HTTP GET点击”我的申报信息”的按钮
这个过程本身很简单,这里只记录几个要注意的点:
- 用户名是经过处理的,具体是md5.js里
hex_md5()
这个函数,把字符串作为hex值然后算md5就可以了; - 密码是明文,通过HTTP发送的,政府的网站无力吐槽。。。
- 通过
pytesseract
解析验证码不一定每次都成功,如果失败,可以再试一次,之后可以在这个脚本的基础上加一个retry - 用
beautifulsoup
解析网页,发现这里面table的格式实现是——太不规则了。目前只能hard code来得到最后的结果。所以如果网页稍微有点变化,这个脚本可能就需要更新。 - 这个网站开放时间不是全天,而是8:00至22:00。 而22:00至次日8:00是打不开的。。。
然后把这个脚本设个cron task定期跑一下,结果通过邮件发送给自己,就不再需要自己去网站上check啦!
最后,附上github的code: https://github.com/mine260309/shjzh_query