今天突然想调百度统计的API,然后实现后台查看百度统计的数据。
于是花了一段时间做了这个功能,本身很简单,但是用到了fastjson与string字符串之间进行互转,还有各种取值,很头痛,没能实现,最后使用了字符串的split与substring进行了相关的截取。
先放一下做完的成果,我获取了百度统计的总的PV与UV,然后进行展示,这是我的后台界面。
首先呢,你需要开启百度统计的获取数据的权限:
登录百度统计,选择管理
在左侧菜单的最下面,有个数据导出服务
然后申请开通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();
}
}
}
然后对获取到的数据,随便怎么处理都可以了!