java获取空气质量在线监测分析平台(PM2.5真气网)数据

空气质量在线监测分析平台(PM2.5真气网) https://www.aqistudy.cn/

获取实时监测数据:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
通过以上信息可知请求需要携带的参数d是加密的,返回的信息也是加密的
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191216144339977.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0ZPUkxPVkVIVUFO,size_16,color_FFFFFF,t_70
查找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;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章