抓包工具:Charles
推荐一个IOS抓包APP: Stream
先根据教程设置:
1.手机链接Charles
2.PC需安装证书,手机需信任(IOS-12到设置-通用-关于本机-证书信任设置),否则无法抓取HTTPS请求
3.手机WIFI配置HTTP代理
抓取请求
打开APP,刷新列表
找到发送的请求,可以看到请求方式GET、请求路径、参数、请求头,以及返回的数据等信息
使用Postman调用(GET)
其中请求头中的token、appversion必传
token: 用户登录验证
appversion: 版本如果不传,返回的数据可能会少
Content-Type: GET请求可以不传,POST必须传
使用java代码调用并保存到数据库
使用RestTemplate来进行远程调用
RestTemplate restTemplate = new RestTemplate();
// 请求头
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("token", "858714e6-9166-4a42-a0e9-71d4ebc293f6");
httpHeaders.add("appVersion", " 5.2.3");
HttpEntity<String> httpEntity = new HttpEntity<>(null, httpHeaders);
// 远程调用接口-GET
ResponseEntity<String> exchange = restTemplate
.exchange(
"URL",
HttpMethod.GET,
httpEntity, String.class);
// 返回结果
String body = exchange.getBody();
最后处理字符串,取需要的数据保存即可
多层调用(POST)
其实列表的数据并不全,比如要获取姓名、手机号等信息
那么就需要根据列表返回的参数(比如userId),再调接口获取信息
获取手机号,再次抓包,可以看到请求方式为POST了,请求路径为/call/593120
多抓几次联系方式的包,可以知道路径后面的数字即为userId
点击下面的Text可以获取到POST请求参数
{
"from_id": 15293300, // 多抓几次,判断为业务ID
"from_type": 1 // 写死的
}
java调用
Postman调用设置请求头和参数就行
主要演示restTemplate带参数调用
// 用上面的对象,新增Content-Type即可
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
// 设置请求参数
String requestJson = "{\"from_type\":1,\"from_id\":" + map.get("id") + "}";
HttpEntity<String> entity = new HttpEntity<>(requestJson, httpHeaders);
// 远程调用-POST
ResponseEntity<String> getUserTel = restTemplate
.exchange("https://user-api.xxxx.com/call/" + userId,
HttpMethod.POST,
entity, String.class);
// 根据返回结果格式转换
String userTelBody = getUserTel.getBody();
Map userTelMap = JSONUtil.toBean(userTelBody, Map.class);
Map userTelDataMap = JSONUtil.toBean((JSONObject) userTelMap.get("data"), Map.class);
// 货主联系方式
String userTel = (String) userTelDataMap.get("mobile");
以上就是一个简单的抓包逻辑
结语
有些APP的请求参数和返回结果都是乱码
1.加密了,要脱壳
2.需要证书