github.com/chanxuehong/wechat@v0.0.0-20230222024006-36f0325263cd/mp/datacube/article.go (about)

     1  package datacube
     2  
     3  import (
     4  	"errors"
     5  
     6  	"github.com/chanxuehong/wechat/mp/core"
     7  )
     8  
     9  type ArticleBaseData struct {
    10  	IntPageReadUser  int `json:"int_page_read_user"`  // 图文页(点击群发图文卡片进入的页面)的阅读人数
    11  	IntPageReadCount int `json:"int_page_read_count"` // 图文页的阅读次数
    12  	OriPageReadUser  int `json:"ori_page_read_user"`  // 原文页(点击图文页"阅读原文"进入的页面)的阅读人数, 无原文页时此处数据为0
    13  	OriPageReadCount int `json:"ori_page_read_count"` // 原文页的阅读次数
    14  	ShareUser        int `json:"share_user"`          // 分享的人数
    15  	ShareCount       int `json:"share_count"`         // 分享的次数
    16  	AddToFavUser     int `json:"add_to_fav_user"`     // 收藏的人数
    17  	AddToFavCount    int `json:"add_to_fav_count"`    // 收藏的次数
    18  }
    19  
    20  // 图文群发每日数据
    21  type ArticleSummaryData struct {
    22  	RefDate    string `json:"ref_date"`    // 数据的日期, YYYY-MM-DD 格式
    23  	UserSource int    `json:"user_source"` // 返回的 json 有这个字段, 文档中没有, 都是 0 值, 可能没有实际意义!!!
    24  
    25  	// 这里的msgid实际上是由msgid(图文消息id)和index(消息次序索引)组成,
    26  	// 例如12003_3,  其中12003是msgid, 即一次群发的id消息的;
    27  	// 3为index, 假设该次群发的图文消息共5个文章(因为可能为多图文),  3表示5个中的第3个
    28  	MsgId string `json:"msgid"`
    29  	Title string `json:"title"` // 图文消息的标题
    30  	ArticleBaseData
    31  }
    32  
    33  // 获取图文群发每日数据.
    34  func GetArticleSummary(clt *core.Client, req *Request) (list []ArticleSummaryData, err error) {
    35  	if req == nil {
    36  		err = errors.New("nil Request")
    37  		return
    38  	}
    39  
    40  	var result struct {
    41  		core.Error
    42  		List []ArticleSummaryData `json:"list"`
    43  	}
    44  
    45  	incompleteURL := "https://api.weixin.qq.com/datacube/getarticlesummary?access_token="
    46  	if err = clt.PostJSON(incompleteURL, req, &result); err != nil {
    47  		return
    48  	}
    49  
    50  	if result.ErrCode != core.ErrCodeOK {
    51  		err = &result.Error
    52  		return
    53  	}
    54  	list = result.List
    55  	return
    56  }
    57  
    58  // 图文群发总数据
    59  type ArticleTotalData struct {
    60  	RefDate    string `json:"ref_date"`    // 数据的日期, YYYY-MM-DD 格式
    61  	UserSource int    `json:"user_source"` // 返回的 json 有这个字段, 文档中没有, 都是 0 值, 可能没有实际意义!!!
    62  	MsgId      string `json:"msgid"`       // 同 ArticleSummaryData.MsgId
    63  	Title      string `json:"title"`
    64  	Details    []struct {
    65  		StatDate   string `json:"stat_date"`   // 统计的日期, 在getarticletotal接口中, ref_date指的是文章群发出日期,  而stat_date是数据统计日期
    66  		TargetUser int    `json:"target_user"` // 送达人数, 一般约等于总粉丝数(需排除黑名单或其他异常情况下无法收到消息的粉丝)
    67  		ArticleBaseData
    68  	} `json:"details"`
    69  }
    70  
    71  // 获取图文群发总数据.
    72  func GetArticleTotal(clt *core.Client, req *Request) (list []ArticleTotalData, err error) {
    73  	if req == nil {
    74  		err = errors.New("nil Request")
    75  		return
    76  	}
    77  
    78  	var result struct {
    79  		core.Error
    80  		List []ArticleTotalData `json:"list"`
    81  	}
    82  
    83  	incompleteURL := "https://api.weixin.qq.com/datacube/getarticletotal?access_token="
    84  	if err = clt.PostJSON(incompleteURL, req, &result); err != nil {
    85  		return
    86  	}
    87  
    88  	if result.ErrCode != core.ErrCodeOK {
    89  		err = &result.Error
    90  		return
    91  	}
    92  	list = result.List
    93  	return
    94  }
    95  
    96  // 图文统计数据
    97  type UserReadData struct {
    98  	RefDate    string `json:"ref_date"` // 数据的日期, YYYY-MM-DD 格式
    99  	UserSource int    `json:"user_source"`
   100  	ArticleBaseData
   101  }
   102  
   103  // 获取图文统计数据.
   104  func GetUserRead(clt *core.Client, req *Request) (list []UserReadData, err error) {
   105  	if req == nil {
   106  		err = errors.New("nil Request")
   107  		return
   108  	}
   109  
   110  	var result struct {
   111  		core.Error
   112  		List []UserReadData `json:"list"`
   113  	}
   114  
   115  	incompleteURL := "https://api.weixin.qq.com/datacube/getuserread?access_token="
   116  	if err = clt.PostJSON(incompleteURL, req, &result); err != nil {
   117  		return
   118  	}
   119  
   120  	if result.ErrCode != core.ErrCodeOK {
   121  		err = &result.Error
   122  		return
   123  	}
   124  	list = result.List
   125  	return
   126  }
   127  
   128  // 图文统计分时数据
   129  type UserReadHourData struct {
   130  	RefHour         int   `json:"ref_hour"`          // 数据的小时, 包括从000到2300, 分别代表的是[000,100)到[2300,2400), 即每日的第1小时和最后1小时
   131  	TotalOnlineTime int64 `json:"total_online_time"` // 返回的 json 有这个字段, 文档中没有, 都是 0 值, 可能没有实际意义!!!
   132  	UserReadData
   133  }
   134  
   135  // 获取图文统计分时数据.
   136  func GetUserReadHour(clt *core.Client, req *Request) (list []UserReadHourData, err error) {
   137  	if req == nil {
   138  		err = errors.New("nil Request")
   139  		return
   140  	}
   141  
   142  	var result struct {
   143  		core.Error
   144  		List []UserReadHourData `json:"list"`
   145  	}
   146  
   147  	incompleteURL := "https://api.weixin.qq.com/datacube/getuserreadhour?access_token="
   148  	if err = clt.PostJSON(incompleteURL, req, &result); err != nil {
   149  		return
   150  	}
   151  
   152  	if result.ErrCode != core.ErrCodeOK {
   153  		err = &result.Error
   154  		return
   155  	}
   156  	list = result.List
   157  	return
   158  }
   159  
   160  // 图文分享转发数据
   161  type UserShareData struct {
   162  	RefDate    string `json:"ref_date"`    // 数据的日期, YYYY-MM-DD 格式
   163  	UserSource int    `json:"user_source"` // 返回的 json 有这个字段, 文档中没有, 都是 0 值, 可能没有实际意义!!!
   164  	ShareScene int    `json:"share_scene"` // 分享的场景, 1代表好友转发 2代表朋友圈 3代表腾讯微博 255代表其他
   165  	ShareCount int    `json:"share_count"` // 分享的次数
   166  	ShareUser  int    `json:"share_user"`  // 分享的人数
   167  }
   168  
   169  // 获取图文分享转发数据.
   170  func GetUserShare(clt *core.Client, req *Request) (list []UserShareData, err error) {
   171  	if req == nil {
   172  		err = errors.New("nil Request")
   173  		return
   174  	}
   175  
   176  	var result struct {
   177  		core.Error
   178  		List []UserShareData `json:"list"`
   179  	}
   180  
   181  	incompleteURL := "https://api.weixin.qq.com/datacube/getusershare?access_token="
   182  	if err = clt.PostJSON(incompleteURL, req, &result); err != nil {
   183  		return
   184  	}
   185  
   186  	if result.ErrCode != core.ErrCodeOK {
   187  		err = &result.Error
   188  		return
   189  	}
   190  	list = result.List
   191  	return
   192  }
   193  
   194  // 图文分享转发分时数据
   195  type UserShareHourData struct {
   196  	RefHour int `json:"ref_hour"` // 数据的小时, 包括从000到2300, 分别代表的是[000,100)到[2300,2400), 即每日的第1小时和最后1小时
   197  	UserShareData
   198  }
   199  
   200  // 获取图文分享转发分时数据.
   201  func GetUserShareHour(clt *core.Client, req *Request) (list []UserShareHourData, err error) {
   202  	if req == nil {
   203  		err = errors.New("nil Request")
   204  		return
   205  	}
   206  
   207  	var result struct {
   208  		core.Error
   209  		List []UserShareHourData `json:"list"`
   210  	}
   211  
   212  	incompleteURL := "https://api.weixin.qq.com/datacube/getusersharehour?access_token="
   213  	if err = clt.PostJSON(incompleteURL, req, &result); err != nil {
   214  		return
   215  	}
   216  
   217  	if result.ErrCode != core.ErrCodeOK {
   218  		err = &result.Error
   219  		return
   220  	}
   221  	list = result.List
   222  	return
   223  }