🆕 #3368 【视频号】新增视频号助手-直播大屏数据、罗盘达人版API相关接口

This commit is contained in:
Winnie
2024-09-10 15:04:26 +08:00
committed by GitHub
parent 0b9444d948
commit 31d2f72194
64 changed files with 3475 additions and 0 deletions

View File

@@ -0,0 +1,58 @@
package me.chanjar.weixin.channel.api;
import me.chanjar.weixin.channel.bean.compass.finder.OverallResponse;
import me.chanjar.weixin.channel.bean.compass.finder.ProductDataResponse;
import me.chanjar.weixin.channel.bean.compass.finder.ProductListResponse;
import me.chanjar.weixin.channel.bean.compass.finder.SaleProfileDataResponse;
import me.chanjar.weixin.common.error.WxErrorException;
/**
* 视频号助手 罗盘达人版服务
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
public interface WxChannelCompassFinderService {
/**
* 获取电商概览数据
*
* @param ds 日期,格式 yyyyMMdd
* @return 电商概览数据
*
* @throws WxErrorException 异常
*/
OverallResponse getOverall(String ds) throws WxErrorException;
/**
* 获取带货商品数据
*
* @param ds 日期,格式 yyyyMMdd
* @param productId 商品id
* @return 带货商品数据
*
* @throws WxErrorException 异常
*/
ProductDataResponse getProductData(String ds, String productId) throws WxErrorException;
/**
* 获取带货商品列表
*
* @param ds 日期,格式 yyyyMMdd
* @return 带货商品列表
*
* @throws WxErrorException 异常
*/
ProductListResponse getProductList(String ds) throws WxErrorException;
/**
* 获取带货人群数据
*
* @param ds 日期,格式 yyyyMMdd
* @param type 用户类型1=商品曝光用户, 2=商品点击用户, 3=购买用户, 4=首购用户, 5=复购用户, 6=直播观看用户
* @return 带货人群数据
*
* @throws WxErrorException 异常
*/
SaleProfileDataResponse getSaleProfileData(String ds, Integer type) throws WxErrorException;
}

View File

@@ -0,0 +1,34 @@
package me.chanjar.weixin.channel.api;
import me.chanjar.weixin.channel.bean.live.dashboard.LiveDataResponse;
import me.chanjar.weixin.channel.bean.live.dashboard.LiveListResponse;
import me.chanjar.weixin.common.error.WxErrorException;
/**
* 视频号助手 直播大屏数据服务
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
public interface WxChannelLiveDashboardService {
/**
* 获取直播大屏直播列表
*
* @param ds 日期,格式 yyyyMMdd
* @return 播大屏直播列表
*
* @throws WxErrorException 异常
*/
LiveListResponse getLiveList(Long ds) throws WxErrorException;
/**
* 获取直播大屏数据
*
* @param exportId 直播唯一ID
* @return 播大屏数据
*
* @throws WxErrorException 异常
*/
LiveDataResponse getLiveData(String exportId) throws WxErrorException;
}

View File

@@ -147,4 +147,19 @@ public interface WxChannelService extends BaseWxChannelService {
* @return 会员服务
*/
WxChannelVipService getVipService();
/**
* 视频号助手-罗盘达人版服务
*
* @return 罗盘达人版服务
*/
WxChannelCompassFinderService getCompassFinderService();
/**
* 视频号助手-直播大屏数据服务
*
* @return 直播大屏数据服务
*/
WxChannelLiveDashboardService getLiveDashboardService();
}

View File

@@ -55,6 +55,10 @@ public abstract class BaseWxChannelServiceImpl<H, P> implements WxChannelService
private WxFinderLiveService finderLiveService = null;
private WxAssistantService assistantService = null;
private WxChannelVipService vipService = new WxChannelVipServiceImpl(this);
private final WxChannelCompassFinderService compassFinderService =
new WxChannelCompassFinderServiceImpl(this);
private final WxChannelLiveDashboardService liveDashboardService =
new WxChannelLiveDashboardServiceImpl(this);
protected WxChannelConfig config;
private int retrySleepMillis = 1000;
@@ -411,4 +415,11 @@ public abstract class BaseWxChannelServiceImpl<H, P> implements WxChannelService
public WxChannelVipService getVipService() {
return vipService;
}
@Override
public WxChannelCompassFinderService getCompassFinderService() { return compassFinderService; }
@Override
public WxChannelLiveDashboardService getLiveDashboardService() { return liveDashboardService; }
}

View File

@@ -0,0 +1,54 @@
package me.chanjar.weixin.channel.api.impl;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.channel.api.WxChannelCompassFinderService;
import me.chanjar.weixin.channel.bean.compass.finder.*;
import me.chanjar.weixin.channel.util.ResponseUtils;
import me.chanjar.weixin.common.error.WxErrorException;
import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.CompassFinder.*;
/**
* 视频号助手 罗盘达人版服务实现
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Slf4j
public class WxChannelCompassFinderServiceImpl implements WxChannelCompassFinderService {
/**
* 微信商店服务
*/
private final BaseWxChannelServiceImpl shopService;
public WxChannelCompassFinderServiceImpl(BaseWxChannelServiceImpl shopService) {this.shopService = shopService;}
@Override
public OverallResponse getOverall(String ds) throws WxErrorException {
CompassFinderBaseParam param = new CompassFinderBaseParam(ds);
String resJson = shopService.post(GET_OVERALL_URL, param);
return ResponseUtils.decode(resJson, OverallResponse.class);
}
@Override
public ProductDataResponse getProductData(String ds, String productId) throws WxErrorException {
ProductDataParam param = new ProductDataParam(ds, productId);
String resJson = shopService.post(GET_PRODUCT_DATA_URL, param);
return ResponseUtils.decode(resJson, ProductDataResponse.class);
}
@Override
public ProductListResponse getProductList(String ds) throws WxErrorException {
CompassFinderBaseParam param = new CompassFinderBaseParam(ds);
String resJson = shopService.post(GET_PRODUCT_LIST_URL, param);
return ResponseUtils.decode(resJson, ProductListResponse.class);
}
@Override
public SaleProfileDataResponse getSaleProfileData(String ds, Integer type) throws WxErrorException {
SaleProfileDataParam param = new SaleProfileDataParam(ds, type);
String resJson = shopService.post(GET_SALE_PROFILE_DATA_URL, param);
return ResponseUtils.decode(resJson, SaleProfileDataResponse.class);
}
}

View File

@@ -0,0 +1,81 @@
package me.chanjar.weixin.channel.api.impl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.channel.api.WxChannelLiveDashboardService;
import me.chanjar.weixin.channel.bean.live.dashboard.LiveDataParam;
import me.chanjar.weixin.channel.bean.live.dashboard.LiveDataResponse;
import me.chanjar.weixin.channel.bean.live.dashboard.LiveListParam;
import me.chanjar.weixin.channel.bean.live.dashboard.LiveListResponse;
import me.chanjar.weixin.channel.util.ResponseUtils;
import me.chanjar.weixin.common.error.WxErrorException;
import org.apache.commons.lang3.ObjectUtils;
import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.LiveDashboard.*;
/**
* 视频号助手 直播大屏数据服务实现
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Slf4j
public class WxChannelLiveDashboardServiceImpl implements WxChannelLiveDashboardService {
/**
* 微信商店服务
*/
private final BaseWxChannelServiceImpl shopService;
private final ObjectMapper objectMapper = new ObjectMapper();
public WxChannelLiveDashboardServiceImpl(BaseWxChannelServiceImpl shopService) {this.shopService = shopService;}
@Override
public LiveListResponse getLiveList(Long ds) throws WxErrorException {
LiveListParam param = new LiveListParam(ds);
String resJson = shopService.post(GET_LIVE_LIST_URL, param);
return ResponseUtils.decode(resJson, LiveListResponse.class);
}
@Override
public LiveDataResponse getLiveData(String exportId) throws WxErrorException {
LiveDataParam param = new LiveDataParam(exportId);
String resJson = shopService.post(GET_LIVE_DATA_URL, param);
return this.convertLiveDataResponse(resJson);
}
/**
* 微信接口获取直播数据中存在非标准JSON方便业务处理返回前做好解析
* 处理参数:
* live_dashboard_datalive_comparison_indexlive_ec_data_summarylive_ec_conversion_metric
* live_ec_profilelive_distribution_channelsingle_live_ec_spu_data_page_v2
*
* @param resJson 直播数据返回JSON
* @return LiveDataResponse
*
* @throws WxErrorException 异常
*/
private LiveDataResponse convertLiveDataResponse(String resJson) throws WxErrorException {
try {
ObjectNode rootNode = (ObjectNode) objectMapper.readTree(resJson);
String[] dataKeyArray = new String[] {
"live_dashboard_data", "live_comparison_index", "live_ec_data_summary", "live_ec_conversion_metric",
"live_ec_profile", "live_distribution_channel", "single_live_ec_spu_data_page_v2"
};
for(String dataKey : dataKeyArray) {
JsonNode jsonNode = rootNode.get(dataKey);
if (ObjectUtils.isNotEmpty(jsonNode)) {
JsonNode dataJsonNode = objectMapper.readTree(jsonNode.asText());
rootNode.set(dataKey, dataJsonNode);
}
}
String json = objectMapper.writeValueAsString(rootNode);
return ResponseUtils.decode(json, LiveDataResponse.class);
} catch (JsonProcessingException e) {
throw new WxErrorException(e);
}
}
}

