1.前言
腾讯移动分析
http://mta.qq.com/mta/
文档
http://docs.developer.qq.com/mta/
2018.6.14文档只有Android、iOS、H5、微信小程序的配置。
接入微信小游戏需要修改SDK。
(1)需要按文档配置appID,eventID
这里的appID是注册时的公司账号,所有小游戏公用一个,不是小游戏的appID。
eventID是在腾讯移动分析创建小游戏的数据分析管理页面时,由运营添加的一个id,用于区分不同的小游戏。
注意:这一步通常运营已经做完了,开发人员只需要向对应的策划获得账号,登录,在对应你的项目的应用管理
页面会看到appID、eventID。
(2)下载下来的SDK如下:
mta_analysis.js
(3)需要将以下添加到微信公众平台小游戏的设置分页的服务器域名:
https://pingtas.qq.com
(4)适应的场景:小程序点击跳转按钮,带一个参数,跳转到小游戏。此参数形如
source=xxx
通过xxx参数就可以确定是从哪个小程序跳转过来的。统计数据保存在腾讯移动分析上。
2.代码
2.1.小程序跳转调用接口
wx.navigateToMiniProgram({
appId: game.appid,
path: "",
extraData: {source="xxxx"},
complete:res=>{
}
});
其中source后的字符串就代表是从谁那里跳转的。比如
source=guess_song
就代表是从猜歌跳转的。
2.2.修改mta_analysis.js
var MTA_CONFIG = {
app_id: "",
event_id: "",
api_base: "https://pingtas.qq.com/pingd",
prefix: "_mta_",
version: "1.3.5",
stat_share_app: !1,
stat_pull_down_fresh: !1,
stat_reach_bottom: !1
};
function getNetworkType(a) {
wx.getNetworkType({
success: function (b) {
a(b.networkType)
}
})
}
function getSystemInfo() {
var a = wx.getSystemInfoSync();
return {
adt: encodeURIComponent(a.model),
scl: a.pixelRatio,
scr: a.windowWidth + "x" + a.windowHeight,
lg: a.language,
fl: a.version,
jv: encodeURIComponent(a.system),
tz: encodeURIComponent(a.platform)
}
}
function getUID() {
try {
return wx.getStorageSync(MTA_CONFIG.prefix + "auid")
} catch (a) { }
}
function setUID() {
try {
var a = getRandom();
wx.setStorageSync(MTA_CONFIG.prefix + "auid", a);
return a
} catch (b) { }
}
function getSID() {
try {
return wx.getStorageSync(MTA_CONFIG.prefix + "ssid")
} catch (a) { }
}
function setSID() {
try {
var a = "s" + getRandom();
wx.setStorageSync(MTA_CONFIG.prefix + "ssid", a);
return a
} catch (b) { }
}
function getRandom(a) {
for (var b = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], c = 10; 1 < c; c--) {
var d = Math.floor(10 * Math.random()),
e = b[d];
b[d] = b[c - 1];
b[c - 1] = e
}
for (c = d = 0; 5 > c; c++) d = 10 * d + b[c];
return (a || "") + (d + "" + +new Date)
}
function getPagePath() {
try {
var
b = "/";
return b
} catch (c) {
console.log("get current page path error:" + c)
}
}
function getMainInfo() {
var a = {
dm: "wechat.apps.xx",
url: getPagePath(),
pvi: "",
si: "",
ty: 0
};
a.pvi = function () {
var b = getUID();
b || (b = setUID(), a.ty = 1);
return b
}();
a.si = function () {
var a = getSID();
a || (a = setSID());
return a
}();
return a
}
function getBasicInfo() {
var a = getSystemInfo();
getNetworkType(function (a) {
try {
wx.setStorageSync(MTA_CONFIG.prefix + "ntdata", a)
} catch (c) { }
});
a.ct = wx.getStorageSync(MTA_CONFIG.prefix + "ntdata") || "4g";
return a
}
function getExtentInfo() {
var a = MTA.Data.userInfo;
var b = [],
c;
for (c in a) a.hasOwnProperty(c) && b.push(c + "=" + a[c]);
a = b.join(";");
return {
r2: MTA_CONFIG.app_id,
r4: "wx",
ext: "v=" + MTA_CONFIG.version + (null !== a && "" !== a ? ";ui=" + encodeURIComponent(a) : "")
}
}
var MTA = {
App: {
init: function (a) {
"appID" in a && (MTA_CONFIG.app_id = a.appID);
"eventID" in a && (MTA_CONFIG.event_id = a.eventID);
"statShareApp" in a && (MTA_CONFIG.stat_share_app = a.statShareApp);
"statPullDownFresh" in a && (MTA_CONFIG.stat_pull_down_fresh = a.statPullDownFresh);
"statReachBottom" in a && (MTA_CONFIG.stat_reach_bottom = a.statReachBottom);
setSID();
"lauchOpts" in a && (MTA.Data.lanchInfo = a.lauchOpts, MTA.Data.lanchInfo.landing = 1)
}
},
Page: {
init: function () {
var a = { onShow: true, __route__: "pages/index/index" };
a.onShow &&
! function () {
var b = a.onShow;
a.onShow = function () {
MTA.Page.stat();
b.call(this, arguments)
}
}();
MTA.Page.stat();
MTA_CONFIG.stat_pull_down_fresh && a.onPullDownRefresh && ! function () {
var b = a.onPullDownRefresh;
a.onPullDownRefresh = function () {
MTA.Event.stat(MTA_CONFIG.prefix + "pulldownfresh", {
url: a.__route__
});
b.call(this, arguments)
}
}();
MTA_CONFIG.stat_reach_bottom && a.onReachBottom && ! function () {
var b = a.onReachBottom;
a.onReachBottom = function () {
MTA.Event.stat(MTA_CONFIG.prefix + "reachbottom", {
url: a.__route__
});
b.call(this, arguments)
}
}();
MTA_CONFIG.stat_share_app && a.onShareAppMessage && ! function () {
var b = a.onShareAppMessage;
a.onShareAppMessage = function () {
MTA.Event.stat(MTA_CONFIG.prefix + "shareapp", {
url: a.__route__
});
return b.call(this, arguments)
}
}()
},
stat: function () {
if ("" != MTA_CONFIG.app_id) {
var a = [],
b = getExtentInfo(),
c = [getMainInfo(), b, getBasicInfo()];
MTA.Data.lanchInfo && (c.push({
ht: MTA.Data.lanchInfo.scene,
rdm: "/",
rurl: MTA.Data.lanchInfo.path
}), MTA.Data.lanchInfo.query && MTA.Data.lanchInfo.query._mta_ref_id && c.push({
rarg: MTA.Data.lanchInfo.query._mta_ref_id
}),
1 == MTA.Data.lanchInfo.landing && (b.ext += ";lp=1", MTA.Data.lanchInfo.landing = 0));
c.push({
rand: +new Date
});
b = 0;
for (var d = c.length; b < d; b++)
for (var e in c[b]) c[b].hasOwnProperty(e) && a.push(e + "=" + ("undefined" == typeof c[b][e] ? "" : c[b][e]));
wx.request({
url: MTA_CONFIG.api_base + "?" + a.join("&").toLowerCase()
})
}
}
},
Event: {
stat: function (a, b) {
if ("" != MTA_CONFIG.event_id) {
var c = [],
d = getMainInfo(),
e = getExtentInfo();
d.dm = "wxapps.click";
d.url = a;
e.r2 = MTA_CONFIG.event_id;
var f = "undefined" === typeof b ? {} : b;
var k = [],
g;
for (g in f) f.hasOwnProperty(g) &&
k.push(encodeURIComponent(g) + "=" + encodeURIComponent(f[g]));
f = k.join(";");
e.r5 = f;
f = 0;
d = [d, e, getBasicInfo(), {
rand: +new Date
}];
for (e = d.length; f < e; f++)
for (var h in d[f]) d[f].hasOwnProperty(h) && c.push(h + "=" + ("undefined" == typeof d[f][h] ? "" : d[f][h]));
wx.request({
url: MTA_CONFIG.api_base + "?" + c.join("&").toLowerCase()
})
}
}
},
Data: {
userInfo: null,
lanchInfo: null
}
};
module.exports = MTA;
注意:为了方便调用,我们将放在项目脚本目录下,对应的还要添加前缀,如下
assets
--zqddn_zhb
--script
--zqddn_zhb_mta_analysis.js
2.3.在你的项目的脚本中添加统计数据逻辑
zqddn_zhb_Common.js--------------------
module.exports = {
checkFunnelMode: function(type){ //检查漏斗模型
if(this.mta == null) return;
if(type == 0){ //进入首页
this.mta.Event.stat(this.channel,{'home':'true'});
}else if(type == 1){ //进入选择关卡界面
this.mta.Event.stat(this.channel,{'selectlevel':'true'});
}else if(type == 2){ //进入第1关
this.mta.Event.stat(this.channel,{'level1':'true'});
}else if(type == 3){ //进入第3关
this.mta.Event.stat(this.channel,{'level3':'true'});
}else if(type == 4){ //进入第10关
this.mta.Event.stat(this.channel,{'level10':'true'});
}
},
});
zqddn_zhb_Start.js--------------------
var common = require('zqddn_zhb_Common');
cc.Class({
onLoad: function(){
//腾讯移动分析
this.WXAnalysis();
if(cc.sys.platform === cc.sys.WECHAT_GAME){ //微信平台
this.scheduleOnce(function(){
//统计数据
common.mta.Event.stat('weidu',{'totaluser':'true'}); //进入游戏总人数
common.checkFunnelMode(0); //漏斗模型
}, 1); //延迟1秒
}
},
WXAnalysis: function(){ //腾讯移动分析
if(!(cc.sys.platform === cc.sys.WECHAT_GAME)) return; //微信平台
var options = wx.getLaunchOptionsSync();
common.mta = require('zqddn_zhb_mta_analysis');
common.mta.App.init({
"appID": "500212226", //这里的数字只用于演示,实际使用的appID请询问运营或策划
"eventID": "500622235",// 高级功能-自定义事件统计ID,配置开通后在初始化处填写
"lauchOpts": options, //渠道分析,需在onLaunch方法传入options,如onLaunch:function(options){...}
"statPullDownFresh": true, // 使用分析-下拉刷新次数/人数,必须先开通自定义事件,并配置了合法的eventID
"statShareApp": true, // 使用分析-分享次数/人数,必须先开通自定义事件,并配置了合法的eventID
"statReachBottom": true // 使用分析-页面触底次数/人数,必须先开通自定义事件,并配置了合法的eventID
});
common.mta.Page.init();
//获取query参数;
if (options.query.scene || options.query.source){
var $obj = options.query;
for(var key in $obj){
var $key = key,
$item = $obj[$key];
common.channel = $item;
if(common.channel != null){
common.mta.Event.stat("merchants", {[$key]: $item});
}
}
}
if(common.channel == null){ //若query中取不到数据
if (options.referrerInfo != null && options.referrerInfo.extraData != null && (options.referrerInfo.extraData.scene || options.referrerInfo.extraData.source)){
var $obj = options.referrerInfo.extraData;
for(var key in $obj){
var $key = key,
$item = $obj[$key];
common.channel = $item;
if(common.channel != null){
common.mta.Event.stat("merchants", {[$key]: $item});
}
}
}
if(common.channel == null){ //若没有渠道,则默认使用统计自身的漏斗
common.channel = "zuiqiangdedanao";
}
}
},
});
zqddn_zhb_Game.js--------------------
onTipBtn: function() { //提示按钮
if(common.keyCount > 0){
//统计数据
if(cc.sys.platform === cc.sys.WECHAT_GAME){ //微信平台
common.mta.Event.stat('weidu',{'tips': common.currentLevel}); //按关卡统计点击提示的人数
}
}
},
2.4.设置到你的项目的腾讯移动分析管理页面
(1)创建统计渠道的事件
默认是在“基础分析”分页。展开左侧的“自定义事件”,点击“事件列表”,点击新增事件,
在弹出窗口,输入事件ID为 merchants,
输入事件名称为 商家。
点击“保存”按钮,这样就创建了一个事件。
然后,还要给这个事件添加参数,点击“参数配置”,再点击“新增参数”,
在弹出窗口,输入如下的参数ID和参数名称:
source 链接
scene 二维码
这样,一个统计不同渠道进入游戏的事件就定义完了。
命名规则:
a.事件名称为中文英文数字下划线;
b.事件ID为英文数字;
c.参数名称为中文英文数字;
d.参数ID为英文数字;
e.参数取值为可以是任意字符(建议中文)
mta.Event.stat("ico_search", {"query":"特斯拉"});//这里要统计一个搜索事件
(2)创建统计游戏中玩家行为的事件
同前面创建渠道一样,创建如下事件:
weidu 游戏关卡维度
然后,创建如下参数:
totaluser 进入游戏总人数
levelwin 通关人数
tips 点击提示按钮的人数
helpshare 求助按钮人数
shopshare 挑战群友
watchvideos 观看15秒视频
其中,在项目中发levelwin、tips、helpshare的事件消息时,需要传关卡序号,以区分玩家是在哪一关。
(3)创建漏斗
同前面创建渠道一样,创建漏斗
qudao1
home 进入首页
selectlevel 进入选择关卡界面
level1 通过第1关
level3 通过第3关
level10 通过第10关
这里,在程序中渠道名要对应qudao1。
且漏斗的数据要第2天才可以看到。
另外,注意前面的代码中有“若没有渠道,则默认使用统计自身的漏斗”,这表示你应该创建一个测试用
漏斗,可以在接入渠道之前确定是否代码有问题。
3.实际中的经验
(1)在创建漏斗时,设置的事件名字必须是16个字符以内,对应代码中埋点时发送的事件名字。
(2)运营人员需要去整理统计数据到excel中,因此在创建自定义事件时要方便运营人员复制数据。
我采用是直接创建事件,不创建子事件。这样,运营只点击事件的查看,就可以直接看到按日期排的每天的点击数。
如下:
事件ID 事件名称
2guanqia4 求助按钮
common.mta.Event.stat('2guanqia4',{}); //腾讯统计-求助按钮
(3)创建的事件删不掉。请谨慎添加事件。