前端埋点,用户行为记录分析(vue.js为例)

6,566 阅读4分钟

首先,本人水平有限,也是第一次接触埋点统计用户行为(额,也许我这个不叫埋点)。

下文只是我自己在实践中的一些想法和记录,还请大家指导。

1.项目背景

项目是一个聚合类的webapp,基于vue开发提供电影,商城,资讯等服务。

部署在定制的硬件盒子上,用户在一定区域内连上盒子wifi即可享受服务。

2.要采集哪些信息?

根据项目,我把采集的信息分为以下5类:

用户基础信息,电影访问信息,商品访问信息,资讯访问信息,其他

后期是想做成可视化平台的,主要想实现:

1.某一时间段内新用户变化

2.用户设备基础信息

3.某一时间段内某一电影的点击数量,总观看时常

4.某一时间段内某一商品点击数量,总浏览时长

2.1用户设备信息,主要包括以下字段

{
    browse_type: xxxx,                      //分类id
    screen_resolution: xxxx,               //屏幕分辨率
    system: xxxx                           //操作系统类型
    mobile_phone_brand: xxx                //手机品牌
    mobile_model: xxxx                     //手机型号
    browser: xxx                          //浏览器名称
    browse_point: xxxx                    //web指纹
    ...
}

这些信息在用户接入后像后台发送一次

其中,操作系统,手机品牌,手机型号,浏览器名称等都是通过User-Agent获取的

对User-Agent的解析还是有些复杂的,在对比了几个开源的解析项目后,我选择了

github.com/faisalman/u…

在上面的字段中还有一个web指纹字段,一开始我想要一个确定用户唯一性的字段

但是由于我们项目的特殊性,除了商城下单需要注册,其他资源只要接入wifi就可以访问,无需注册

最后我选择了web指纹这一技术 (暂时替代,这技术好像有坑)

获取web指纹后存储在cookie中,之后每次上传数据都带上该字段

web指纹的一个实现(网上抄的)

export default function createFingerprint (domain) { // 生成浏览器指纹
  var fingerprint
  function bin2hex (s) {
    let i, l, n
    let o = ''
    s += ''
    for (i = 0, l = s.length; i < l; i++) {
      n = s.charCodeAt(i)
        .toString(16)
      o += n.length < 2 ? '0' + n : n
    }
    return o
  }

  let canvas = document.createElement('canvas')
  let ctx = canvas.getContext('2d')
  let txt = domain || window.location.host
  ctx.textBaseline = 'top'
  ctx.font = "14px 'Arial'"
  ctx.textBaseline = 'tencent'
  ctx.fillStyle = '#f60'
  ctx.fillRect(125, 1, 62, 20)
  ctx.fillStyle = '#069'
  ctx.fillText(txt, 2, 15)
  ctx.fillStyle = 'rgba(102, 204, 0, 0.7)'
  ctx.fillText(txt, 4, 17)

  let b64 = canvas.toDataURL().replace('data:image/png;base64,', '')
  let bin = atob(b64)
  let crc = bin2hex(bin.slice(-16, -12))
  fingerprint = crc
  Cookie.set('webPoint', fingerprint)
  return fingerprint
}

2.2电影访问信息,主要包括以下字段

观看的电影id,在某一电影页面停留时间,进入退出页面时间

{
      browse_type: xx,        //分类id
      movie_id: xxx,         //电影id
      browse_time: xx,       //浏览时间
      start_time: xx,        //进入页面时间
      end_time: xxx,        //离开页面时间
      browse_point: xxx     //web指纹
}

这些信息的获取我通过vue的路由钩子实现

每次跳转时候有from和to对象,里面包含着路由信息,可以取到id

浏览时间我通过两次的router.beforeEach生成的时间戳相减获得

流程大致是这样的:

1.用户从电影列表页跳到电影id为1的观看页面开始看电影,跳转前获得时间戳t1和跳转电影的id

2.看了一会电影后用户跳转到其他页面跳转前获得时间戳t2

3.t2-t1就相当于用户在电影id为1的观看页面停留的时间(可大致等效为该电影观看时长)

代码实现:

//时间戳队列,每次只有两个
var time = []
router.beforeEach((to, from, next) => {
  let startTime = new Date().getTime()
  if (time.length < 2) {
    // 模拟队列,保证队列中每次只有两个元素
    time.push(startTime)
  }
  if (time.length === 2) {
    //某一页面停留时间
    let browse_time = time[1] - time[0]
    //相同的字段
    let baseRes = {
      browse_time: browse_time,
      start_time: time[0],
      end_time: time[1],
      browse_point: Cookie.get('webPoint')
    }
    
    //如果当前页面是电影播放页
    if (from.name === 'videoPlay') {

      //电影页面采集信息自有逻辑处理,发送请求
      
    } else if(){
    
         //商品页面采集信息自有逻辑处理,发送请求
         
    } else {
        
        // 其他不重要的页面就传一个url了
        
    }
    
    //模拟队列,保证时间队列中每次只有两个
    time.shift()
  }
  next()
})

3.思考

以上就是我实现的简单的关于用户信息的收集,个人感觉还是很不完善

其实在动手自己实现前也查了不少关于前端埋点的解决方案,主要是:代码埋点,可视化埋点,全埋点

然而大多数文章只提了概念很少有详细例子,我也感觉无从下手

关于埋点这块还请大家多多指教,关于我自己的项目中实现的数据上报也希望大家多多吐槽

一只小菜鸟,今天开始写文章,排版不好大家多多见谅 (●′ω`●)