View File

@@ -0,0 +1,30 @@
package me.chanjar.weixin.channel.bean.compass.finder;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 获取达人罗盘数据通用请求参数
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class CompassFinderBaseParam implements Serializable {
private static final long serialVersionUID = - 4900361041041434435L;
/**
* 日期,格式 yyyyMMdd
*/
@JsonProperty("ds")
private String ds;
}

View File

@@ -0,0 +1,33 @@
package me.chanjar.weixin.channel.bean.compass.finder;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* 维度数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class Field implements Serializable {
private static final long serialVersionUID = - 4243469984232948689L;
/**
* 维度类别名
*/
@JsonProperty("field_name")
private String fieldName;
/**
* 维度指标数据列表
*/
@JsonProperty("data_list")
private List<FieldData> dataList;
}

View File

@@ -0,0 +1,32 @@
package me.chanjar.weixin.channel.bean.compass.finder;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 维度指标数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class FieldData implements Serializable {
private static final long serialVersionUID = - 4022953139259283599L;
/**
* 维度指标名
*/
@JsonProperty("dim_key")
private String dimKey;
/**
* 维度指标值
*/
@JsonProperty("dim_value")
private String dimValue;
}

View File

@@ -0,0 +1,56 @@
package me.chanjar.weixin.channel.bean.compass.finder;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 电商概览数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class Overall implements Serializable {
private static final long serialVersionUID = 2456038666608345011L;
/**
* 成交金额,单位分
*/
@JsonProperty("pay_gmv")
private String payGmv;
/**
* 直播成交金额,单位分
*/
@JsonProperty("live_pay_gmv")
private String livePayGmv;
/**
* 短视频成交金额,单位分
*/
@JsonProperty("feed_pay_gmv")
private String feedPayGmv;
/**
* 橱窗成交金额,单位分
*/
@JsonProperty("window_pay_gmv")
private String windowPayGmv;
/**
* 商品分享支付金额,单位分
*/
@JsonProperty("product_pay_gmv")
private String productPayGmv;
/**
* 其他渠道成交金额,单位分
*/
@JsonProperty("other_pay_gmv")
private String otherPayGmv;
}

View File

@@ -0,0 +1,27 @@
package me.chanjar.weixin.channel.bean.compass.finder;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import me.chanjar.weixin.channel.bean.base.WxChannelBaseResponse;
/**
* 获取电商概览数据响应
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class OverallResponse extends WxChannelBaseResponse {
private static final long serialVersionUID = 6350218415876820956L;
/**
* 电商概览数据
*/
@JsonProperty("data")
private Overall data;
}

View File

@@ -0,0 +1,170 @@
package me.chanjar.weixin.channel.bean.compass.finder;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 商品罗盘数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class ProductCompassData implements Serializable {
private static final long serialVersionUID = - 1009289493985863096L;
/**
* 成交金额
*/
@JsonProperty("pay_gmv")
private String payGmv;
/**
* 下单金额(单位:分)
*/
@JsonProperty("create_gmv")
private String createGmv;
/**
* 下单订单数
*/
@JsonProperty("create_cnt")
private String createCnt;
/**
* 下单人数
*/
@JsonProperty("create_uv")
private String createUv;
/**
* 下单件数
*/
@JsonProperty("create_product_cnt")
private String createProductCnt;
/**
* 成交订单数
*/
@JsonProperty("pay_cnt")
private String payCnt;
/**
* 成交人数
*/
@JsonProperty("pay_uv")
private String payUv;
/**
* 成交件数
*/
@JsonProperty("pay_product_cnt")
private String payProductCnt;
/**
* 成交金额(剔除退款)(单位:分)
*/
@JsonProperty("pure_pay_gmv")
private String purePayGmv;
/**
* 成交客单价(单位:分)
*/
@JsonProperty("pay_gmv_per_uv")
private String payGmvPerUv;
/**
* 实际结算金额(单位:分)
*/
@JsonProperty("actual_commission")
private String actualCommission;
/**
* 预估佣金金额(单位:分)
*/
@JsonProperty("predict_commission")
private String predictCommission;
/**
* 商品点击人数
*/
@JsonProperty("product_click_uv")
private String productClickUv;
/**
* 商品点击次数
*/
@JsonProperty("product_click_cnt")
private String productClickCnt;
/**
* 成交退款金额
*/
@JsonProperty("pay_refund_gmv")
private String payRefundGmv;
/**
* 成交退款人数
*/
@JsonProperty("pay_refund_uv")
private String payRefundUv;
/**
* 成交退款率
*/
@JsonProperty("pay_refund_ratio")
private Double payRefundRatio;
/**
* 发货后成交退款率
*/
@JsonProperty("pay_refund_after_send_ratio")
private Double payRefundAfterSendRatio;
/**
* 成交退款订单数
*/
@JsonProperty("pay_refund_cnt")
private String payRefundCnt;
/**
* 成交退款件数
*/
@JsonProperty("pay_refund_product_cnt")
private String payRefundProductCnt;
/**
* 发货前成交退款率
*/
@JsonProperty("pay_refund_before_send_ratio")
private Double payRefundBeforeSendRatio;
/**
* 退款金额(单位:分)
*/
@JsonProperty("refund_gmv")
private String refundGmv;
/**
* 退款件数
*/
@JsonProperty("refund_product_cnt")
private String refundProductCnt;
/**
* 退款订单数
*/
@JsonProperty("refund_cnt")
private String refundCnt;
/**
* 退款人数
*/
@JsonProperty("refund_uv")
private String refundUv;
}

View File

@@ -0,0 +1,33 @@
package me.chanjar.weixin.channel.bean.compass.finder;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* 获取带货商品数据请求参数
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ProductDataParam extends CompassFinderBaseParam {
private static final long serialVersionUID = - 5016298274452168329L;
/**
* 商品id
*/
@JsonProperty("product_id")
private String productId;
public ProductDataParam(String ds, String productId) {
super(ds);
this.productId = productId;
}
}

View File

@@ -0,0 +1,27 @@
package me.chanjar.weixin.channel.bean.compass.finder;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import me.chanjar.weixin.channel.bean.base.WxChannelBaseResponse;
/**
* 获取带货商品数据响应
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class ProductDataResponse extends WxChannelBaseResponse {
private static final long serialVersionUID = 7264776818163943719L;
/**
* 带货商品数据
*/
@JsonProperty("product_info")
private ProductInfo productInfo;
}

View File

