如何通过shell脚本调试自动申请六环外进京证过程?

摘要:写好的自动办理六环外进京证脚本跑不通,总是返回办理业务人数较多 (500) 错误,CharlesVNET 抓包、android 交叉编译 jq、升级 curl…都不起作用,最终还是神奇的 adb shell 帮了大忙,最后定位到根因,
问题现象 用 shell 脚本写了一个自动办理六环外进京证的工具 《使用 shell 脚本自动申请进京证 (六环外)》,然而运行这个脚本总是返回以下错误信息: { "msg": "目前办理业务人数较多,请稍后再试。", "code": 500 } 咨询 woodheader/jjz 项目的作者,了解到问题就是出在请求头或参数上。仔细的检查了传入的各种参数,没有发现任何问题;修改 http 头的格式 (key 与 value 间增加空格),也没有丝毫改善。 写脚本花了两天,调试脚本花了三天却还没摸到门径,真是见了鬼了。有时候怀疑是自己被拉进反作弊名单了,切换另外一台设备的 source 和 authorization 后,结果还是出错,真是离了大谱。 思路 目前在 android 设备的 App 上进行请求用同样的参数是可以办理成功的,并且有 VNET/Charles 的抓包数据。如果能对脚本的请求进行抓包,再将两者对比起来看,问题就容易暴露了。 Charles 抓包 curl Charles 抓包的教程网上比较多,这里就不赘述了,需要注意的是和 VNET 一样,App 登录阶段不能抓包,否则登录界面调不出来。 Charles 可以抓 App 的报文,如果也能抓脚本的报文,两个一对比问题就水落石出啦~ 经过一番百度,发现要让 Charles 抓命令行的报文还比较麻烦,需要配置两个环境变量: export http_proxy=172.21.222.149:8888 export https_proxy=172.21.222.149:8888 其中 172.21.222.149:8888 就是 Charles 开启代理的 IP 和端口: 然而开启抓包后,curl 要么失败,要么卡住,总是抓不到包: > sh jinjing.sh check jq ok check curl ok check head ok check cat ok check awk ok check grep ok check date ok state req: {"v":"3.4.1","sfzmhm":"150121198603226428","s-source":"bjjj-android","timestamp":"1677810190000"} state headers: -H Accept-Language:zh-CN,zh;q=0.8 -H User-Agent:okhttp-okgo/jeasonlzy -H source:8724a2428c3f47358741f978fd082810 -H authorization:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -H Content-Type:application/json;charset=utf-8 -H Host:jjz.jtgl.beijing.gov.cn -H Connection:Keep-Alive -H Accept-Encoding:gzip -H Content-Length:0 jinjing.sh: line 99: [: too many arguments query permits status ok: id [] from user token does not match given [150121198603226428], fatal error! VNET 抓包 curl Charles 不行就想到了 VNET,不过它只能在 android 设备上抓包,如何让它抓 pc 上运行的 curl 呢?其实不难,把脚本放在设备上运行就好了。
阅读全文