调用百度统计API

编程

百度统计为用户提供了 API 接入的方式,使得用户可以自定义 UI 而无须进入百度统计网站。百度统计存在两种账号体系:百度商业账号和百度账号,前者就是统计早期的用户账号,本文基于百度商业账号,说明如何接入统计 API。

  • 官方 API 文档:https://tongji.baidu.com/api/manual/
  • 白皮书:https://tongji.baidu.com/web/image/百度发布《网站分析白皮书V3.0》.pdf

通用请求头

接口的请求需要向相应 API 通过 POST 的方式发送 JSON 格式的数据,注意 JSON 数据放在请求的 RawBody 中,而不是一般的键对值得 POST 结构。该请求数据的结构分为两个部分,header 部分是用户信息,body 部分 : 对于不同的 API,body 部分有所不同。

String json = "{"header": "

+ "{"

+ ""username": "xxxxx", "

+ ""password": "xxxxx","

+ ""token": "xxxx","

+ ""account_type": 1"

+ "}"

+ "}";

String html = HttpBasicRequest.post("https://api.baidu.com/json/tongji/v1/ReportService/getSiteList", json, conn -> {

conn.addRequestProperty("Content-type", "application/json");

});

请求必须指定 Content-type 为 application/json,否则不能请求。

实现中我们把 header 用 map 定义,然后转换为 JSON 字符串,如下方法所示。

/**

* 获取请求头

*

* @return

*/

private static String getHeader() {

Map<String, Object> header = new HashMap<String, Object>() {

private static final long serialVersionUID = 1L;

{

put("username", ConfigService.get("baidu_tongji.api_username"));

put("password", ConfigService.get("baidu_tongji.api_password"));

put("token", ConfigService.get("baidu_tongji.api_token"));

put("account_type", 1);

}

};

return JsonHelper.stringifyMap(header);

}

接着可以传入的不同业务需求的 body,body 也是 Map。

private static final String JSON = "{"header": %s, "body": %s}";

/**

* 请求 API

*

* @param body

* @return

*/

private static String getData(Map<String, Object> body) {

String req = String.format(JSON, getHeader(), JsonHelper.stringifyMap(body));

String json = HttpBasicRequest.post("https://api.baidu.com/json/tongji/v1/ReportService/getData", req, conn -> {

conn.addRequestProperty("Content-type", "application/json");

});

return "json::" + json;

}

然后进行请求,返回结果 JSON。

获取站点列表

一个百度统计账号下面可以有多个站点。接口 https://api.baidu.com/json/tongji/v1/ReportService/getSiteList 。关键的字段是 siteId,如果已知 siteId 则可不必请求该接口。

获取报告数据

这是核心的 API,接口是 https://api.baidu.com/json/tongji/v1/ReportService/getData 。在这个接口中根据不同的参数来获取各项的报告数据。具体是 body 的 method 字段。

获取网站概况:今日/昨天 pv/uv

用于概括性的提示,生成界面如下。

@GET

@Path("getTimeTrendRpt")

@Produces(MediaType.APPLICATION_JSON)

public String getTimeTrendRpt() {

Date now = new Date();

Calendar calendar = Calendar.getInstance();

calendar.setTime(now);

calendar.add(Calendar.DAY_OF_MONTH, -1);// 昨天

String today = formater.format(now), yesterday = formater.format(calendar.getTime());

Map<String, Object> body = new HashMap<String, Object>() {

private static final long serialVersionUID = 1L;

{

put("site_id", ConfigService.get("baidu_tongji.siteId"));

put("start_date", yesterday);

put("end_date", today);

put("method", "overview/getTimeTrendRpt");

put("metrics", "pv_count,visitor_count,ip_count,bounce_ratio,avg_visit_time");

}

};

return getData(body);

}

获取网站概况:来源网站、搜索词、入口页面、受访页面

生成界面如下(部分)。

默认是昨天、今天的数据。

@GET

@Path("getCommonTrackRpt")

@Produces(MediaType.APPLICATION_JSON)

public String getCommonTrackRpt() {

Date now = new Date();

Calendar calendar = Calendar.getInstance();

calendar.setTime(now);

calendar.add(Calendar.DAY_OF_MONTH, -1);// 昨天

String today = formater.format(now), yesterday = formater.format(calendar.getTime());

Map<String, Object> body = new HashMap<String, Object>() {

private static final long serialVersionUID = 1L;

{

put("site_id", ConfigService.get("baidu_tongji.siteId"));

put("start_date", yesterday);

put("end_date", today);

put("method", "overview/getCommonTrackRpt");

}

};

return getData(body);

}

获取 pv/uv趋势图

获取趋势分析报告中 PV 和 UV 数据,按天粒度。

@GET

@Path("getTrend")

@Produces(MediaType.APPLICATION_JSON)

public String getTrend(@QueryParam("start_date") @NotNull String start_date, @QueryParam("end_date") @NotNull String end_date) {

Map<String, Object> body = new HashMap<String, Object>() {

private static final long serialVersionUID = 1L;

{

put("site_id", ConfigService.get("baidu_tongji.siteId"));

put("start_date", start_date);

put("end_date", end_date);

put("method", "trend/time/a");

put("metrics", "pv_count,visit_count");

put("max_results", "0");

put("gran", "day");

}

};

return getData(body);

}

本系统基于 vue 的前端。这里需要一个图表组件展示用,我最开始使用 vue2-frappe,但不知为何,可能是样式冲突,加入我的样式就不显示了,DOM 是存在的,我不折腾这组件,于是改为另外一款轻量级的图表组件,更轻量级,而且是国人作品,是为 Laue(https://laue.js.org 、https://github.com/qingwei-li/laue) 。

小结

当前并没有完全整合百度统计的所有 API,而是使用了其最重要的三个接口,在给用户一个初步的展示已经足够了。

以上是 调用百度统计API 的全部内容, 来源链接: utcz.com/z/517805.html

回到顶部