@@ -0,0 +1,68 @@
package me.chanjar.weixin.channel.bean.compass.finder;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 带货商品数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class ProductInfo implements Serializable {
private static final long serialVersionUID = - 3347940276601700091L;
/**
* 商品id
*/
@JsonProperty("product_id")
private String productId;
/**
* 商品头图
*/
@JsonProperty("head_img_url")
private String headImgUrl;
/**
* 商品标题
*/
@JsonProperty("title")
private String title;
/**
* 商品价格
*/
@JsonProperty("price")
private String price;
/**
* 1级类目
*/
@JsonProperty("first_category_id")
private String firstCategoryId;
/**
* 2级类目
*/
@JsonProperty("second_category_id")
private String secondCategoryId;
/**
* 3级类目
*/
@JsonProperty("third_category_id")
private String thirdCategoryId;
/**
* 商品罗盘数据
*/
@JsonProperty("data")
private ProductCompassData data;
}

View File

@@ -0,0 +1,29 @@
package me.chanjar.weixin.channel.bean.compass.finder;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import me.chanjar.weixin.channel.bean.base.WxChannelBaseResponse;
import java.util.List;
/**
* 获取带货商品列表响应
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class ProductListResponse extends WxChannelBaseResponse {
private static final long serialVersionUID = 7903039293558611066L;
/**
* 带货商品列表
*/
@JsonProperty("product_list")
private List<ProductInfo> productList;
}

View File

@@ -0,0 +1,27 @@
package me.chanjar.weixin.channel.bean.compass.finder;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* 带货人群数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class SaleProfileData implements Serializable {
private static final long serialVersionUID = - 5542602540358792014L;
/**
* 维度数据列表
*/
@JsonProperty("field_list")
private List<Field> fieldList;
}

View File

@@ -0,0 +1,33 @@
package me.chanjar.weixin.channel.bean.compass.finder;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* 获取带货人群数据请求参数
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class SaleProfileDataParam extends CompassFinderBaseParam {
private static final long serialVersionUID = 4037843292285732855L;
/**
* 用户类型 {@link me.chanjar.weixin.channel.enums.SaleProfileUserType}
*/
@JsonProperty("type")
private Integer type;
public SaleProfileDataParam(String ds, Integer type) {
super(ds);
this.type = type;
}
}

View File

@@ -0,0 +1,27 @@
package me.chanjar.weixin.channel.bean.compass.finder;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import me.chanjar.weixin.channel.bean.base.WxChannelBaseResponse;
/**
* 获取带货人群数据响应
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class SaleProfileDataResponse extends WxChannelBaseResponse {
private static final long serialVersionUID = - 6409722880191468272L;
/**
* 带货人群数据
*/
@JsonProperty("data")
private SaleProfileData data;
}

View File

@@ -0,0 +1,61 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 转化率
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class ConversionMetric implements Serializable {
private static final long serialVersionUID = - 3411290344181494863L;
/**
* 商品曝光-点击转化率
*/
@JsonProperty("product_view_click_conversion_ratio")
private ItemConversionMetric productViewClickConversionRatio;
/**
* 气泡曝光-点击转化率
*/
@JsonProperty("bubble_view_click_conversion_ratio")
private ItemConversionMetric bubbleViewClickConversionRatio;
/**
* 成交转化率
*/
@JsonProperty("pay_conversion_ratio")
private ItemConversionMetric payConversionRatio;
/**
* 千次观看成交金额(单位:分)
*/
@JsonProperty("k_view_pay_conversion_ratio")
private ItemConversionMetric kViewPayConversionRatio;
/**
* 更新时间
*/
@JsonProperty("update_time")
private Long updateTime;
/**
* 购物袋商品点击率
*/
@JsonProperty("product_list_click_conversion_ratio")
private ItemConversionMetric productListClickConversionRatio;
/**
* 挂车时间(>0 则为挂车)
*/
@JsonProperty("shelftime")
private Long shelftime;
}

View File

@@ -0,0 +1,26 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 统计数值
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class DataNode implements Serializable {
private static final long serialVersionUID = 3192158546911682577L;
/**
* 统计数值维度指标
*/
@JsonProperty("fields")
private Fields fields;
}

View File

@@ -0,0 +1,32 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 分类下的数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class DataNodeList implements Serializable {
private static final long serialVersionUID = - 497502210938812386L;
/**
* 细分类别的名称,如 "女"、"30-39岁"、"天津市"
*/
@JsonProperty("key")
private String key;
/**
* 包含具体的统计数值
*/
@JsonProperty("row")
private DataNode row;
}

View File

@@ -0,0 +1,33 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* 用户群体下不同分类的统计数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class DataNodeSecondList implements Serializable {
private static final long serialVersionUID = 42973481125049275L;
/**
* 每个分类对象都有一个 key表示分类的名称例如 "sex_distribution"、"age_distribution" {@link me.chanjar.weixin.channel.enums.EcProfileDataNodeKey}
*/
@JsonProperty("key")
private String key;
/**
* 进一步细分该分类下的数据
*/
@JsonProperty("row")
private List<DataNodeList> row;
}

View File

@@ -0,0 +1,33 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* 不同用户群体的统计数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class DataNodeThirdList implements Serializable {
private static final long serialVersionUID = - 7534433586440870881L;
/**
* 每个对象包含一个 key表示用户群体的名称例如 "已成交用户"、"首次购买用户"、"复购用户"
*/
@JsonProperty("key")
private String key;
/**
* 包含该用户群体下不同分类的统计数据
*/
@JsonProperty("row")
private List<DataNodeSecondList> row;
}

View File

@@ -0,0 +1,38 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 描述时间序列的维度标签
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class Dimension implements Serializable {
private static final long serialVersionUID = - 1879006149576217182L;
/**
* 维度的类型 {@link me.chanjar.weixin.channel.enums.DimensionType}
*/
@JsonProperty("type")
private Integer type;
/**
* 维度标签
*/
@JsonProperty("ux_label")
private String uxLabel;
/**
* 维度值
*/
@JsonProperty("dimension_value")
private Long dimensionValue;
}

View File

@@ -0,0 +1,44 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 关播内容力数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class Ended implements Serializable {
private static final long serialVersionUID = 576815272236922652L;
/**
* 曝光有效CTR万分比
*/
@JsonProperty("recommend_effective_new_watch_2_uv_over_impression_uv")
private EndedIndexItem recommendEffectiveNewWatch2UvOverImpressionUv;
/**
* 人均看播时长
*/
@JsonProperty("average_watch_seconds")
private EndedIndexItem averageWatchSeconds;
/**
* 评论率(万分比)
*/
@JsonProperty("comment_uv_over_new_watch_uv")
private EndedIndexItem commentUvOverNewWatchUv;
/**
* 点赞率(万分比)
*/
@JsonProperty("like_uv_over_new_watch_uv")
private EndedIndexItem likeUvOverNewWatchUv;
}

View File

@@ -0,0 +1,38 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 关播内容力指标数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class EndedIndexItem implements Serializable {
private static final long serialVersionUID = 7529336638744298238L;
/**
* 整场直播的指标值
*/
@JsonProperty("value")
private Long value;
/**
* 整场直播该指标值打败了 xx% 的主播
*/
@JsonProperty("percentile")
private Integer percentile;
/**
* 该指标 7 天中位数
*/
@JsonProperty("median_7_days")
private Long median7Days;
}

View File

@@ -0,0 +1,38 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 统计数值维度指标数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class Fields implements Serializable {
private static final long serialVersionUID = 228387216076265877L;
/**
* 维度值
*/
@JsonProperty("dim_key")
private String dimKey;
/**
* 指标值
*/
@JsonProperty("dim_val")
private String dimVal;
/**
* 指标值比例
*/
@JsonProperty("dim_val_ratio")
private String dimValRatio;
}

View File

@@ -0,0 +1,44 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 转化率数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class ItemConversionMetric implements Serializable {
private static final long serialVersionUID = - 8317027740221390754L;
/**
* 指标值
*/
@JsonProperty("metric_value")
private Double metricValue;
/**
* 较近7天中位数
*/
@JsonProperty("median_to_recent_7_days")
private Double medianToRecent7Days;
/**
* 同行对比
*/
@JsonProperty("within_industry_percentage")
private Double withinIndustryPercentage;
/**
* 环比数据
*/
@JsonProperty("quarterly_growth_rate")
private QuarterlyGrowthRate quarterlyGrowthRate;
}

