analysis.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. package miniprogram
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/silenceper/wechat/util"
  6. )
  7. const (
  8. // 获取用户访问小程序日留存
  9. getAnalysisDailyRetainURL = "https://api.weixin.qq.com/datacube/getweanalysisappiddailyretaininfo?access_token=%s"
  10. // 获取用户访问小程序月留存
  11. getAnalysisMonthlyRetainURL = "https://api.weixin.qq.com/datacube/getweanalysisappidmonthlyretaininfo?access_token=%s"
  12. // 获取用户访问小程序周留存
  13. getAnalysisWeeklyRetainURL = "https://api.weixin.qq.com/datacube/getweanalysisappidweeklyretaininfo?access_token=%s"
  14. // 获取用户访问小程序数据概况
  15. getAnalysisDailySummaryURL = "https://api.weixin.qq.com/datacube/getweanalysisappiddailysummarytrend?access_token=%s"
  16. // 获取用户访问小程序数据日趋势
  17. getAnalysisDailyVisitTrendURL = "https://api.weixin.qq.com/datacube/getweanalysisappiddailyvisittrend?access_token=%s"
  18. // 获取用户访问小程序数据月趋势
  19. getAnalysisMonthlyVisitTrendURL = "https://api.weixin.qq.com/datacube/getweanalysisappidmonthlyvisittrend?access_token=%s"
  20. // 获取用户访问小程序数据周趋势
  21. getAnalysisWeeklyVisitTrendURL = "https://api.weixin.qq.com/datacube/getweanalysisappidweeklyvisittrend?access_token=%s"
  22. // 获取小程序新增或活跃用户的画像分布数据
  23. getAnalysisUserPortraitURL = "https://api.weixin.qq.com/datacube/getweanalysisappiduserportrait?access_token=%s"
  24. // 获取用户小程序访问分布数据
  25. getAnalysisVisitDistributionURL = "https://api.weixin.qq.com/datacube/getweanalysisappidvisitdistribution?access_token=%s"
  26. // 访问页面
  27. getAnalysisVisitPageURL = "https://api.weixin.qq.com/datacube/getweanalysisappidvisitpage?access_token=%s"
  28. )
  29. // fetchData 拉取统计数据
  30. func (wxa *MiniProgram) fetchData(urlStr string, body interface{}) (response []byte, err error) {
  31. var accessToken string
  32. accessToken, err = wxa.GetAccessToken()
  33. if err != nil {
  34. return
  35. }
  36. urlStr = fmt.Sprintf(urlStr, accessToken)
  37. response, err = util.PostJSON(urlStr, body)
  38. return
  39. }
  40. // AnalysisRetainItem 留存项结构
  41. type AnalysisRetainItem struct {
  42. Key int `json:"key"` // 标识,0开始表示当天,1表示1甜后,以此类推
  43. Value int `json:"value"` // key对应日期的新增用户数/活跃用户数(key=0时)或留存用户数(k>0时)
  44. }
  45. // ResAnalysisRetain 小程序留存数据返回
  46. type ResAnalysisRetain struct {
  47. util.CommonError
  48. RefDate string `json:"ref_date"` // 日期
  49. VisitUVNew []AnalysisRetainItem `json:"visit_uv_new"` // 新增用户留存
  50. VisitUV []AnalysisRetainItem `json:"visit_uv"` // 活跃用户留存
  51. }
  52. // getAnalysisRetain 获取用户访问小程序留存数据(日、月、周)
  53. func (wxa *MiniProgram) getAnalysisRetain(urlStr string, beginDate, endDate string) (result ResAnalysisRetain, err error) {
  54. body := map[string]string{
  55. "begin_date": beginDate,
  56. "end_date": endDate,
  57. }
  58. response, err := wxa.fetchData(urlStr, body)
  59. if err != nil {
  60. return
  61. }
  62. err = json.Unmarshal(response, &result)
  63. if err != nil {
  64. return
  65. }
  66. if result.ErrCode != 0 {
  67. err = fmt.Errorf("getAnalysisRetain error : errcode=%v , errmsg=%v", result.ErrCode, result.ErrMsg)
  68. return
  69. }
  70. return
  71. }
  72. // GetAnalysisDailyRetain 获取用户访问小程序日留存
  73. func (wxa *MiniProgram) GetAnalysisDailyRetain(beginDate, endDate string) (result ResAnalysisRetain, err error) {
  74. return wxa.getAnalysisRetain(getAnalysisDailyRetainURL, beginDate, endDate)
  75. }
  76. // GetAnalysisMonthlyRetain 获取用户访问小程序月留存
  77. func (wxa *MiniProgram) GetAnalysisMonthlyRetain(beginDate, endDate string) (result ResAnalysisRetain, err error) {
  78. return wxa.getAnalysisRetain(getAnalysisMonthlyRetainURL, beginDate, endDate)
  79. }
  80. // GetAnalysisWeeklyRetain 获取用户访问小程序周留存
  81. func (wxa *MiniProgram) GetAnalysisWeeklyRetain(beginDate, endDate string) (result ResAnalysisRetain, err error) {
  82. return wxa.getAnalysisRetain(getAnalysisWeeklyRetainURL, beginDate, endDate)
  83. }
  84. // ResAnalysisDailySummary 小程序访问数据概况
  85. type ResAnalysisDailySummary struct {
  86. util.CommonError
  87. List []struct {
  88. RefDate string `json:"ref_date"` // 日期
  89. VisitTotal int `json:"visit_total"` // 累计用户数
  90. SharePV int `json:"share_pv"` // 转发次数
  91. ShareUV int `json:"share_uv"` // 转发人数
  92. } `json:"list"`
  93. }
  94. // GetAnalysisDailySummary 获取用户访问小程序数据概况
  95. func (wxa *MiniProgram) GetAnalysisDailySummary(beginDate, endDate string) (result ResAnalysisDailySummary, err error) {
  96. body := map[string]string{
  97. "begin_date": beginDate,
  98. "end_date": endDate,
  99. }
  100. response, err := wxa.fetchData(getAnalysisDailySummaryURL, body)
  101. if err != nil {
  102. return
  103. }
  104. fmt.Println(string(response))
  105. err = json.Unmarshal(response, &result)
  106. if err != nil {
  107. return
  108. }
  109. if result.ErrCode != 0 {
  110. err = fmt.Errorf("GetAnalysisDailySummary error : errcode=%v , errmsg=%v", result.ErrCode, result.ErrMsg)
  111. return
  112. }
  113. return
  114. }
  115. // ResAnalysisVisitTrend 小程序访问数据趋势(日、月、周)
  116. type ResAnalysisVisitTrend struct {
  117. util.CommonError
  118. List []struct {
  119. RefDate string `json:"ref_date"` // 日期
  120. SessionCnt int `json:"session_cnt"` // 打开次数
  121. VisitPV int `json:"visit_pv"` // 访问次数
  122. VisitUV int `json:"visit_uv"` // 访问人数
  123. VisitUVNew int `json:"visit_uv_new"` // 新用户数
  124. StayTimeUV float64 `json:"stay_time_uv"` // 人均停留时长
  125. StayTimeSession float64 `json:"stay_time_session"` // 次均停留时常
  126. VisitDepth float64 `json:"visit_depth"` // 平均访问深度
  127. } `json:"list"`
  128. }
  129. // getAnalysisRetain 获取小程序访问数据趋势(日、月、周)
  130. func (wxa *MiniProgram) getAnalysisVisitTrend(urlStr string, beginDate, endDate string) (result ResAnalysisVisitTrend, err error) {
  131. body := map[string]string{
  132. "begin_date": beginDate,
  133. "end_date": endDate,
  134. }
  135. response, err := wxa.fetchData(urlStr, body)
  136. if err != nil {
  137. return
  138. }
  139. err = json.Unmarshal(response, &result)
  140. if err != nil {
  141. return
  142. }
  143. if result.ErrCode != 0 {
  144. err = fmt.Errorf("getAnalysisVisitTrend error : errcode=%v , errmsg=%v", result.ErrCode, result.ErrMsg)
  145. return
  146. }
  147. return
  148. }
  149. // GetAnalysisDailyVisitTrend 获取用户访问小程序数据日趋势
  150. func (wxa *MiniProgram) GetAnalysisDailyVisitTrend(beginDate, endDate string) (result ResAnalysisVisitTrend, err error) {
  151. return wxa.getAnalysisVisitTrend(getAnalysisDailyVisitTrendURL, beginDate, endDate)
  152. }
  153. // GetAnalysisMonthlyVisitTrend 获取用户访问小程序数据月趋势
  154. func (wxa *MiniProgram) GetAnalysisMonthlyVisitTrend(beginDate, endDate string) (result ResAnalysisVisitTrend, err error) {
  155. return wxa.getAnalysisVisitTrend(getAnalysisMonthlyVisitTrendURL, beginDate, endDate)
  156. }
  157. // GetAnalysisWeeklyVisitTrend 获取用户访问小程序数据周趋势
  158. func (wxa *MiniProgram) GetAnalysisWeeklyVisitTrend(beginDate, endDate string) (result ResAnalysisVisitTrend, err error) {
  159. return wxa.getAnalysisVisitTrend(getAnalysisWeeklyVisitTrendURL, beginDate, endDate)
  160. }
  161. // UserPortraitItem 用户画像项目
  162. type UserPortraitItem struct {
  163. ID int `json:"id"` // 属性值id
  164. Name string `json:"name"` // 属性值名称
  165. AccessSourceVisitUV int `json:"access_source_visit_uv"` // 该场景访问uv
  166. }
  167. // UserPortrait 用户画像
  168. type UserPortrait struct {
  169. Index int `json:"index"` // 分布类型
  170. Province []UserPortraitItem `json:"province"` // 省份,如北京、广东等
  171. City []UserPortraitItem `json:"city"` // 城市,如北京、广州等
  172. Genders []UserPortraitItem `json:"genders"` // 性别,包括男、女、未知
  173. Platforms []UserPortraitItem `json:"platforms"` // 终端类型,包括iPhone, android, 其他
  174. Devices []UserPortraitItem `json:"devices"` // 机型,如苹果iPhone 6, OPPO R9等
  175. Ages []UserPortraitItem `json:"ages"` // 年龄,包括17岁以下、18-24对等区间
  176. }
  177. // ResAnalysisUserPortrait 小程序新增或活跃用户的画像分布数据返回
  178. type ResAnalysisUserPortrait struct {
  179. util.CommonError
  180. RefDate string `json:"ref_date"` // 日期
  181. VisitUVNew UserPortrait `json:"visit_uv_new"` // 新用户画像
  182. VisitUV UserPortrait `json:"visit_uv"` // 活跃用户画像
  183. }
  184. // GetAnalysisUserPortrait 获取小程序新增或活跃用户的画像分布数据
  185. func (wxa *MiniProgram) GetAnalysisUserPortrait(beginDate, endDate string) (result ResAnalysisUserPortrait, err error) {
  186. body := map[string]string{
  187. "begin_date": beginDate,
  188. "end_date": endDate,
  189. }
  190. response, err := wxa.fetchData(getAnalysisUserPortraitURL, body)
  191. if err != nil {
  192. return
  193. }
  194. err = json.Unmarshal(response, &result)
  195. if err != nil {
  196. return
  197. }
  198. if result.ErrCode != 0 {
  199. err = fmt.Errorf("GetAnalysisUserPortrait error : errcode=%v , errmsg=%v", result.ErrCode, result.ErrMsg)
  200. return
  201. }
  202. return
  203. }
  204. // VisitDistributionIndexItem 访问分数数据结构
  205. type VisitDistributionIndexItem struct {
  206. Key int `json:"key"` // 场景id
  207. Value int `json:"value"` // 该场景id访问pv
  208. AccessSourceVisitUV int `json:"access_source_visit_uv"` // 该场景id访问uv
  209. }
  210. // VisitDistributionIndex 访问分布单分布类型数据
  211. type VisitDistributionIndex struct {
  212. Index string `json:"index"` // 分布类型
  213. ItemList []VisitDistributionIndexItem `json:"item_list"` // 分布数据列表
  214. }
  215. // ResAnalysisVisitDistribution 小程序访问分布数据返回
  216. type ResAnalysisVisitDistribution struct {
  217. util.CommonError
  218. RefDate string `json:"ref_date"` // 日期
  219. List []VisitDistributionIndex `json:"list"` // 数据列表
  220. }
  221. // GetAnalysisVisitDistribution 获取用户小程序访问分布数据
  222. func (wxa *MiniProgram) GetAnalysisVisitDistribution(beginDate, endDate string) (result ResAnalysisVisitDistribution, err error) {
  223. body := map[string]string{
  224. "begin_date": beginDate,
  225. "end_date": endDate,
  226. }
  227. response, err := wxa.fetchData(getAnalysisVisitDistributionURL, body)
  228. if err != nil {
  229. return
  230. }
  231. err = json.Unmarshal(response, &result)
  232. if err != nil {
  233. return
  234. }
  235. if result.ErrCode != 0 {
  236. err = fmt.Errorf("GetAnalysisVisitDistribution error : errcode=%v , errmsg=%v", result.ErrCode, result.ErrMsg)
  237. return
  238. }
  239. return
  240. }
  241. // VisitPageItem 访问单个页面的数据结构
  242. type VisitPageItem struct {
  243. PagePath string `json:"page_path"` // 页面路径
  244. PageVisitPV int `json:"page_visit_pv"` // 访问次数
  245. PageVisitUV int `json:"page_visit_uv"` // 访问人数
  246. PageStaytimePV float64 `json:"page_staytime_pv"` // 次均停留时常
  247. EntrypagePV int `json:"entrypage_pv"` // 进入页次数
  248. ExitpagePV int `json:"exitpage_pv"` // 退出页次数
  249. PageSharePV int `json:"page_share_pv"` // 转发次数
  250. PageShareUV int `json:"page_share_uv"` // 转发人数
  251. }
  252. // ResAnalysisVisitPage 访问小程序页面访问数据返回
  253. type ResAnalysisVisitPage struct {
  254. util.CommonError
  255. RefDate string `json:"ref_date"` // 日期
  256. List []VisitPageItem `json:"list"` // 数据列表
  257. }
  258. // GetAnalysisVisitPage 获取小程序页面访问数据
  259. func (wxa *MiniProgram) GetAnalysisVisitPage(beginDate, endDate string) (result ResAnalysisVisitPage, err error) {
  260. body := map[string]string{
  261. "begin_date": beginDate,
  262. "end_date": endDate,
  263. }
  264. response, err := wxa.fetchData(getAnalysisVisitPageURL, body)
  265. if err != nil {
  266. return
  267. }
  268. err = json.Unmarshal(response, &result)
  269. if err != nil {
  270. return
  271. }
  272. if result.ErrCode != 0 {
  273. err = fmt.Errorf("GetAnalysisVisitPage error : errcode=%v , errmsg=%v", result.ErrCode, result.ErrMsg)
  274. return
  275. }
  276. return
  277. }