1. The new requirement is: we need to implement the display of article view counts for the WeChat channel. See Figure 1.

2. Ideally, we should be able to get the view count of an article based on its article ID, just like Douyin. See Douyin Open Platform Documentation – Resource Center – Open Api – Video Management – Douyin – Query Video – Query Video Data for a Specific Video. The request parameters support the article ID. See Figure 2.

3. Review the WeChat Official Documentation – Official Account – Data Statistics – Article Analysis – API Call Request Description. It does not support the article ID; it only supports a date range for the data. begin_date: the start date for retrieving data; the difference between begin_date and end_date must be less than the “maximum time span” (for example, if the maximum time span is 1, the difference between begin_date and end_date can only be 0 to be less than 1), otherwise an error will occur. end_date: the end date for retrieving data; the maximum allowed value for end_date is yesterday. See Figure 3.

4. Review the WeChat Official Documentation – Official Account – Data Statistics – Article Analysis – Return Parameter Description. Please note: the msgid here is actually composed of msgid (the article message ID, which is the msg_data_id returned after calling the mass send API) and index (the message sequence index). For example, in 12003_3, 12003 is the msgid, which is the ID of a mass-sent message; 3 is the index. Assuming that the mass-sent article message contains a total of 5 articles (because it might be a multi-article message), 3 represents the 3rd one out of the 5. See Figure 4.

5. After the WeChat article is successfully mass-sent, store the message sending task ID and the message data ID into a table. Their field type is bigint. This is because the maximum value of an int is 2147483647, which is less than the value of msg_data_id: 2247483783. See Figure 5.

6. POST https://api.weixin.qq.com/datacube/getarticletotal?access_token={access_token} , the response is as follows. See Figure 6.

