java简单调用百度统计API实现后台展示统计数据

木来 木来

今天突然想调百度统计的API,然后实现后台查看百度统计的数据。

于是花了一段时间做了这个功能,本身很简单,但是用到了fastjson与string字符串之间进行互转,还有各种取值,很头痛,没能实现,最后使用了字符串的split与substring进行了相关的截取。

先放一下做完的成果,我获取了百度统计的总的PV与UV,然后进行展示,这是我的后台界面。

图片.png

首先呢,你需要开启百度统计的获取数据的权限:

登录百度统计,选择管理

图片.png

在左侧菜单的最下面,有个数据导出服务

然后申请开通token就可以啦。

然后,你需要先在你的项目里写一个https链接的工具类:

我这里有源码:

package impressive.utils;

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;

/**
 * 
* <p>Title:HttpsUtil </p>
* <p>Description: https链接工具类</p>
* <p>Company:www.inx.fun</p>
* @author  时玉龙
* @date    2018年7月6日下午1:30:34
 */
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;  
        }  
}

然后,你需要在你的Controller中,即获取数据的servlet中,进行https链接

   try {
            JSONObject header = new JSONObject();
            header.put("username", "");//用户名
            header.put("password", "!");//用户密码
            header.put("token", "");//申请到的token
            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":[

                        ]
                    }
                ]
            }
        ]
    }
}

这就说明是成功了,可以获取其中关于你站点的siteid。

如果返回了错误信息,请检查一下自己的帐号和密码还有Token是否正确,然后再检查一下是否加了这一句代码:

 header.put("account_type", "1");

我加了之后就会显示帐号密码或者权限错误,去掉就不报错。

然后我看了一下官方百度统计给的api文件,我发现,那上面是有的。

在这里说明一下account_type这个值的意思:

 ZhanZhang:1,FengChao:2,Union:3,Columbus:4

百度站长是1,百度凤巢是2,百度联盟是3,百度哥伦布是4.

如果返回了上面这样类似的json字符串之后,就说明登录成功了。

那我们,就可以进行简单的获取pv与uv数据了。

这里就可以获取到我们需要的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();
        }

    }

}

然后对获取到的数据,随便怎么处理都可以了!

3 条评论
木来
木来 (作者) 回复 Fun言网
哈哈哈哈,那不得搞个通宵呀
Fun言网
我今天也想着弄来着。。。
很伤
作者可以联系一下我吗,我有一些百度统计的问题想请教一下。看到麻烦加qq谢谢1578689361