如何通过shell脚本自动申请六环外进京证?
摘要:活动在帝都的外地车对进京证应该不陌生,六环外进京证虽然不限次数,但是超过中午就办不了当天的了,你是否还在为出门前才发现忘了办理当天的进京证而懊恼?你是否为办理每周的进京证定过闹钟?如今这一切不堪回首都将过去,欢迎使用 jinjing365
问题背景
外地车辆进入北京,需要办理《进京证》,不办理证件驶入后会被执法设备抓拍,一次罚 100 扣 1 分,目前唯一的线上办理通道是下载《北京交警》App,注册后添加车辆,就可以为自己的爱车随时随地办理进京证了。注意如果有违法记录,需要缴纳罚款后才可以办理,缴纳罚款的线上办理通道是《交管12123》。
最早的时候,进京证只限制进五环的外地车辆,一年可以办理 12 次,一次 7 天。后来扩大范围到了六环,刚开始监控设备没健全还能进一下,目前是不行了,基本一进六环就会被拍。那六环外是不是随便跑呢?也不是的,像一些远郊县城如昌平、延庆、顺义、密云、怀柔、平谷,虽然地处六环之外,但是县城城区也有一个环,凡进此环者,也要办理进京证,对我这种混迹在县城周边的外地车主就非常不友好了,周末去县城里的购物中心、电影院也得办理进京证。也许是倾听了民意,后来改革了,进京证变为六环内与六环外两种:六环内还是一年 12 次,每次 7 天;六环外是一次 7 天但不限次数。一个例外是通州,虽然在六环外,也得按六环内办理,毕竟是城市副中心嘛!
虽然不限次数了,但也不是随意办理的,主要有以下规则:
有未缴纳罚款不能办理
中午 12 点后不能申请当天进京证
可以提前申请,最多提前 3 天
一个帐户可以挂多辆车,但只能为其中一辆车办理
已办理六环外进京证,可以续办六环内进京证,成功后六环外进京证失效;反之不行,也没必要,因为持有六环内进京证可以跑六环外
如果申请的不是当天的进京证,可以取消,但一天内只有一次取消机会,用完就不能再取消了
进京证在最后一天有效期时可以办理新的进京证,也称续期
特殊时期不能办理,比如疫情管控期间 (已翻篇,只是举例)
线上办理速度还是比较快的,基本一分钟左右就能出结果。但对我这种健忘症患者,往往临出门才想起来要办进京证,一看时间,已经过中午 12 点了,就比较尴尬了。
这个时候就想,有一个定时办理进京证的工具就好了,例如每周一凌晨自动办理这一周的进京证。
解决方案
需求搞明白了,下面着手实现。
抓包
首先要搞明白服务端的接口,需要通过抓包对《北京交警》进行报文分析。
之前抓包一直是用 mac 上的 Charles,后来偶然看到有个 VNET App,不需要安装证书、不需要启动代理就能抓包,拿来试了下,果然好用:
注意登录过程不要开启抓包,否则《北京交警》的登录界面会调不出来。除此之外,其它请求基本上都能抓到,从中挑选了两个我们需要关注的接口。
获取当前进京证
这个 stateList 接口可以获取用户账户下所有车辆的进京证信息,有些字段对于下一步申请进京证是必需的,另外了解当前进京证状态也有利于决定是否申请新的进京证。
header
> POST /pro//applyRecordController/stateList HTTP/1.1
> Host:jjz.jtgl.beijing.gov.cn
> Accept: */*
> Accept-Language:zh-CN,zh;q=0.8
> User-Agent:okhttp-okgo/jeasonlzy
> source:8724a2428c3f47358741f978fd082810
> authorization:f36abdfa-8878-46bf-91d9-5666f808e9a4
> Content-Type:application/json;charset=utf-8
> Connection:Keep-Alive
> Accept-Encoding:gzip
> Content-Length:97
比较重要的是 source 和 authorization 字段,前者标识了设备,后者标识了用户 token,也是主要的抓取对象之一,会用于之后的请求中。
data
{
"v": "3.4.1",
"sfzmhm": "150121198603226428",
"s-source": "bjjj-android",
"timestamp": "1676016273000"
}
请求时发送的 json 数据,亲测没什么用,发个空也能得到响应,看起来身份信息通过 http 头的 authorization 字段获取的。
