0. 前言
随着大量的同学都在使用各种软件在我去图书馆平台上抢座,我们这些手动抢座的同学根本不是对手,只有抢座软件可以对抗抢座软件,所以本人便写了一个自动抢座的代码,发送请求需要wechatSESS_ID和Authorization字段,需要抓包获取这两个cookie。但是手机抓https包需要安装证书,而高版本的安卓手机在不root的情况下无法抓包,幸好腾讯还是给我们留下了一个阉割版的电脑端微信,在电脑上就没有能限制我们的了。
本项目Github地址:https://github.com/faliks-f/auto-go-library,欢迎大家给出宝贵建议
1.访问首页登录包
我去图书馆后端基于Graplql开发,简单来说,就是只有一个访问网址,所有的操作通过post请求附带的不同参数实现,首先我们打开Charles,开始抓包,电脑登录微信打开我去图书馆小程序,随便点两下,就可以在Charles中看到抓到的数据包。
我去图书馆的数据包在Charles中的路径如下,注意会有几个相似的路径出现,不要选错了。
然后我们点击最下面的包,可以在右侧Overview中看到相关信息
其中URL那里就是我们需要在代码中post请求的路径,之前提到过Graphql的所有操作只有参数不同,所以这一个URL就是我们唯一需要的请求路径。点击Overview旁边的Contents,在点击下方的Cookies,可以看到访问请求的Cookie。
在这些Cookie中,必须的是wechatSESS_ID和Autorization以及SERVERID这三项,只要有这三项就可以通过后端的验证。
接下来选择JSON Text,可以看到如下的JSON语句。
{
"operationName": "index",
"query": "query index($pos: String!, $param: [hash]) {\n userAuth {\n oftenseat {\n list {\n id\n info\n lib_id\n seat_key\n status\n }\n }\n message {\n new(from: \"system\") {\n has\n from_user\n title\n num\n }\n indexMsg {\n message_id\n title\n content\n isread\n isused\n from_user\n create_time\n }\n }\n reserve {\n reserve {\n token\n status\n user_id\n user_nick\n sch_name\n lib_id\n lib_name\n lib_floor\n seat_key\n seat_name\n date\n exp_date\n exp_date_str\n validate_date\n hold_date\n diff\n diff_str\n mark_source\n isRecordUser\n isChooseSeat\n isRecord\n mistakeNum\n openTime\n threshold\n daynum\n mistakeNum\n closeTime\n timerange\n forbidQrValid\n renewTimeNext\n forbidRenewTime\n forbidWechatCancle\n }\n getSToken\n }\n currentUser {\n user_id\n user_nick\n user_mobile\n user_sex\n user_sch_id\n user_sch\n user_last_login\n user_avatar(size: MIDDLE)\n user_adate\n user_student_no\n user_student_name\n area_name\n user_deny {\n deny_deadline\n }\n sch {\n sch_id\n sch_name\n activityUrl\n isShowCommon\n isBusy\n }\n }\n }\n ad(pos: $pos, param: $param) {\n name\n pic\n url\n }\n}",
"variables": {
"pos": "App-首页"
}
}
Graphql通过请求体携带不同的JSON语句实现不同的功能,我们只要将这段JSON语句复制到post请求参数中,就可以实现访问首页的功能。
2.其他相关接口
其他接口与访问首页接口并无太多区别,使用相同的Cookie,只有请求参数不同,如holdValidate接口的访问参数为
{
"operationName": "getUserCancleConfig",
"query": "query getUserCancleConfig {\n userAuth {\n user {\n holdValidate: getSchConfig(fields: \"hold_validate\", extra: true)\n }\n }\n}",
"variables": {}
}
查询图书馆结构的访问参数为
{
"operationName": "list",
"query": "query list {\n userAuth {\n reserve {\n libs(libType: -1) {\n lib_id\n lib_floor\n is_open\n lib_name\n lib_type\n lib_group_id\n lib_comment\n lib_rt {\n seats_total\n seats_used\n seats_booking\n seats_has\n reserve_ttl\n open_time\n open_time_str\n close_time\n close_time_str\n advance_booking\n }\n }\n libGroups {\n id\n group_name\n }\n reserve {\n isRecordUser\n }\n }\n record {\n libs {\n lib_id\n lib_floor\n is_open\n lib_name\n lib_type\n lib_group_id\n lib_comment\n lib_color_name\n lib_rt {\n seats_total\n seats_used\n seats_booking\n seats_has\n reserve_ttl\n open_time\n open_time_str\n close_time\n close_time_str\n advance_booking\n }\n }\n }\n rule {\n signRule\n }\n }\n}"
}
3.持久化Cookie
在实际应用中,我们抓包获取的cookie如果长时间不访问页面就会过期,我们可以每隔一段时间发送访问首页的数据包就可以不断更新我们的cookie,同时写回文件。