1 package com.foxinmy.weixin4j.mp.api;
2
3 import java.util.Calendar;
4 import java.util.Date;
5 import java.util.List;
6
7 import com.alibaba.fastjson.JSON;
8 import com.alibaba.fastjson.JSONObject;
9 import com.foxinmy.weixin4j.exception.WeixinException;
10 import com.foxinmy.weixin4j.http.weixin.WeixinResponse;
11 import com.foxinmy.weixin4j.model.Token;
12 import com.foxinmy.weixin4j.mp.type.DatacubeType;
13 import com.foxinmy.weixin4j.token.TokenManager;
14 import com.foxinmy.weixin4j.util.DateUtil;
15
16 /**
17 * 数据分析API
18 * <p>
19 * 1、接口侧的公众号数据的数据库中仅存储了2014年12月1日之后的数据,将查询不到在此之前的日期,即使有查到,也是不可信的脏数据;</br>
20 * 2、请开发者在调用接口获取数据后,将数据保存在自身数据库中,即加快下次用户的访问速度,也降低了微信侧接口调用的不必要损耗。</br>
21 * </p>
22 *
23 * @className DataApi
24 * @author jinyu(foxinmy@gmail.com)
25 * @date 2015年1月7日
26 * @since JDK 1.6
27 * @see
28 */
29 public class DataApi extends MpApi {
30 private final TokenManager tokenManager;
31
32 public DataApi(TokenManager tokenManager) {
33 this.tokenManager = tokenManager;
34 }
35
36 /**
37 * 数据统计
38 *
39 * @param datacubeType
40 * 统计类型
41 * @param beginDate
42 * 开始日期
43 * @param offset
44 * 增量 表示向前几天 比如 offset=1 则查询 beginDate的后一天之间的数据
45 * @see {@link #datacube(DatacubeType, Date,Date)}
46 * @throws WeixinException
47 */
48 public List<?> datacube(DatacubeType datacubeType, Date beginDate,
49 int offset) throws WeixinException {
50 Calendar ca = Calendar.getInstance();
51 ca.setTime(beginDate);
52 ca.add(Calendar.DAY_OF_MONTH, offset);
53 return datacube(datacubeType, beginDate, ca.getTime());
54 }
55
56 /**
57 * 数据统计
58 *
59 * @param datacubeType
60 * 统计类型
61 * @param offset
62 * 增量 表示向后几天 比如 offset=1 则查询 beginDate的前一天之间的数据
63 * @param endDate
64 * 截至日期
65 * @see {@link #datacube(DatacubeType, Date,Date)}
66 * @throws WeixinException
67 */
68 public List<?> datacube(DatacubeType datacubeType, int offset, Date endDate)
69 throws WeixinException {
70 Calendar ca = Calendar.getInstance();
71 ca.setTime(endDate);
72 ca.add(Calendar.DAY_OF_MONTH, 0 - offset);
73 return datacube(datacubeType, ca.getTime(), endDate);
74 }
75
76 /**
77 * 查询日期跨度为0的统计数据(当天)
78 *
79 * @param datacubeType
80 * 统计类型
81 * @param date
82 * 统计日期
83 * @see {@link #datacube(DatacubeType, Date,Date)}
84 * @throws WeixinException
85 */
86 public List<?> datacube(DatacubeType datacubeType, Date date)
87 throws WeixinException {
88 return datacube(datacubeType, date, date);
89 }
90
91 /**
92 * 数据统计
93 *
94 * @param datacubeType
95 * 数据统计类型
96 * @param beginDate
97 * 获取数据的起始日期,begin_date和end_date的差值需小于“最大时间跨度”(比如最大时间跨度为1时,
98 * begin_date和end_date的差值只能为0,才能小于1),否则会报错
99 * @param endDate
100 * 获取数据的结束日期,end_date允许设置的最大值为昨日
101 * @see com.foxinmy.weixin4j.mp.datacube.UserSummary
102 * @see com.foxinmy.weixin4j.mp.datacube.ArticleSummary
103 * @see com.foxinmy.weixin4j.mp.datacube.ArticleTotal
104 * @see com.foxinmy.weixin4j.mp.datacube.ArticleDatacubeShare
105 * @see com.foxinmy.weixin4j.mp.datacube.UpstreamMsg
106 * @see com.foxinmy.weixin4j.mp.datacube.UpstreamMsgDist
107 * @see com.foxinmy.weixin4j.mp.datacube.InterfaceSummary
108 * @return 统计结果
109 * @see <a
110 * href="https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141082&token=&lang=zh_CN">用户分析</a>
111 * @see <a
112 * href="https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141084&token=&lang=zh_CN">图文分析</a>
113 * @see <a
114 * href="https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141085&token=&lang=zh_CN">消息分析</a>
115 * @see <a
116 * href="https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141086&token=&lang=zh_CN">接口分析</a>
117 * @throws WeixinException
118 */
119 public List<?> datacube(DatacubeType datacubeType, Date beginDate,
120 Date endDate) throws WeixinException {
121 String datacube_uri = getRequestUri("datacube_uri");
122 Token token = tokenManager.getCache();
123 JSONObject obj = new JSONObject();
124 obj.put("begin_date", DateUtil.fortmat2yyyy_MM_dd(beginDate));
125 obj.put("end_date", DateUtil.fortmat2yyyy_MM_dd(endDate));
126 WeixinResponse response = weixinExecutor.post(String.format(datacube_uri,
127 datacubeType.name().toLowerCase(), token.getAccessToken()), obj
128 .toJSONString());
129
130 return JSON.parseArray(response.getAsJson().getString("list"),
131 datacubeType.getClazz());
132 }
133 }