View File

@@ -0,0 +1,38 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 内容力数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class LiveComparisonIndex implements Serializable {
private static final long serialVersionUID = 525214144965479881L;
/**
* 是否正在直播
*/
@JsonProperty("is_living")
private Boolean isLiving;
/**
* 在播数据
*/
@JsonProperty("on_air")
private OnAir onAir;
/**
* 关播数据
*/
@JsonProperty("ended")
private Ended ended;
}

View File

@@ -0,0 +1,38 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 直播大屏数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class LiveDashboardData implements Serializable {
private static final long serialVersionUID = 7917049411269553153L;
/**
* 直播大屏数据实体
*/
@JsonProperty("live_dashboard_data")
private LiveDashboardData2 liveDashboardData;
/**
* 直播时长
*/
@JsonProperty("live_duration")
private Long liveDuration;
/**
* 直播开始时间
*/
@JsonProperty("start_time")
private Long startTime;
}

View File

@@ -0,0 +1,38 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 直播大屏实体
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class LiveDashboardData2 implements Serializable {
private static final long serialVersionUID = 3657714024563123097L;
/**
* 直播基础数据
*/
@JsonProperty("summary")
private LiveDashboardData2Summary summary;
/**
* 直播流量渠道
*/
@JsonProperty("source")
private LiveDashboardData2Source source;
/**
* 直播观众画像
*/
@JsonProperty("portrait")
private LiveDashboardData2Portrait portrait;
}

View File

@@ -0,0 +1,33 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* 直播观众画像
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class LiveDashboardData2Portrait implements Serializable {
private static final long serialVersionUID = - 5603781471063785276L;
/**
* 在线人数的画像
*/
@JsonProperty("online_watch_uv")
private List<Series> onlineWatchUv;
/**
* 观看人数的画像
*/
@JsonProperty("new_watch_uv")
private List<Series> newWatchUv;
}

View File

@@ -0,0 +1,27 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* 直播流量渠道
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class LiveDashboardData2Source implements Serializable {
private static final long serialVersionUID = 7347276250944913612L;
/**
* 观看人数的渠道分布
*/
@JsonProperty("new_watch_uv")
private List<Series> newWatchUv;
}

View File

@@ -0,0 +1,80 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 直播基础数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class LiveDashboardData2Summary implements Serializable {
private static final long serialVersionUID = - 9029702302333930066L;
/**
* 观看人数
*/
@JsonProperty("new_watch_uv")
private Long newWatchUv;
/**
* 最大在线人数
*/
@JsonProperty("max_online_watch_uv")
private Long maxOnlineWatchUv;
/**
* 曝光人数
*/
@JsonProperty("impression_uv")
private Long impressionUv;
/**
* 平均观看时长(秒)
*/
@JsonProperty("average_watch_seconds_per_audience")
private Long averageWatchSecondsPerAudience;
/**
* 新增关注人数
*/
@JsonProperty("new_follow_uv")
private Long newFollowUv;
/**
* 新增粉丝团人数
*/
@JsonProperty("new_fans_club_uv")
private Long newFansClubUv;
/**
* 评论人数
*/
@JsonProperty("comment_uv")
private Long commentUv;
/**
* 打赏人数
*/
@JsonProperty("reward_uv")
private Long rewardUv;
/**
* 分享直播间人数
*/
@JsonProperty("sharing_uv")
private Long sharingUv;
/**
* 热度
*/
@JsonProperty("hot_quota")
private Long hotQuota;
}

View File

@@ -0,0 +1,30 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 获取直播大屏数据请求参数
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class LiveDataParam implements Serializable {
private static final long serialVersionUID = 6346941931704153857L;
/**
* 直播唯一ID
*/
@JsonProperty("export_id")
private String exportId;
}

View File

@@ -0,0 +1,69 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import me.chanjar.weixin.channel.bean.base.WxChannelBaseResponse;
/**
* 获取直播大屏数据响应
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class LiveDataResponse extends WxChannelBaseResponse {
private static final long serialVersionUID = - 8416743234527598719L;
/**
* 追踪ID报bug带
*/
@JsonProperty("trace_id")
private String traceId;
/**
* 直播大屏基础数据
*/
@JsonProperty("live_dashboard_data")
private LiveDashboardData liveDashboardData;
/**
* 内容力数据
*/
@JsonProperty("live_comparison_index")
private LiveComparisonIndex liveComparisonIndex;
/**
* 电商数据概要数据
*/
@JsonProperty("live_ec_data_summary")
private LiveEcDataSummary liveEcDataSummary;
/**
* 电商转化力数据
*/
@JsonProperty("live_ec_conversion_metric")
private LiveEcConversionMetric liveEcConversionMetric;
/**
* 电商画像数据
*/
@JsonProperty("live_ec_profile")
private LiveEcProfile liveEcProfile;
/**
* 电商渠道分布
*/
@JsonProperty("live_distribution_channel")
private LiveDistributionChannel liveDistributionChannel;
/**
* 电商商品数据
*/
@JsonProperty("single_live_ec_spu_data_page_v2")
private SingleLiveEcSpuDataPageV2 singleLiveEcSpuDataPageV2;
}

View File

@@ -0,0 +1,81 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* 流量来源渠道指标数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class LiveDistChannelSourceStats implements Serializable {
private static final long serialVersionUID = - 6802106934852140579L;
/**
* 渠道层级
*/
@JsonProperty("level")
private Integer level;
/**
* 来源渠道ID
*/
@JsonProperty("source_channel_id")
private Long sourceChannelId;
/**
* 流量来源子渠道指标数据统计值
*/
@JsonProperty("sub_channel_source_stats")
private List<SubLiveDistChannelSourceStats> subChannelSourceStats;
/**
* GMV总值单位
*/
@JsonProperty("gmv")
private Long gmv;
/**
* UV总值
*/
@JsonProperty("uv")
private Long uv;
/**
* 千次看播成交(单位: 分)(GPV)
*/
@JsonProperty("gmv_per_uv")
private Long gmvPerUv;
/**
* gmv占比
*/
@JsonProperty("gmv_ratio")
private Double gmvRatio;
/**
* uv占比
*/
@JsonProperty("uv_ratio")
private Double uvRatio;
/**
* 渠道名称
*/
@JsonProperty("source_channel_name")
private String sourceChannelName;
/**
* 当前层级pv占总pv的比例
*/
@JsonProperty("pv_ratio")
private Double pvRatio;
}

View File

@@ -0,0 +1,81 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* 流量类型、渠道层级的渠道分析统计数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class LiveDistributionByFlowTypeStat implements Serializable {
private static final long serialVersionUID = 5885014384803438677L;
/**
* 渠道流量类型 {@link me.chanjar.weixin.channel.enums.LiveDistributionFlowType}
*/
@JsonProperty("live_dst_channel_type")
private Integer liveDstChannelType;
/**
* 一级类目渠道来源指标划分
*/
@JsonProperty("channel_source_stats")
private List<LiveDistChannelSourceStats> channelSourceStats;
/**
* 在该渠道下的统计值
*/
@JsonProperty("metric_value")
private Long metricValue;
/**
* GMV总值单位
*/
@JsonProperty("gmv")
private Long gmv;
/**
* UV总值
*/
@JsonProperty("uv")
private Long uv;
/**
* 千次看播成交(单位: 分)(GPV)
*/
@JsonProperty("gmv_per_uv")
private Long gmvPerUv;
/**
* PV总值
*/
@JsonProperty("pv")
private Long pv;
/**
* 当前层级pv占总pv的比例
*/
@JsonProperty("pv_ratio")
private Double pvRatio;
/**
* uv占比
*/
@JsonProperty("uv_ratio")
private Double uvRatio;
/**
* 在该渠道下的统计值比率
*/
@JsonProperty("metric_value_ratio")
private Double metricValueRatio;
}

