Tag Archives: python

做了一个查询上海居转户状态的小工具

去年下半年申请了居转户,据说最多要等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包,方便之后分析。
screenshot-chrome

整个过程包含:

  1. 第一次HTTP GET访问网站,得到cookie(即requests里的session)
  2. 发送一次HTTP GET请求验证码
    screenshot-chrome-captcha
  3. 发送一次HTTP POST把用户名、密码、验证码发送到网站
    screenshot-chrome-login
  4. 成功登陆后,发送一次HTTP POST点击”我接受”的按钮
    screenshot-chrome-accept
  5. 进入后续的页面,再发送一次HTTP GET点击”我的申报信息”的按钮
    screenshot-chrome-myinfo

这个过程本身很简单,这里只记录几个要注意的点:

  1. 用户名是经过处理的,具体是md5.jshex_md5()这个函数,把字符串作为hex值然后算md5就可以了;
  2. 密码是明文,通过HTTP发送的,政府的网站无力吐槽。。。
  3. 通过pytesseract解析验证码不一定每次都成功,如果失败,可以再试一次,之后可以在这个脚本的基础上加一个retry
  4. beautifulsoup解析网页,发现这里面table的格式实现是——太不规则了。目前只能hard code来得到最后的结果。所以如果网页稍微有点变化,这个脚本可能就需要更新。
  5. 这个网站开放时间不是全天,而是8:00至22:00。 而22:00至次日8:00是打不开的。。。

然后把这个脚本设个cron task定期跑一下,结果通过邮件发送给自己,就不再需要自己去网站上check啦!

最后,附上github的code: https://github.com/mine260309/shjzh_query

Share

发挥余热的Raspberry Pi 1

迁移到Raspberry Pi2之后,原来的Pi1继续发挥余热——接着个PS2 Eyetoy摄像头,每小时自动拍照、获取空气质量指数、发twitter。当然,Eyetoy拍出来的渣画质不能看,只是做着玩的。

这里记录一下实现的细节。

  • 拍照
    树莓派的官方镜像的kernel已经支持很多摄像头了,USB接口的Eyetoy插上去,直接就有/dev/video0设备。
    各种软件都可以拍照,比如说fswebcam, streamer,等等。我用的是fswebcam

      fswebcam -r 640x480 -S 20 --title "xxx"
    

    其中`-r`是分辨率,不多说了;`-S 20`是跳过20帧,因为如果只取第一帧,画面会不完整,曝光也不对,20帧(大概3秒之后)差不多就够了; `–title “xxx”`是嵌在图像里的标题。

  • 获取AQI
    在aqicn.org上查了一下,离家最近的是张江的监测点,网页是http://aqicn.org/city/shanghai/pudongzhangjiang/
    网页内容里已经带了AQI指数,所以要获取AQI的数值,直接在页面里用正则表达式匹配一下就行了。

        pattern = (' Air Pollution measured on (\w+) (.+): ' +
                   city.capitalize() +
                   ' overall air quality index is (\d+)')
        results = re.findall(pattern, content)
    

    得到的`results[0]`就是匹配到的内容,是个tuple,分别是weekday,time,AQI。

  • 发Twitter
    网上有各种twitter的库,google一下,选了个简单的twython。
    使用 Twitter API 也超简单,到https://apps.twitter.com/申请一个app拿到consumer key/secret;
    再generate一个access token/secret;
    然后用这4个参数初始化twython,发带图片的tweet调用`update_status_with_media`,搞定。
    不过`update_status_with_media`已经过时了,以后应该需要用`upload_media`+`update_status`来搞定,不过现在还能用,先这么用着。

      CONSUMER_KEY = 'YOUR-CONSUMER-KEY'
      CONSUMER_SECRET = 'YOUR-CONSUMER-SECRET'
      ACCESS_KEY = 'YOUR-ACCESS-KEY'
      ACCESS_SECRET = 'YOUR-ACCESS-SECRET'
      ...
      api = Twython(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_KEY,ACCESS_SECRET)
      image = open(imagefile, 'rb')
      api.update_status_with_media(media=image, status=tweet)
    
  • 其它
    要定时跑脚本,crontab里加一个每小时跑一次的脚本就行;
    要翻墙,用的是shadowsocks + cow,然后在脚本前加上http/https proxy的环境变量:

    0 * * * * http_proxy=http://127.0.0.1:7777/ https_proxy=http://127.0.0.1:7777/ /home/pi/pi-pudongair/main.py
    

完整的code放在了gist上:https://gist.github.com/mine260309/771512fc912d283496d9

效果见 @PiPudongAir,欢迎关注。

Share