美文网首页
js 代码埋点总结

js 代码埋点总结

作者: small_zeo | 来源:发表于2022-03-11 19:22 被阅读0次
用户行为分析

随着互联网发展,企业对于网站的PV、UV、用户的转化、新增和留存也越来越关注。而完整的数据采集是一切的前提。

埋点即监控用户在应用表现层的行为,于产品迭代而言至关重要,运营,产品,数据分析基于此来对用户行为进行分析统计,同时埋点也可作为一种前端监控的手段,检验功能是否达预期的佐证。

基于埋点数据进行用户行为分析,可以得到包含页面点击量、用户访问量、用户访问路径、用户转化率、导流转化率、用户访问时长和用户访问内容分析等重要数据。

可埋点数据

  • ac- 页面标识
  • cc- 渠道标识
  • ce- 浏览器是否支持cookie (ce = window.navigator.cookieEnabled ? true : false)
  • cp- 当前页面地址 (cp = window.location.href)
  • cpp- 当前页面携带参数 (cpp = window.location.search)
  • ec- 页面组件标识(即 elementCode)
  • et - 事件类型
  • etm- 触发时间
  • fp- 来源页面地址 (fp = document.referrer)
  • itm- 进入时间
  • lb- 浏览器语言 (lb = navigator.language)
  • mp- 鼠标轨迹坐标((screenX,screenY)
  • nb- 浏览器名称
  • nt- 网络状态(1-wifi,2-2G,3-4G,4-5G)
  • otm- 离开时间
  • pf- 浏览器操作系统平台
  • ph- 手机号
  • pi- 网络IP
  • sn- 浏览器屏幕分辨率 (sn = '${window.screen.width },${window.screen.height}')
  • tp- 目标页面(跳转页面)
  • ua- 浏览器userAgent (ua = navigator.userAgent)
  • vb- 浏览器平台版本

代码埋点

代码埋点也叫手动埋点属于侵入式埋点,由开发手动在代码内植入预埋点,完全由开发控制埋点的位置时间和触发机制。

  • 基于事件点击埋点
  • 页面访问埋点-统计页面曝光时长
  • css埋点
<style>
.tracker:active::after{ 
    content: url("http://www.yzw.com/api/tracker/report?action=yourdata"); 
}
</style>
<a class="tracker">发埋点数据</a>

埋点数据上报的形式:

  • xhr上报
    适用于需要接受数据上报后的返回结果进行回调处理
  • img/script上报
    使用img标签上报埋点数据,可以较隐蔽的上报埋点数据,而不是直接将ajax请求的接口直接暴露给控制台。
    // 1.img标签
    var img = document.createElement("img");
    img.src = '/api/report?' + params; 
    // 2.script标签
    var script = document.createElement("script");
    script.src = src;
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(script);

如下示例,使用img标签实现埋点数据上报,url拼接的参数需要使用encodeURIComponent方法转译一下(防止特殊字符影响请求参数丢失):

                submitLog (query) {
                    let logQuery = Object.assign(this.trackLogObj, query)
                    let url = '/api/report?'
                    let paramsArr = []
                    Object.keys(logQuery).forEach(key => {
                            let str = key + '=' + encodeURIComponent(logQuery[key])
                            paramsArr.push(str)
                    })
                    url += paramsArr.join('&')

                    let img = document.createElement('img');
                    img.src = url
                },
<button @click='submitLog'>上报埋点数据</a>
image.png

本地已经做了跨域代理,直接通过图片src的方式对后端接口发送了请求,从而实现了埋点日志的上报功能。

部分获取参数方法

  • 获取IP地址
                getIPs() {
                        let IP = ''
                        var ip_dups = {};
                        var RTCPeerConnection = window.RTCPeerConnection
                                || window.mozRTCPeerConnection
                                || window.webkitRTCPeerConnection;
                        if (!RTCPeerConnection) {
                                var iframe = document.createElement("iframe");
                                iframe.sandbox = "allow-same-origin";
                                iframe.style.display = "none";
                                document.body.appendChild(iframe);
                                var win = iframe.contentWindow;
                                window.RTCPeerConnection = win.RTCPeerConnection;
                                window.mozRTCPeerConnection = win.mozRTCPeerConnection;
                                window.webkitRTCPeerConnection = win.webkitRTCPeerConnection;
                                RTCPeerConnection = window.RTCPeerConnection
                                        || window.mozRTCPeerConnection
                                        || window.webkitRTCPeerConnection;
                        }
                        var mediaConstraints = {
                                optional: [{RtpDataChannels: true}] };
                        if(window.webkitRTCPeerConnection)
                                var servers = {iceServers: [{urls: "stun:stun.services.mozilla.com"}]};
                        var pc = new RTCPeerConnection(servers, mediaConstraints);
                        pc.onicecandidate = (ice) => {
                                if(ice.candidate){
                                        var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3})/
                                        var ip_addr = ip_regex.exec(ice.candidate.candidate)[1];
                                        if(ip_dups[ip_addr] === undefined)
                                                IP = ip_addr
                                        ip_dups[ip_addr] = true;
                                }
                        }
                        return IP
                },
  • 获取操作系统
                getOS() {
                        var sUserAgent = navigator.userAgent;
                        var isWin = (navigator.platform == "Win32") || (navigator.platform == "Windows");
                        var isMac = (navigator.platform == "Mac68K") || (navigator.platform == "MacPPC") || (navigator.platform == "Macintosh") || (navigator.platform == "MacIntel");
                        if (isMac) return "Mac";
                        var isUnix = (navigator.platform == "X11") && !isWin && !isMac;
                        if (isUnix) return "Unix";
                        var isLinux = (String(navigator.platform).indexOf("Linux") > -1);
                        if (isLinux) return "Linux";
                        if (isWin) {
                                var isWin2K = sUserAgent.indexOf("Windows NT 5.0") > -1 || sUserAgent.indexOf("Windows 2000") > -1;
                                if (isWin2K) return "Win2000";
                                var isWinXP = sUserAgent.indexOf("Windows NT 5.1") > -1 || sUserAgent.indexOf("Windows XP") > -1;
                                if (isWinXP) return "WinXP";
                                var isWin2003 = sUserAgent.indexOf("Windows NT 5.2") > -1 || sUserAgent.indexOf("Windows 2003") > -1;
                                if (isWin2003) return "Win2003";
                                var isWinVista= sUserAgent.indexOf("Windows NT 6.0") > -1 || sUserAgent.indexOf("Windows Vista") > -1;
                                if (isWinVista) return "WinVista";
                                var isWin7 = sUserAgent.indexOf("Windows NT 6.1") > -1 || sUserAgent.indexOf("Windows 7") > -1;
                                if (isWin7) return "Win7";
                                var isWin10 = sUserAgent.indexOf("Windows NT 10") > -1 || sUserAgent.indexOf("Windows 10") > -1;
                                if (isWin10) return "Win10";
                        }
                        return '';
                },
  • 获取网络类型
                getNetworkType() {
                        var ua = navigator.userAgent;
                        var networkStr = ua.match(/NetType\/\w+/) ? ua.match(/NetType\/\w+/)[0] : 'NetType/other';
                        networkStr = networkStr.toLowerCase().replace('nettype/', '');
                        var networkType;
                        switch(networkStr) {
                                case 'wifi':
                                        networkType = 1;
                                        break;
                                case '4g':
                                        networkType = 4;
                                        break;
                                case '3g':
                                        networkType = 3;
                                        break;
                                case '3gnet':
                                        networkType = 3;
                                        break;
                                case '2g':
                                        networkType = 2;
                                        break;
                                default:
                                        networkType = 0;
                        }
                        return networkType
                },
  • 获取浏览器
                getBrowser() {
                        var UserAgent = navigator.userAgent.toLowerCase();
                        var browser = null;
                        var browserArray = {
                                IE: window.ActiveXObject || "ActiveXObject" in window, // IE
                                Chrome: UserAgent.indexOf('chrome') > -1 && UserAgent.indexOf('safari') > -1, // Chrome浏览器
                                Firefox: UserAgent.indexOf('firefox') > -1, // 火狐浏览器
                                Opera: UserAgent.indexOf('opera') > -1, // Opera浏览器
                                Safari: UserAgent.indexOf('safari') > -1 && UserAgent.indexOf('chrome') == -1, // safari浏览器
                                Edge: UserAgent.indexOf('edge') > -1, // Edge浏览器
                                QQBrowser: /qqbrowser/.test(UserAgent), // qq浏览器
                                WeixinBrowser: /MicroMessenger/i.test(UserAgent) // 微信浏览器
                        };
                        for (var i in browserArray) {
                                if (browserArray[i]) {
                                        browser = i;
                                }
                        }
                        return browser;
                },