View File

@@ -0,0 +1,51 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* 电商渠道分布
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class LiveDistributionChannel implements Serializable {
private static final long serialVersionUID = - 5898886208775573377L;
/**
* 客户数
*/
@JsonProperty("audience_count")
private Long audienceCount;
/**
* 总进入直播数
*/
@JsonProperty("total_joinlive_count")
private Long totalJoinliveCount;
/**
* 按场景划分的渠道分析统计值
*/
@JsonProperty("live_dist_channel_source_by_scene_stats")
private List<LiveDistributionSceneStat> liveDistChannelSourceBySceneStats;
/**
* 按照流量类型、渠道层级划分的渠道分析统计数据
*/
@JsonProperty("live_dist_channel_source_stats")
private List<LiveDistributionByFlowTypeStat> liveDistChannelSourceStats;
/**
* 数据版本(无实际意义)
*/
@JsonProperty("data_key")
private List<String> dataKey;
}

View File

@@ -0,0 +1,75 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* 场景的渠道分析统计值
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class LiveDistributionSceneStat implements Serializable {
private static final long serialVersionUID = 4261140121141859416L;
/**
* 场景类型 {@link me.chanjar.weixin.channel.enums.LiveDistributionSceneType}
*/
@JsonProperty("scene_type")
private Integer sceneType;
/**
* 该场景下的渠道分析统计值
*/
@JsonProperty("dist_flow_type_stats")
private List<LiveDistributionByFlowTypeStat> distFlowTypeStats;
/**
* 指标值总数
*/
@JsonProperty("metric_value_total")
private Long metricValueTotal;
/**
* GMV总值单位
*/
@JsonProperty("gmv")
private Long gmv;
/**
* UV总值
*/
@JsonProperty("uv")
private Long uv;
/**
* 千次看播成交(单位: 分)
*/
@JsonProperty("gmv_per_uv")
private Long gmvPerUv;
/**
* 指标值
*/
@JsonProperty("metric_value")
private Long metricValue;
/**
* 在该渠道下的统计值比率
*/
@JsonProperty("metric_value_ratio")
private Double metricValueRatio;
/**
* pv
*/
@JsonProperty("pv")
private Long pv;
}

View File

@@ -0,0 +1,32 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 电商转化力数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class LiveEcConversionMetric implements Serializable {
private static final long serialVersionUID = - 7332281175637902883L;
/**
* 近10分钟转化率数据
*/
@JsonProperty("recent_10_min_conversion")
private ConversionMetric recent10MinConversion;
/**
* 整场直播
*/
@JsonProperty("whole_live_conversion")
private ConversionMetric wholeLiveConversion;
}

View File

@@ -0,0 +1,212 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 电商数据概要数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class LiveEcDataSummary implements Serializable {
private static final long serialVersionUID = - 6634047980552575196L;
/**
* 成交金额(单位:分)
*/
@JsonProperty("total_gmv")
private Long totalGmv;
/**
* 成交次数
*/
@JsonProperty("total_pay_pv")
private Long totalPayPv;
/**
* 成交人数
*/
@JsonProperty("total_pay_uv")
private Long totalPayUv;
/**
* 订单创建次数
*/
@JsonProperty("total_create_pv")
private Long totalCreatePv;
/**
* 订单创建人数
*/
@JsonProperty("total_create_uv")
private Long totalCreateUv;
/**
* 总点击次数
*/
@JsonProperty("total_clk_pv")
private Long totalClkPv;
/**
* 总点击人数
*/
@JsonProperty("total_clk_uv")
private Long totalClkUv;
/**
* 总曝光次数
*/
@JsonProperty("total_exp_pv")
private Long totalExpPv;
/**
* 总曝光人数
*/
@JsonProperty("total_exp_uv")
private Long totalExpUv;
/**
* 在线观众数
*/
@JsonProperty("online_audience_count")
private Long onlineAudienceCount;
/**
* 累计观众数
*/
@JsonProperty("cumulative_audience_count")
private Long cumulativeAudienceCount;
/**
* 新增观众数
*/
@JsonProperty("new_audience_count")
private Long newAudienceCount;
/**
* 剩余观众数
*/
@JsonProperty("leaved_audience_count")
private Long leavedAudienceCount;
/**
* 观众平均观看秒数
*/
@JsonProperty("average_watch_seconds_per_audience")
private Long averageWatchSecondsPerAudience;
/**
* 新增关注数
*/
@JsonProperty("new_follow_count")
private Long newFollowCount;
/**
* 新增评论数
*/
@JsonProperty("new_comment_count")
private Long newCommentCount;
/**
* 分享直播观众数
*/
@JsonProperty("share_live_audience_count")
private Long shareLiveAudienceCount;
/**
* 新粉丝俱乐部数
*/
@JsonProperty("new_fans_club_count")
private Long newFansClubCount;
/**
* 退费次数
*/
@JsonProperty("refund_pv")
private Long refundPv;
/**
* 退费人数
*/
@JsonProperty("refund_uv")
private Long refundUv;
/**
* 退费率
*/
@JsonProperty("refund_rate")
private Double refundRate;
/**
* 退款金额(单位:分)
*/
@JsonProperty("refund_amount")
private Long refundAmount;
/**
* 退费商品件数
*/
@JsonProperty("refund_product_cnt")
private Long refundProductCnt;
/**
* 广告累计观众数
*/
@JsonProperty("ads_cumulative_audience_count")
private Long adsCumulativeAudienceCount;
/**
* 广告累计观看数
*/
@JsonProperty("ads_cumulative_watch_count")
private Long adsCumulativeWatchCount;
/**
* 促销累计观看数
*/
@JsonProperty("promotion_cumulative_watch_count")
private Long promotionCumulativeWatchCount;
/**
* 千次看播成交总额
*/
@JsonProperty("gmv_per_thousand_cumulative_watch_pv")
private Double gmvPerThousandCumulativeWatchPv;
/**
* 观众成交率
*/
@JsonProperty("audience_pay_ratio")
private Double audiencePayRatio;
/**
* 点击成交率
*/
@JsonProperty("clk_pay_ratio")
private Double clkPayRatio;
/**
* 新买家人数
*/
@JsonProperty("new_buyer_uv")
private Long newBuyerUv;
/**
* 老买家人数
*/
@JsonProperty("old_buyer_uv")
private Long oldBuyerUv;
/**
* 客户价格
*/
@JsonProperty("customer_price")
private Long customerPrice;
}

View File

@@ -0,0 +1,33 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* 电商画像数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class LiveEcProfile implements Serializable {
private static final long serialVersionUID = 1996741772652344438L;
/**
* 包含不同用户群体的统计数据
*/
@JsonProperty("profiles")
private List<DataNodeThirdList> profiles;
/**
* 总体数据统计信息
*/
@JsonProperty("totals")
private List<DataNodeList> totals;
}

View File

@@ -0,0 +1,32 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 直播列表数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class LiveItem implements Serializable {
private static final long serialVersionUID = 6693176992531666035L;
/**
* 直播唯一ID
*/
@JsonProperty("export_id")
private String exportId;
/**
* 直播创建时间
*/
@JsonProperty("create_time")
private Long createTime;
}

View File

@@ -0,0 +1,30 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 获取直播大屏直播列表请求参数
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class LiveListParam implements Serializable {
private static final long serialVersionUID = - 8451283214646387030L;
/**
* 日期,格式 yyyyMMdd
*/
@JsonProperty("ds")
private Long ds;
}

View File

@@ -0,0 +1,41 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import me.chanjar.weixin.channel.bean.base.WxChannelBaseResponse;
import java.util.List;
/**
* 获取直播大屏直播列表响应
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class LiveListResponse extends WxChannelBaseResponse {
private static final long serialVersionUID = - 5062337147636715367L;
/**
* 追踪ID报bug带
*/
@JsonProperty("trace_id")
private String traceId;
/**
* 直播列表
*/
@JsonProperty("live_items")
private List<LiveItem> liveItems;
/**
* 是否还有更多的直播
*/
@JsonProperty("has_more")
private Boolean hasMore;
}

