空气质量在线监测分析平台(PM2.5真气网) https://www.aqistudy.cn/
获取实时监测数据:
通过以上信息可知请求需要携带的参数d是加密的,返回的信息也是加密的
查找getServerData方法
-
JavaScript 混淆:我们会惊讶的发现getServerData后面跟的不符合js函数定义的写法呀!!!
-
其实这里是经过 JavaScript 混淆加密了,混淆加密之后,代码将变为不可读的形式,但是功能是完全一致的,这是一种常见的 JavaScript 加密手段。我们想要查看到该方法的原始实现则必须对其进行反混淆。
-
反混淆:JavaScript 混淆之后,其实是有反混淆方法的,最简单的方法便是搜索在线反混淆网站,这里提供一个:http://www.bm8.com.cn/jsConfusion/。我们可以将getServerData存在的这行数据粘贴到反混淆的网站中。
建立js文件,将反混淆后的数据保存
新建方法:
public void read() throws Exception {
Invocable invoke = ReadJSUtil.readerJs("static/js/jsCode.js"); // 调用merge方法,并传入两个参数
String c = (String)invoke.invokeFunction("getPostCode","GETDATA","北京");
Thread.sleep(10000);
String strReturn= HTTPUtils.getHttp("https://www.aqistudy.cn/apinew/aqistudyapi.php",c);
String dataStr = (String)invoke.invokeFunction("decodeData",strReturn);
JSONObject jsonObject= JSONObject.parseObject(dataStr);
if("success".equals(jsonObject.get("errmsg"))){
JSONObject result=(JSONObject)jsonObject.get("result");
if(result==null){
return null;
}
JSONObject data=(JSONObject)result.get("data");
if(data==null){
return null;
}
JSONArray arr= com.alibaba.fastjson.JSONArray.parseArray(data.get("rows").toString());
if(arr.size()>0){
for(int i=0;i<arr.size();i++){
JSONObject job = arr.getJSONObject(i);
if("省控点".equals((String)job.get("pointlevel"))){}
}
}
}
public static String getHttp(String allConfigUrl, String param) throws IOException {
// Post请求的url,与get不同的是不需要带参数
URL postUrl = new URL(allConfigUrl);
// 打开连接
HttpURLConnection connection = (HttpURLConnection) postUrl.openConnection();
// 设置是否向connection输出,因为这个是post请求,参数要放在
// http正文内,因此需要设为true
connection.setDoOutput(true);
// Read from the connection. Default is true.
connection.setDoInput(true);
// 默认是 GET方式
connection.setRequestMethod("POST");
// Post 请求不能使用缓存
connection.setUseCaches(false);
//设置本次连接是否自动重定向
connection.setInstanceFollowRedirects(true);
// 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的
// 意思是正文是urlencoded编码过的form参数
connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
// 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成,
// 要注意的是connection.getOutputStream会隐含的进行connect。
connection.connect();
DataOutputStream out = new DataOutputStream(connection
.getOutputStream());
// 正文,正文内容其实跟get的URL中 '? '后的参数字符串一致
String content ="d="+URLEncoder.encode(param, "utf-8");
// DataOutputStream.writeBytes将字符串中的16位的unicode字符以8位的字符形式写到流里面
out.writeBytes(content);
//流用完记得关
out.flush();
out.close();
//获取响应
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
String lineStr="";
while ((line = reader.readLine()) != null){
lineStr+=line;
}
reader.close();
//该干的都干完了,记得把连接断了
connection.disconnect();
System.out.println("lineStr===="+lineStr);
return lineStr;
}