{
"begin_date": "2020-11-13",
"end_date": "2020-11-13"
}
{
"list": [
{
"ref_date": "2020-11-13",
"msgid": "2247483782_1",
"title": "33333r",
"user_source": 0,
"details": [
{
"stat_date": "2020-11-13",
"target_user": 356,
"int_page_read_user": 51,
"int_page_read_count": 68,
"ori_page_read_user": 4,
"ori_page_read_count": 6,
"share_user": 1,
"share_count": 1,
"add_to_fav_user": 0,
"add_to_fav_count": 0,
"int_page_from_session_read_user": 51,
"int_page_from_session_read_count": 68,
"int_page_from_hist_msg_read_user": 0,
"int_page_from_hist_msg_read_count": 0,
"int_page_from_feed_read_user": 0,
"int_page_from_feed_read_count": 0,
"int_page_from_friends_read_user": 0,
"int_page_from_friends_read_count": 0,
"int_page_from_other_read_user": 0,
"int_page_from_other_read_count": 0,
"feed_share_from_session_user": 0,
"feed_share_from_session_cnt": 0,
"feed_share_from_feed_user": 0,
"feed_share_from_feed_cnt": 0,
"feed_share_from_other_user": 0,
"feed_share_from_other_cnt": 0
},
{
"stat_date": "2020-11-14",
"target_user": 356,
"int_page_read_user": 64,
"int_page_read_count": 82,
"ori_page_read_user": 5,
"ori_page_read_count": 7,
"share_user": 1,
"share_count": 1,
"add_to_fav_user": 0,
"add_to_fav_count": 0,
"int_page_from_session_read_user": 64,
"int_page_from_session_read_count": 82,
"int_page_from_hist_msg_read_user": 0,
"int_page_from_hist_msg_read_count": 0,
"int_page_from_feed_read_user": 0,
"int_page_from_feed_read_count": 0,
"int_page_from_friends_read_user": 0,
"int_page_from_friends_read_count": 0,
"int_page_from_other_read_user": 0,
"int_page_from_other_read_count": 0,
"feed_share_from_session_user": 0,
"feed_share_from_session_cnt": 0,
"feed_share_from_feed_user": 0,
"feed_share_from_feed_cnt": 0,
"feed_share_from_other_user": 0,
"feed_share_from_other_cnt": 0
},
{
"stat_date": "2020-11-15",
"target_user": 356,
"int_page_read_user": 64,
"int_page_read_count": 84,
"ori_page_read_user": 6,
"ori_page_read_count": 8,
"share_user": 1,
"share_count": 1,
"add_to_fav_user": 0,
"add_to_fav_count": 0,
"int_page_from_session_read_user": 64,
"int_page_from_session_read_count": 84,
"int_page_from_hist_msg_read_user": 0,
"int_page_from_hist_msg_read_count": 0,
"int_page_from_feed_read_user": 0,
"int_page_from_feed_read_count": 0,
"int_page_from_friends_read_user": 0,
"int_page_from_friends_read_count": 0,
"int_page_from_other_read_user": 0,
"int_page_from_other_read_count": 0,
"feed_share_from_session_user": 0,
"feed_share_from_session_cnt": 0,
"feed_share_from_feed_user": 0,
"feed_share_from_feed_cnt": 0,
"feed_share_from_other_user": 0,
"feed_share_from_other_cnt": 0
},
{
"stat_date": "2020-11-16",
"target_user": 356,
"int_page_read_user": 64,
"int_page_read_count": 84,
"ori_page_read_user": 6,
"ori_page_read_count": 8,
"share_user": 1,
"share_count": 1,
"add_to_fav_user": 0,
"add_to_fav_count": 0,
"int_page_from_session_read_user": 64,
"int_page_from_session_read_count": 84,
"int_page_from_hist_msg_read_user": 0,
"int_page_from_hist_msg_read_count": 0,
"int_page_from_feed_read_user": 0,
"int_page_from_feed_read_count": 0,
"int_page_from_friends_read_user": 0,
"int_page_from_friends_read_count": 0,
"int_page_from_other_read_user": 0,
"int_page_from_other_read_count": 0,
"feed_share_from_session_user": 0,
"feed_share_from_session_cnt": 0,
"feed_share_from_feed_user": 0,
"feed_share_from_feed_cnt": 0,
"feed_share_from_other_user": 0,
"feed_share_from_other_cnt": 0
},
{
"stat_date": "2020-11-17",
"target_user": 356,
"int_page_read_user": 65,
"int_page_read_count": 86,
"ori_page_read_user": 6,
"ori_page_read_count": 8,
"share_user": 1,
"share_count": 1,
"add_to_fav_user": 0,
"add_to_fav_count": 0,
"int_page_from_session_read_user": 65,
"int_page_from_session_read_count": 86,
"int_page_from_hist_msg_read_user": 0,
"int_page_from_hist_msg_read_count": 0,
"int_page_from_feed_read_user": 0,
"int_page_from_feed_read_count": 0,
"int_page_from_friends_read_user": 0,
"int_page_from_friends_read_count": 0,
"int_page_from_other_read_user": 0,
"int_page_from_other_read_count": 0,
"feed_share_from_session_user": 0,
"feed_share_from_session_cnt": 0,
"feed_share_from_feed_user": 0,
"feed_share_from_feed_cnt": 0,
"feed_share_from_other_user": 0,
"feed_share_from_other_cnt": 0
}
],
"url": "https://mp.weixin.qq.com/s?__biz=MzIxNjcyMzkzOQ==&mid=2247483782&idx=1&sn=06aa625b6f4b908a91776bf2e9a8c00e#rd"
},
{
"ref_date": "2020-11-13",
"msgid": "2247483782_2",
"title": "22222",
"user_source": 0,
"details": [
{
"stat_date": "2020-11-13",
"target_user": 356,
"int_page_read_user": 21,
"int_page_read_count": 25,
"ori_page_read_user": 0,
"ori_page_read_count": 0,
"share_user": 0,
"share_count": 0,
"add_to_fav_user": 0,
"add_to_fav_count": 0,
"int_page_from_session_read_user": 21,
"int_page_from_session_read_count": 25,
"int_page_from_hist_msg_read_user": 0,
"int_page_from_hist_msg_read_count": 0,
"int_page_from_feed_read_user": 0,
"int_page_from_feed_read_count": 0,
"int_page_from_friends_read_user": 0,
"int_page_from_friends_read_count": 0,
"int_page_from_other_read_user": 0,
"int_page_from_other_read_count": 0,
"feed_share_from_session_user": 0,
"feed_share_from_session_cnt": 0,
"feed_share_from_feed_user": 0,
"feed_share_from_feed_cnt": 0,
"feed_share_from_other_user": 0,
"feed_share_from_other_cnt": 0
},
{
"stat_date": "2020-11-14",
"target_user": 356,
"int_page_read_user": 30,
"int_page_read_count": 37,
"ori_page_read_user": 0,
"ori_page_read_count": 0,
"share_user": 0,
"share_count": 0,
"add_to_fav_user": 0,
"add_to_fav_count": 0,
"int_page_from_session_read_user": 30,
"int_page_from_session_read_count": 37,
"int_page_from_hist_msg_read_user": 0,
"int_page_from_hist_msg_read_count": 0,
"int_page_from_feed_read_user": 0,
"int_page_from_feed_read_count": 0,
"int_page_from_friends_read_user": 0,
"int_page_from_friends_read_count": 0,
"int_page_from_other_read_user": 0,
"int_page_from_other_read_count": 0,
"feed_share_from_session_user": 0,
"feed_share_from_session_cnt": 0,
"feed_share_from_feed_user": 0,
"feed_share_from_feed_cnt": 0,
"feed_share_from_other_user": 0,
"feed_share_from_other_cnt": 0
},
{
"stat_date": "2020-11-15",
"target_user": 356,
"int_page_read_user": 31,
"int_page_read_count": 39,
"ori_page_read_user": 0,
"ori_page_read_count": 0,
"share_user": 0,
"share_count": 0,
"add_to_fav_user": 0,
"add_to_fav_count": 0,
"int_page_from_session_read_user": 31,
"int_page_from_session_read_count": 39,
"int_page_from_hist_msg_read_user": 0,
"int_page_from_hist_msg_read_count": 0,
"int_page_from_feed_read_user": 0,
"int_page_from_feed_read_count": 0,
"int_page_from_friends_read_user": 0,
"int_page_from_friends_read_count": 0,
"int_page_from_other_read_user": 0,
"int_page_from_other_read_count": 0,
"feed_share_from_session_user": 0,
"feed_share_from_session_cnt": 0,
"feed_share_from_feed_user": 0,
"feed_share_from_feed_cnt": 0,
"feed_share_from_other_user": 0,
"feed_share_from_other_cnt": 0
},
{
"stat_date": "2020-11-16",
"target_user": 356,
"int_page_read_user": 31,
"int_page_read_count": 39,
"ori_page_read_user": 0,
"ori_page_read_count": 0,
"share_user": 0,
"share_count": 0,
"add_to_fav_user": 0,
"add_to_fav_count": 0,
"int_page_from_session_read_user": 31,
"int_page_from_session_read_count": 39,
"int_page_from_hist_msg_read_user": 0,
"int_page_from_hist_msg_read_count": 0,
"int_page_from_feed_read_user": 0,
"int_page_from_feed_read_count": 0,
"int_page_from_friends_read_user": 0,
"int_page_from_friends_read_count": 0,
"int_page_from_other_read_user": 0,
"int_page_from_other_read_count": 0,
"feed_share_from_session_user": 0,
"feed_share_from_session_cnt": 0,
"feed_share_from_feed_user": 0,
"feed_share_from_feed_cnt": 0,
"feed_share_from_other_user": 0,
"feed_share_from_other_cnt": 0
},
{
"stat_date": "2020-11-17",
"target_user": 356,
"int_page_read_user": 32,
"int_page_read_count": 40,
"ori_page_read_user": 0,
"ori_page_read_count": 0,
"share_user": 0,
"share_count": 0,
"add_to_fav_user": 0,
"add_to_fav_count": 0,
"int_page_from_session_read_user": 32,
"int_page_from_session_read_count": 40,
"int_page_from_hist_msg_read_user": 0,
"int_page_from_hist_msg_read_count": 0,
"int_page_from_feed_read_user": 0,
"int_page_from_feed_read_count": 0,
"int_page_from_friends_read_user": 0,
"int_page_from_friends_read_count": 0,
"int_page_from_other_read_user": 0,
"int_page_from_other_read_count": 0,
"feed_share_from_session_user": 0,
"feed_share_from_session_cnt": 0,
"feed_share_from_feed_user": 0,
"feed_share_from_feed_cnt": 0,
"feed_share_from_other_user": 0,
"feed_share_from_other_cnt": 0
}
],
"url": "https://mp.weixin.qq.com/s?__biz=MzIxNjcyMzkzOQ==&mid=2247483782&idx=2&sn=ad6130affc4ebffff8d7a95d89f8b6c7#rd"
},
{
"ref_date": "2020-11-13",
"msgid": "2247483783_1",
"title": "快乐周末三号",
"user_source": 0,
"details": [
{
"stat_date": "2020-11-13",
"target_user": 356,
"int_page_read_user": 98,
"int_page_read_count": 121,
"ori_page_read_user": 9,
"ori_page_read_count": 11,
"share_user": 0,
"share_count": 0,
"add_to_fav_user": 0,
"add_to_fav_count": 0,
"int_page_from_session_read_user": 97,
"int_page_from_session_read_count": 120,
"int_page_from_hist_msg_read_user": 0,
"int_page_from_hist_msg_read_count": 0,
"int_page_from_feed_read_user": 0,
"int_page_from_feed_read_count": 0,
"int_page_from_friends_read_user": 0,
"int_page_from_friends_read_count": 0,
"int_page_from_other_read_user": 1,
"int_page_from_other_read_count": 1,
"feed_share_from_session_user": 0,
"feed_share_from_session_cnt": 0,
"feed_share_from_feed_user": 0,
"feed_share_from_feed_cnt": 0,
"feed_share_from_other_user": 0,
"feed_share_from_other_cnt": 0
},
{
"stat_date": "2020-11-14",
"target_user": 356,
"int_page_read_user": 118,
"int_page_read_count": 147,
"ori_page_read_user": 10,
"ori_page_read_count": 12,
"share_user": 0,
"share_count": 0,
"add_to_fav_user": 0,
"add_to_fav_count": 0,
"int_page_from_session_read_user": 117,
"int_page_from_session_read_count": 146,
"int_page_from_hist_msg_read_user": 0,
"int_page_from_hist_msg_read_count": 0,
"int_page_from_feed_read_user": 0,
"int_page_from_feed_read_count": 0,
"int_page_from_friends_read_user": 0,
"int_page_from_friends_read_count": 0,
"int_page_from_other_read_user": 1,
"int_page_from_other_read_count": 1,
"feed_share_from_session_user": 0,
"feed_share_from_session_cnt": 0,
"feed_share_from_feed_user": 0,
"feed_share_from_feed_cnt": 0,
"feed_share_from_other_user": 0,
"feed_share_from_other_cnt": 0
},
{
"stat_date": "2020-11-15",
"target_user": 356,
"int_page_read_user": 119,
"int_page_read_count": 150,
"ori_page_read_user": 10,
"ori_page_read_count": 12,
"share_user": 0,
"share_count": 0,
"add_to_fav_user": 0,
"add_to_fav_count": 0,
"int_page_from_session_read_user": 118,
"int_page_from_session_read_count": 149,
"int_page_from_hist_msg_read_user": 0,
"int_page_from_hist_msg_read_count": 0,
"int_page_from_feed_read_user": 0,
"int_page_from_feed_read_count": 0,
"int_page_from_friends_read_user": 0,
"int_page_from_friends_read_count": 0,
"int_page_from_other_read_user": 1,
"int_page_from_other_read_count": 1,
"feed_share_from_session_user": 0,
"feed_share_from_session_cnt": 0,
"feed_share_from_feed_user": 0,
"feed_share_from_feed_cnt": 0,
"feed_share_from_other_user": 0,
"feed_share_from_other_cnt": 0
},
{
"stat_date": "2020-11-16",
"target_user": 356,
"int_page_read_user": 119,
"int_page_read_count": 150,
"ori_page_read_user": 10,
"ori_page_read_count": 12,
"share_user": 0,
"share_count": 0,
"add_to_fav_user": 0,
"add_to_fav_count": 0,
"int_page_from_session_read_user": 118,
"int_page_from_session_read_count": 149,
"int_page_from_hist_msg_read_user": 0,
"int_page_from_hist_msg_read_count": 0,
"int_page_from_feed_read_user": 0,
"int_page_from_feed_read_count": 0,
"int_page_from_friends_read_user": 0,
"int_page_from_friends_read_count": 0,
"int_page_from_other_read_user": 1,
"int_page_from_other_read_count": 1,
"feed_share_from_session_user": 0,
"feed_share_from_session_cnt": 0,
"feed_share_from_feed_user": 0,
"feed_share_from_feed_cnt": 0,
"feed_share_from_other_user": 0,
"feed_share_from_other_cnt": 0
},
{
"stat_date": "2020-11-17",
"target_user": 356,
"int_page_read_user": 120,
"int_page_read_count": 151,
"ori_page_read_user": 10,
"ori_page_read_count": 12,
"share_user": 0,
"share_count": 0,
"add_to_fav_user": 0,
"add_to_fav_count": 0,
"int_page_from_session_read_user": 119,
"int_page_from_session_read_count": 150,
"int_page_from_hist_msg_read_user": 0,
"int_page_from_hist_msg_read_count": 0,
"int_page_from_feed_read_user": 0,
"int_page_from_feed_read_count": 0,
"int_page_from_friends_read_user": 0,
"int_page_from_friends_read_count": 0,
"int_page_from_other_read_user": 1,
"int_page_from_other_read_count": 1,
"feed_share_from_session_user": 0,
"feed_share_from_session_cnt": 0,
"feed_share_from_feed_user": 0,
"feed_share_from_feed_cnt": 0,
"feed_share_from_other_user": 0,
"feed_share_from_other_cnt": 0
}
],
"url": "https://mp.weixin.qq.com/s?__biz=MzIxNjcyMzkzOQ==&mid=2247483783&idx=1&sn=4946a8fb35caa4c29aa2232eb51f8bb1#rd"
}
]
}
7. Retrieve the statistical data for the first article of the WeChat Official Account application task. Ultimately, this allows us to closely simulate an effect similar to Douyin’s (although we cannot get the latest view count, we can only get the view count up to 7 days after publication). The maximum time span refers to the maximum time range of data that can be retrieved in a single API call; for example, a maximum time span of 7 means up to 7 days of data can be retrieved at once. We retrieve the view count based on the article ID. The potential issue is that the date range might not be accurate enough, because its value is based on the record’s creation time, whereas it should be based on the time it was published to the WeChat platform. This will be optimized later. The code is as follows:
<?php
namespace console\services;
use Yii;
use yii\helpers\ArrayHelper;
use yii\web\ServerErrorHttpException;
class WxAppTaskService extends \common\services\WxAppTaskService
{
/**
* 获取 微信公众帐号的应用的任务 的第一篇文章的统计数据
* @param object $wxAppTask 微信公众帐号的应用的任务
* @param string $accessToken 访问令牌
*
* @return array
* 格式如下:
*
* [ // 最后一个统计日期
* 'stat_date': '2020-05-29', // 统计的日期,在 getarticletotal 接口中,ref_date 指的是文章群发出日期, 而 stat_date 是数据统计日期
* 'target_user': 387, // 送达人数,一般约等于总粉丝数(需排除黑名单或其他异常情况下无法收到消息的粉丝)
* 'int_page_read_user': 86, // 图文页(点击群发图文卡片进入的页面)的阅读人数
* 'int_page_read_count': 111, // 图文页的阅读次数
* 'ori_page_read_user': 11, // 原文页(点击图文页“阅读原文”进入的页面)的阅读人数,无原文页时此处数据为0
* 'ori_page_read_count': 12, // 原文页的阅读次数
* 'share_user': 1, // 分享的人数
* 'share_count': 1, // 分享的次数
* 'add_to_fav_user': 0, // 收藏的人数
* 'add_to_fav_count': 0, // 收藏的次数
* 'int_page_from_session_read_user': 85, // 公众号会话阅读人数
* 'int_page_from_session_read_count': 109, // 公众号会话阅读次数
* 'int_page_from_hist_msg_read_user': 0, // 历史消息页阅读人数
* 'int_page_from_hist_msg_read_count': 0, // 历史消息页阅读次数
* 'int_page_from_feed_read_user': 0, // 朋友圈阅读人数
* 'int_page_from_feed_read_count': 0, // 朋友圈阅读次数
* 'int_page_from_friends_read_user': 0, // 好友转发阅读人数
* 'int_page_from_friends_read_count': 0, // 好友转发阅读次数
* 'int_page_from_other_read_user': 1, // 其他场景阅读人数
* 'int_page_from_other_read_count': 1, // 其他场景阅读次数
* 'feed_share_from_session_user': 0, // 公众号会话转发朋友圈人数
* 'feed_share_from_session_cnt': 0, // 公众号会话转发朋友圈次数
* 'feed_share_from_feed_user': 0, // 朋友圈转发朋友圈人数
* 'feed_share_from_feed_cnt': 0, // 朋友圈转发朋友圈次数
* 'feed_share_from_other_user': 0, // 其他场景转发朋友圈人数
* 'feed_share_from_other_cnt': 0, // 其他场景转发朋友圈次数
* ]
*
* @throws ServerErrorHttpException
*/
public static function getCounts($wxAppTask, $accessToken)
{
$date = Date('Y-m-d', $wxAppTask->created_at);
// HTTP请求,获取图文群发总数据
$httpGetArticleTotalData = [
'accessToken' => $accessToken,
'beginDate' => $date,
'endDate' => $date,
];
$articleTotal = WxDatacubeService::httpGetArticleTotal($httpGetArticleTotalData);
// 重建数组索引,键名:msgid
$list = ArrayHelper::index($articleTotal['list'], 'msgid');
$msgid = $wxAppTask->msg_data_id . '_1';
$counts = [];
if (isset($list[$msgid])) {
// 获取一个数组的最后一个键值
$lastKey = array_key_last($list[$msgid]['details']);
$counts = $list[$msgid]['details'][$lastKey];
}
return $counts;
}
}