View File

@@ -0,0 +1,44 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 在播内容力数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class OnAir implements Serializable {
private static final long serialVersionUID = 6354207471314033499L;
/**
* 曝光有效CTR万分比
*/
@JsonProperty("recommend_effective_new_watch_2_uv_over_impression_uv")
private OnAirIndexItem recommendEffectiveNewWatch2UvOverImpressionUv;
/**
* 人均看播时长
*/
@JsonProperty("average_watch_seconds")
private OnAirIndexItem averageWatchSeconds;
/**
* 评论率(万分比)
*/
@JsonProperty("comment_uv_over_new_watch_uv")
private OnAirIndexItem commentUvOverNewWatchUv;
/**
* 点赞率(万分比)
*/
@JsonProperty("like_uv_over_new_watch_uv")
private OnAirIndexItem likeUvOverNewWatchUv;
}

View File

@@ -0,0 +1,56 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 在播内容力指标数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class OnAirIndexItem implements Serializable {
private static final long serialVersionUID = - 2988342521964183666L;
/**
* 描述最近多少分钟的指标值
*/
@JsonProperty("n")
private Integer n;
/**
* 最近 n 分钟该指标的值
*/
@JsonProperty("last_n_mins_value")
private Integer lastNMinsValue;
/**
* 最近 2n 到 n 分钟该指标的值(用于环比)
*/
@JsonProperty("last_2n_to_n_mins_value")
private Integer last2nToNMinsValue;
/**
* 最近 n 分钟该指标值打败了 xx% 的在播主播
*/
@JsonProperty("last_n_mins_percentile")
private Integer lastNMinsPercentile;
/**
* 整场直播的指标值
*/
@JsonProperty("value")
private Long value;
/**
* 整场直播该指标值打败了 xx% 的主播
*/
@JsonProperty("percentile")
private Integer percentile;
}

View File

@@ -0,0 +1,32 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 数据点
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class Point implements Serializable {
private static final long serialVersionUID = 3332256418933163389L;
/**
* 时间戳
*/
@JsonProperty("ts")
private Long ts;
/**
* 指标值
*/
@JsonProperty("value")
private Long value;
}

View File

@@ -0,0 +1,32 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 转化率环比数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class QuarterlyGrowthRate implements Serializable {
private static final long serialVersionUID = 1683118806978367016L;
/**
* 环比近10分钟转化率数据才有
*/
@JsonProperty("value")
private Long value;
/**
* 环比是否是有效值如果是false说明分母是0
*/
@JsonProperty("is_valid")
private Boolean isValid;
}

View File

@@ -0,0 +1,51 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* 维度标签的时间序列(与指标的类型无关)
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class Series implements Serializable {
private static final long serialVersionUID = 507937573085880287L;
/**
* 数据点
*/
@JsonProperty("points")
private List<Point> points;
/**
* 描述时间序列的维度标签
*/
@JsonProperty("dimensions")
private List<Dimension> dimensions;
/**
* 每个数据点描述的时间长度(秒)
*/
@JsonProperty("step")
private Long step;
/**
* 该时间序列的起始时间戳
*/
@JsonProperty("begin_ts")
private Long beginTs;
/**
* 该时间序列的结束时间戳
*/
@JsonProperty("end_ts")
private Long endTs;
}

View File

@@ -0,0 +1,39 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* 电商商品数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class SingleLiveEcSpuDataPageV2 implements Serializable {
private static final long serialVersionUID = - 761977668198342583L;
/**
* 商品明细数据列表
*/
@JsonProperty("spu_data_list")
private List<SpuData> spuDataList;
/**
* spu_data_list 的总长度
*/
@JsonProperty("total_cnt")
private Integer totalCnt;
/**
* 数据版本(无实际意义)
*/
@JsonProperty("data_key")
private List<String> dataKey;
}

View File

@@ -0,0 +1,68 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 商品基础数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class SpuBaseData implements Serializable {
private static final long serialVersionUID = 3170611962212344198L;
/**
* 店铺商品id
*/
@JsonProperty("src_spu_id")
private String srcSpuId;
/**
* 店铺id
*/
@JsonProperty("src")
private Long src;
/**
* 商品名称
*/
@JsonProperty("spu_name")
private String spuName;
/**
* 商品id
*/
@JsonProperty("spu_id")
private Long spuId;
/**
* 商品小图
*/
@JsonProperty("thumb_url")
private String thumbUrl;
/**
* 商品价格
*/
@JsonProperty("price")
private Long price;
/**
* 店铺名称
*/
@JsonProperty("src_name")
private String srcName;
/**
* 库存
*/
@JsonProperty("stock")
private Long stock;
}

View File

