1. 程式人生 > >java實現百度統計api呼叫

java實現百度統計api呼叫

**公司需要呼叫百度統計的api,昨天搞了一天,先看了百度統計的官方文件 emmmmmmm 是真的沒怎麼看懂,然後在網上搜了各位大牛的實現,最後自己嘗試了一下訪問成功!**

首先是訪問https的類(網上找大牛copy的):
類名 HttpsUtil

package com.cutc.baiduapi;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import
java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import
javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; public class HttpsUtil { private static class TrustAnyTrustManager implements X509TrustManager { public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { // TODO Auto-generated method stub
} public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { // TODO Auto-generated method stub } public X509Certificate[] getAcceptedIssuers() { // TODO Auto-generated method stub return null; } } private static class TrustAnyHostnameVerifier implements HostnameVerifier { public boolean verify(String arg0, SSLSession arg1) { // TODO Auto-generated method stub return false; } } /** * post方式請求伺服器(https協議) * * @param url * 請求地址 * @param content * 引數 * @param charset * 編碼 * @return * @throws NoSuchAlgorithmException * @throws KeyManagementException * @throws IOException */ public static byte[] post(String url, String content, String charset) throws NoSuchAlgorithmException, KeyManagementException, IOException { SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom()); URL console = new URL(url); HttpsURLConnection conn = (HttpsURLConnection) console.openConnection(); conn.setSSLSocketFactory(sc.getSocketFactory()); conn.setHostnameVerifier(new TrustAnyHostnameVerifier()); conn.setDoOutput(true); conn.connect(); DataOutputStream out = new DataOutputStream(conn.getOutputStream()); out.write(content.getBytes(charset)); // 重新整理、關閉 out.flush(); out.close(); InputStream is = conn.getInputStream(); if (is != null) { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = is.read(buffer)) != -1) { outStream.write(buffer, 0, len); } is.close(); return outStream.toByteArray(); } return null; } }

然後需要訪問獲得siteId的方法:

package com.cutc.baiduapi;

import org.json.JSONObject;

public class TjApi {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            JSONObject header = new JSONObject();
            header.put("username", "");//使用者名稱
            header.put("password", "!");//使用者密碼
            header.put("token", "");//申請到的token
            header.put("account_type", "1");

            String urlStr = "https://api.baidu.com/json/tongji/v1/ReportService/getSiteList";
            String charset = "utf-8";

            JSONObject params = new JSONObject();
            params.put("header", header);

            byte[] res = HttpsUtil.post(urlStr, params.toString(), charset);
            String s = new String(res);
            System.out.println(s);    
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

    }

}

返回的資料這樣的:

{
    "header":{
        "desc":"success",
        "failures":[

        ],
        "oprs":1,
        "succ":1,
        "oprtime":0,
        "quota":1,
        "rquota":49992,
        "status":0
    },
    "body":{
        "data":[
            {
                "list":[
                    {
                        "status":0,
                        "create_time":"2017-04-26 17:25:10",
                        "domain":"tourforce.asia",
                        "site_id":10646729,
                        "sub_dir_list":[

                        ]
                    }
                ]
            }
        ]
    }
}

這裡就可以獲取到我們需要的site_id
然後再去請求這個site_id的資料:

package com.cutc.baiduapi;

import org.json.JSONObject;

public class TjApi {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            JSONObject header = new JSONObject();
            header.put("username", "");//使用者名稱
            header.put("password", "");//使用者密碼
            header.put("token", "");//申請到的token
            header.put("account_type", "1");

//          String urlStr = "https://api.baidu.com/json/tongji/v1/ReportService/getSiteList";
            String urlStr = "https://api.baidu.com/json/tongji/v1/ReportService/getData";
            String charset = "utf-8";


            JSONObject body = new JSONObject();
            body.put("siteId","10646729");
            body.put("method","overview/getTimeTrendRpt");//需要獲取的資料
            body.put("start_date","20171220");
            body.put("end_date","20171222");
            body.put("metrics","pv_count,visitor_count,ip_count");//指標,資料單位

            JSONObject params = new JSONObject();
            params.put("header", header);
            params.put("body", body);

            byte[] res = HttpsUtil.post(urlStr, params.toString(), charset);
            String s = new String(res);
            System.out.println(s);

        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

    }

}

獲取到的資料如下:

{
    "header":{
        "desc":"success",
        "failures":[

        ],
        "oprs":1,
        "succ":1,
        "oprtime":0,
        "quota":1,
        "rquota":49989,
        "status":0
    },
    "body":{
        "data":[
            {
                "result":{
                    "items":[
                        [
                            [
                                "2017/12/20"
                            ],
                            [
                                "2017/12/21"
                            ],
                            [
                                "2017/12/22"
                            ]
                        ],
                        [
                            [
                                17694,
                                8811,
                                8450
                            ],
                            [
                                17271,
                                8435,
                                7996
                            ],
                            [
                                17169,
                                8306,
                                8029
                            ]
                        ],
                        [

                        ],
                        [

                        ]
                    ],
                    "timeSpan":[
                        "2017/12/20 - 2017/12/22"
                    ],
                    "fields":[
                        "simple_date_title",
                        "pv_count",
                        "visitor_count",
                        "ip_count"
                    ]
                }
            }
        ]
    }
}