参考链接

前端埋点总结

相关文章

  • js 代码埋点总结

    用户行为分析 随着互联网发展,企业对于网站的PV、UV、用户的转化、新增和留存也越来越关注。而完整的数据采集是一切...

  • 【用户行为采集】(一)常见埋点方式及对比

    常见的埋点方式主要有三种:代码埋点、全埋点、可视化埋点。 代码埋点 代码埋点是最经典埋点方式,实施埋点的研发将埋点...

  • iOS全埋点实践

    客户端埋点大概分为三类: 代码埋点 可视化埋点 无埋点 1、代码埋点 代码埋点,即在需要埋点的节点调用接口直接上传...

  • 无侵入埋点、日志监控方案怎么实现?

    手写代码埋点的优缺点 代码埋点主要就是通过手写代码的方式来埋点,能很精确的在需要埋点的代码处加上埋点的代码方便调试...

  • iOS 不侵入工程代码埋点统计技术

    概念 代码埋点: 通过手写代码的方式进行埋点。代码埋点存在高度耦合、依赖发版、无法动态更新、容易误删、重复埋点等问...

  • 零侵入“无埋点”技术

    最近看了《揭开JS无埋点技术的神秘面纱》这篇文章,主要是讲解“无埋点”收集用户行为数据的技术要点,作者在最后总结时...

  • 项目收集埋点

    我们现在的项目中代码埋点主要就是通过手写代码的方式来埋点,能很精确的在需要埋点的代码处加上埋点的代码,可以很方便地...

  • JSPatch下发笔记10

    OC代码: JS代码: 总结:NSForegroundColorAttributeName 在js中要写成"NSC...

  • RunTime实现无侵入全局埋点

    无埋点,不是不需要埋点,更确切地说是“全埋点”,只是埋点代码不会出现在业务代码中优点:容易管理和维护。并且可移植性...

  • 如何做好数据埋点

    一、埋点技术 代码埋点: 所谓的代码埋点就是在你需要统计数据的地方植入N行代码,统计用户的关键行为。比如你想统计首...

网友评论

      本文标题:js 代码埋点总结

      本文链接:https://www.haomeiwen.com/subject/yzlhdrtx.html