@@ -0,0 +1,350 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 商品明细数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class SpuData implements Serializable {
private static final long serialVersionUID = 7409791549917863816L;
/**
* 商品基础数据
*/
@JsonProperty("base_data")
private SpuBaseData baseData;
/**
* 商品曝光人数
*/
@JsonProperty("exp_uv")
private Long expUv;
/**
* 商品曝光次数
*/
@JsonProperty("exp_pv")
private Long expPv;
/**
* 商品粉丝曝光人数
*/
@JsonProperty("fans_exp_uv")
private Long fansExpUv;
/**
* 商品粉丝曝光次数
*/
@JsonProperty("fans_exp_pv")
private Long fansExpPv;
/**
* 商品非粉丝曝光人数
*/
@JsonProperty("non_fans_exp_uv")
private Long nonFansExpUv;
/**
* 商品非粉丝曝光次数
*/
@JsonProperty("non_fans_exp_pv")
private Long nonFansExpPv;
/**
* 商品新客户曝光人数
*/
@JsonProperty("new_customer_exp_uv")
private Long newCustomerExpUv;
/**
* 商品新客户曝光次数
*/
@JsonProperty("new_customer_exp_pv")
private Long newCustomerExpPv;
/**
* 商品老客户曝光人数
*/
@JsonProperty("repeated_customer_exp_uv")
private Long repeatedCustomerExpUv;
/**
* 商品老客户曝光次数
*/
@JsonProperty("repeated_customer_exp_pv")
private Long repeatedCustomerExpPv;
/**
* 商品点击人数
*/
@JsonProperty("clk_uv")
private Long clkUv;
/**
* 商品点击次数
*/
@JsonProperty("clk_pv")
private Long clkPv;
/**
* 商品新客户点击人数
*/
@JsonProperty("new_customer_clk_uv")
private Long newCustomerClkUv;
/**
* 商品新客户点击次数
*/
@JsonProperty("new_customer_clk_pv")
private Long newCustomerClkPv;
/**
* 商品老客户点击人数
*/
@JsonProperty("repeated_customer_clk_uv")
private Long repeatedCustomerClkUv;
/**
* 商品老客户点击次数
*/
@JsonProperty("repeated_customer_clk_pv")
private Long repeatedCustomerClkPv;
/**
* 商品粉丝点击人数
*/
@JsonProperty("fans_clk_uv")
private Long fansClkUv;
/**
* 商品粉丝点击次数
*/
@JsonProperty("fans_clk_pv")
private Long fansClkPv;
/**
* 商品非粉丝点击人数
*/
@JsonProperty("non_fans_clk_uv")
private Long nonFansClkUv;
/**
* 商品非粉丝点击次数
*/
@JsonProperty("non_fans_clk_pv")
private Long nonFansClkPv;
/**
* 商品分享人数
*/
@JsonProperty("share_uv")
private Long shareUv;
/**
* 商品分享次数
*/
@JsonProperty("share_pv")
private Long sharePv;
/**
* 商品曝光点击率
*/
@JsonProperty("exp_clk_ratio")
private Double expClkRatio;
/**
* 商品点击成交率
*/
@JsonProperty("clk_pay_ratio")
private Double clkPayRatio;
/**
* 商品成交金额(单位:分)
*/
@JsonProperty("gmv")
private Long gmv;
/**
* 商品成交订单数
*/
@JsonProperty("pay_pv")
private Long payPv;
/**
* 商品成交人数
*/
@JsonProperty("pay_uv")
private Long payUv;
/**
* 商品粉丝成交订单数
*/
@JsonProperty("fans_pay_pv")
private Long fansPayPv;
/**
* 商品粉丝成交人数
*/
@JsonProperty("fans_pay_uv")
private Long fansPayUv;
/**
* 商品非粉丝成交订单数
*/
@JsonProperty("non_fans_pay_pv")
private Long nonFansPayPv;
/**
* 商品非粉丝成交人数
*/
@JsonProperty("non_fans_pay_uv")
private Long nonFansPayUv;
/**
* 商品新客户成交次数
*/
@JsonProperty("new_customer_pay_pv")
private Long newCustomerPayPv;
/**
* 商品新客户成交人数
*/
@JsonProperty("new_customer_pay_uv")
private Long newCustomerPayUv;
/**
* 商品老客户成交次数
*/
@JsonProperty("repeated_customer_pay_pv")
private Long repeatedCustomerPayPv;
/**
* 商品老客户成交人数
*/
@JsonProperty("repeated_customer_pay_uv")
private Long repeatedCustomerPayUv;
/**
* 商品退款人数
*/
@JsonProperty("refund_uv")
private Long refundUv;
/**
* 商品退款订单数
*/
@JsonProperty("refund_pv")
private Long refundPv;
/**
* 商品退款金额(单位:分)
*/
@JsonProperty("refund_amount")
private Long refundAmount;
/**
* 商品订单创建人数
*/
@JsonProperty("create_uv")
private Long createUv;
/**
* 商品订单创建次数
*/
@JsonProperty("create_pv")
private Long createPv;
/**
* 商品粉丝订单创建人数
*/
@JsonProperty("fans_create_uv")
private Long fansCreateUv;
/**
* 商品粉丝订单创建次数
*/
@JsonProperty("fans_create_pv")
private Long fansCreatePv;
/**
* 商品非粉丝订单创建人数
*/
@JsonProperty("non_fans_create_uv")
private Long nonFansCreateUv;
/**
* 商品非粉丝订单创建次数
*/
@JsonProperty("non_fans_create_pv")
private Long nonFansCreatePv;
/**
* 商品新客户订单创建人数
*/
@JsonProperty("new_customer_create_uv")
private Long newCustomerCreateUv;
/**
* 商品新客户订单创建次数
*/
@JsonProperty("new_customer_create_pv")
private Long newCustomerCreatePv;
/**
* 商品老客户订单创建人数
*/
@JsonProperty("repeated_customer_create_uv")
private Long repeatedCustomerCreateUv;
/**
* 商品老客户订单创建次数
*/
@JsonProperty("repeated_customer_create_pv")
private Long repeatedCustomerCreatePv;
/**
* 商品库存
*/
@JsonProperty("stock")
private Long stock;
/**
* 商品退费率
*/
@JsonProperty("refund_rate")
private Double refundRate;
/**
* 商品完成订单数
*/
@JsonProperty("finish_pv")
private Long finishPv;
/**
* 商品未完成订单数
*/
@JsonProperty("no_finish_pv")
private Long noFinishPv;
/**
* 商品新客户转换率
*/
@JsonProperty("new_customer_conversion_rate")
private Double newCustomerConversionRate;
/**
* 商品讲解数
*/
@JsonProperty("explanation_count")
private Long explanationCount;
}

View File

@@ -0,0 +1,92 @@
package me.chanjar.weixin.channel.bean.live.dashboard;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 流量来源子渠道指标数据
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Data
@NoArgsConstructor
public class SubLiveDistChannelSourceStats implements Serializable {
private static final long serialVersionUID = - 5279814435684116105L;
/**
* 渠道层级
*/
@JsonProperty("level")
private Integer level;
/**
* 来源渠道ID
*/
@JsonProperty("source_channel_id")
private Long sourceChannelId;
/**
* 在该渠道下的统计值
*/
@JsonProperty("metric_value")
private Long metricValue;
/**
* GMV总值单位
*/
@JsonProperty("gmv")
private Long gmv;
/**
* UV总值
*/
@JsonProperty("uv")
private Long uv;
/**
* 千次看播成交(单位: 分)
*/
@JsonProperty("gmv_per_uv")
private Long gmvPerUv;
/**
* gmv占比
*/
@JsonProperty("gmv_ratio")
private Double gmvRatio;
/**
* uv占比
*/
@JsonProperty("uv_ratio")
private Double uvRatio;
/**
* 在该渠道下的统计值比率
*/
@JsonProperty("metric_value_ratio")
private Double metricValueRatio;
/**
* 渠道名称
*/
@JsonProperty("source_channel_name")
private String sourceChannelName;
/**
* pv
*/
@JsonProperty("pv")
private Long pv;
/**
* 当前层级pv占总pv的比例
*/
@JsonProperty("pv_ratio")
private Double pvRatio;
}

View File

@@ -428,4 +428,44 @@ public class WxChannelApiUrlConstants {
/** 更新用户等级 */
String GRADE_UPDATE_URL = "https://api.weixin.qq.com/channels/ec/vip/user/grade/update";
}
/**
* 直播大屏数据
*/
public interface LiveDashboard {
/**
* <a href="https://developers.weixin.qq.com/doc/channels/API/livedashboard/getlivelist.html">获取直播大屏直播列表</a>
*/
String GET_LIVE_LIST_URL = "https://api.weixin.qq.com/channels/livedashboard/getlivelist";
/**
* <a href="https://developers.weixin.qq.com/doc/channels/API/livedashboard/getlivedata.html">获取直播大屏数据</a>
*/
String GET_LIVE_DATA_URL = "https://api.weixin.qq.com/channels/livedashboard/getlivedata";
}
/**
* 罗盘达人版API
*/
public interface CompassFinder {
/**
* <a href="https://developers.weixin.qq.com/doc/channels/API/compass/finder/getfinderoverall.html">获取电商概览数据</a>
*/
String GET_OVERALL_URL = "https://api.weixin.qq.com/channels/ec/compass/finder/overall/get";
/**
* <a href="https://developers.weixin.qq.com/doc/channels/API/compass/finder/getfinderproductdata.html">获取带货商品数据</a>
*/
String GET_PRODUCT_DATA_URL = "https://api.weixin.qq.com/channels/ec/compass/finder/product/data/get";
/**
* <a href="https://developers.weixin.qq.com/doc/channels/API/compass/finder/getfinderproductlist.html">获取带货商品列表</a>
*/
String GET_PRODUCT_LIST_URL = "https://api.weixin.qq.com/channels/ec/compass/finder/product/list/get";
/**
* <a href="https://developers.weixin.qq.com/doc/channels/API/compass/finder/getfindersaleprofiledata.html">获取带货人群数据</a>
*/
String GET_SALE_PROFILE_DATA_URL = "https://api.weixin.qq.com/channels/ec/compass/finder/sale/profile/data/get";
}
}

View File

@@ -0,0 +1,80 @@
package me.chanjar.weixin.channel.enums;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 视频号助手 直播数据维度类型
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum DimensionType {
/**
* 一级渠道
*/
PRIMARY_CHANNEL(1, "一级渠道"),
/**
* 年龄段
*/
AGE(2, "年龄段"),
/**
* 性别
*/
SEX(3, "性别"),
/**
* 关注关系
*/
FOLLOW(5, "关注关系"),
/**
* 二级渠道
*/
SECONDARY_CHANNEL(7, "二级渠道"),
/**
* 策略人群
*/
CATE(9, "策略人群"),
/**
* 省级行政区
*/
PROVINCE(10, "省级行政区"),
/**
* 地级行政区
*/
CITY(11, "地级行政区"),
/**
* 消费者商品类目偏好
*/
ECOM_USER_LEVEL(12, "消费者商品类目偏好"),
/**
* 客单价区间
*/
GMV_PER_CNT(13, "客单价区间"),
// /**
// * 关注关系
// */
// FOLLOW(15, "关注关系"),
/**
* 流量类型(自然流量、直播加热、广告投流)
*/
FLOW(16, "流量类型(自然流量、直播加热、广告投流)"),
;
private final Integer key;
private final String value;
DimensionType(Integer key, String value) {
this.key = key;
this.value = value;
}
public Integer getKey() {
return key;
}
public String getValue() {
return value;
}
}

View File

@@ -0,0 +1,64 @@
package me.chanjar.weixin.channel.enums;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 视频号助手 用户群体数据节点键
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum EcProfileDataNodeKey {
/**
* 性别分布
*/
SEX("sex_distribution", "性别分布"),
/**
* 年龄分布
*/
AGE("age_distribution", "年龄分布"),
/**
* 省份分布
*/
PROVINCE("province_distribution", "省份分布"),
/**
* 城市分布
*/
CITY("city_distribution", "城市分布"),
/**
* 关注关系分布
*/
FOLLOW("follow_distribution", "关注关系分布"),
/**
* 策略人群分布
*/
CATE("cate_distribution", "策略人群分布"),
/**
* 商品类目偏好分布
*/
ECOM_USER_LEVEL("ecom_user_level_distribution", "商品类目偏好分布"),
/**
* 平均客单价分布
*/
GMV_PER_CNT("gmv_per_cnt_distribution", "平均客单价分布"),
;
private final String key;
private final String value;
EcProfileDataNodeKey(String key, String value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public String getValue() {
return value;
}
}

View File

@@ -0,0 +1,56 @@
package me.chanjar.weixin.channel.enums;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 视频号助手 直播分布流量类型
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum LiveDistributionFlowType {
/**
* 无效值
*/
INVALID(0, "无效值"),
/**
* 自然流量
*/
NATURAL(1, "自然流量"),
/**
* 加热流量
*/
PROMOTE(2, "加热流量"),
/**
* 广告流量
*/
ADS(3, "广告流量"),
/**
* 公域流量
*/
COMMON_DOMAIN(4, "公域流量"),
/**
* 私域流量
*/
PRIVATE_DOMAIN(5, "私域流量"),
;
private final Integer key;
private final String value;
LiveDistributionFlowType(Integer key, String value) {
this.key = key;
this.value = value;
}
public Integer getKey() {
return key;
}
public String getValue() {
return value;
}
}

View File

@@ -0,0 +1,52 @@
package me.chanjar.weixin.channel.enums;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 视频号助手 直播分布场景类型
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum LiveDistributionSceneType {
/**
* 商品曝光
*/
PRODUCT_IMPRESSION(6, "商品曝光"),
/**
* 直播间曝光次数
*/
LIVE_ROOM_IMPRESSION_PV(7, "直播间曝光次数"),
/**
* 商品点击次数
*/
PRODUCT_CLICK_PV(8, "商品点击次数"),
/**
* 创建订单数按渠道统计
*/
CHANNEL_TOTAL_CREATE_PV(9, "创建订单数按渠道统计"),
/**
* 成交订单数按渠道统计
*/
CHANNEL_TOTAL_PAY_PV(10, "成交订单数按渠道统计"),
;
private final Integer key;
private final String value;
LiveDistributionSceneType(Integer key, String value) {
this.key = key;
this.value = value;
}
public Integer getKey() {
return key;
}
public String getValue() {
return value;
}
}

View File

@@ -0,0 +1,56 @@
package me.chanjar.weixin.channel.enums;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 带货人群用户类型
*
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum SaleProfileUserType {
/**
* 商品曝光用户
*/
PRODUCT_IMPRESSION_USER(1, "商品曝光用户"),
/**
* 商品点击用户
*/
PRODUCT_CLICK_USER(2, "商品点击用户"),
/**
* 购买用户
*/
PURCHASING_USER(3, "购买用户"),
/**
* 首购用户
*/
FIRST_PURCHASE_USER(4, "首购用户"),
/**
* 复购用户
*/
REPURCHASE_USER(5, "复购用户"),
/**
* 直播观看用户
*/
LIVE_WATCHER_USER(6, "直播观看用户"),
;
private final Integer key;
private final String value;
SaleProfileUserType(Integer key, String value) {
this.key = key;
this.value = value;
}
public Integer getKey() {
return key;
}
public String getValue() {
return value;
}
}

View File

@@ -0,0 +1,66 @@
package me.chanjar.weixin.channel.api.impl;
import com.google.inject.Inject;
import me.chanjar.weixin.channel.api.WxChannelCompassFinderService;
import me.chanjar.weixin.channel.api.WxChannelService;
import me.chanjar.weixin.channel.bean.compass.finder.OverallResponse;
import me.chanjar.weixin.channel.bean.compass.finder.ProductDataResponse;
import me.chanjar.weixin.channel.bean.compass.finder.ProductListResponse;
import me.chanjar.weixin.channel.bean.compass.finder.SaleProfileDataResponse;
import me.chanjar.weixin.channel.enums.SaleProfileUserType;
import me.chanjar.weixin.channel.test.ApiTestModule;
import me.chanjar.weixin.common.error.WxErrorException;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
/**
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Guice(modules = ApiTestModule.class)
public class WxChannelCompassFinderServiceImplTest {
@Inject
private WxChannelService channelService;
@Test
public void testGetOverAll() throws WxErrorException {
WxChannelCompassFinderService compassFinderService = channelService.getCompassFinderService();
String ds = "20240630";
OverallResponse response = compassFinderService.getOverall(ds);
assertNotNull(response);
assertTrue(response.isSuccess());
}
@Test
public void testGetProductData() throws WxErrorException {
WxChannelCompassFinderService compassFinderService = channelService.getCompassFinderService();
String ds = "20240630";
String productId = "10000017457793";
ProductDataResponse response = compassFinderService.getProductData(ds, productId);
assertNotNull(response);
assertTrue(response.isSuccess());
}
@Test
public void testGetProductList() throws WxErrorException {
WxChannelCompassFinderService compassFinderService = channelService.getCompassFinderService();
String ds = "20240630";
ProductListResponse response = compassFinderService.getProductList(ds);
assertNotNull(response);
assertTrue(response.isSuccess());
}
@Test
public void testGetSaleProfileData() throws WxErrorException {
WxChannelCompassFinderService compassFinderService = channelService.getCompassFinderService();
String ds = "20240630";
Integer type = SaleProfileUserType.PRODUCT_IMPRESSION_USER.getKey();
SaleProfileDataResponse response = compassFinderService.getSaleProfileData(ds, type);
assertNotNull(response);
assertTrue(response.isSuccess());
}
}

View File

@@ -0,0 +1,44 @@
package me.chanjar.weixin.channel.api.impl;
import com.google.inject.Inject;
import me.chanjar.weixin.channel.api.WxChannelLiveDashboardService;
import me.chanjar.weixin.channel.api.WxChannelService;
import me.chanjar.weixin.channel.bean.live.dashboard.LiveDataResponse;
import me.chanjar.weixin.channel.bean.live.dashboard.LiveListResponse;
import me.chanjar.weixin.channel.test.ApiTestModule;
import me.chanjar.weixin.common.error.WxErrorException;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
/**
* @author <a href="https://github.com/Winnie-by996">Winnie</a>
*/
@Guice(modules = ApiTestModule.class)
public class WxChannelLiveDashboardServiceImplTest {
@Inject
private WxChannelService channelService;
@Test
public void testGetLiveList() throws WxErrorException {
WxChannelLiveDashboardService liveDashboardService = channelService.getLiveDashboardService();
// yyyyMMdd
Long ds = 20240630L;
LiveListResponse response = liveDashboardService.getLiveList(ds);
assertNotNull(response);
assertTrue(response.isSuccess());
}
@Test
public void testGetLiveData() throws WxErrorException {
WxChannelLiveDashboardService liveDashboardService = channelService.getLiveDashboardService();
String exportId = "export/UzFf*****************************************************************************************64V";
LiveDataResponse response = liveDashboardService.getLiveData(exportId);
assertNotNull(response);
assertTrue(response.isSuccess());
}
}