前段时间,我经常收到招商银行信贷部的电话,本来我都是直接挂掉的,但是有一天打了好几次,我终于忍不了了,接起来问:“能不能不要再给我打了?说了不需要不需要!“,对方的回答却让我有些惊讶,甚至有被羞辱的感觉: “真的不需要吗?真的不需要吗?“。我再次强调:“真的不需要!“。然后对方说:“我这里看到你最近在招行 APP 里浏览了e招贷页面,猜想您可能有资金方面的需要,我们现在有xxx优惠,最高给您开到xx万,都是随借随还的…… “。我:“…“”。
有一次,一个活动做完之后,运营同学拿着两张数据报表来问我:“为什么我们的数据跟外部的数据有这么大的差异呢?”。我反问:“你确定两边的数据统计口径一致吗?”。运营同学答:“一致呀,都是用户访问量呀!”。我:“我的意思是,你的访问量是按照什么计算的?怎样才算是一个访问呢?即使统计口径一致,埋点和上报方法也有区别… blabla”。说完这些我猛然发现,这不是“人话“啊,怎么样才能把这些转换成谁都能听懂的“人话“呢?我陷入了沉思。
那么,通过这两个小故事,我们得到了哪些信息呢?首先,我们在互联网上的一切动作,都可能有人在观察、记录、分析、预测。其次,大部分人并不知道,我们在上网时的信息和行为是如何暴露的,即使知道概念,也未必清楚细节。因为细节是魔鬼,而且说出来也很难被理解。因此,笔者认为有必要对基本的用户数据埋点采集原理进行一些讲解,让大家了解我们在互联网上,到底会暴露哪些数据,这些数据会对我们产生怎样的影响。
若要了解我们会暴露哪些数据,首先要知道我们的“敌人”有哪些能力。我将其分为四部分来讲,其中数据权限也算是软件能力的一种,差别在于需要用户的授权才能拿到。许多硬件能力也都是要用户授权使用的,只是有时候授权的提示过于复杂,容易混淆视听,不小心授权了你完全不理解的东西。
硬件能力硬件能力包括设备能做的一切事情,这里的设备,可以是个人电脑、服务器、智能手机,以及其他智能设备等。那么,以个人电脑为例,它可以联网、办公、打游戏等等。用户的所有行为,都可能被记录,并通过网络发送到远程的某台服务器进行分析。这个大家是知道的。
如果是智能设备,能做的就更多了。比如摄像头、麦克风、陀螺仪、GPS、NFC 、蓝牙、WiFi 等等,都是硬件提供的能力。有了硬件基础,软件才能通过驱动程序获取这些硬件提供的信息,进入下一步的处理逻辑。
常见的智能设备有:手机、笔记本、iPad、ATM、自动售货机、快递柜、智能家居、智能水杯、智能手环,智能汽车等等。那么你可以思考一下,这些设备平时都具有哪些能力,可能采集你的什么信息?
硬件基础为软件提供了基础能力,比如计算能力、存储空间、联网能力等等。智能设备中的软件也可以操作摄像头、麦克风等,甚至是在用户不知情的情况下开启。比如前段时间某 APP 偷偷打开用户摄像头暴露的事件。
我们也会在影视作品中看到用户电脑或手机被黑客攻击之后,摄像头被偷偷打开,记录了用户的隐私影响,并以此要挟用户的事件。再如美剧《CSI 网络犯罪调查》中,黑客通过黑进用户的网络摄像头,长期观察用户日常生活习惯,终于找到机会在父母不知情的情况下,偷走了摄像头中的宝宝。这些,都是软件能力的体现。
黑客离我们的生活还比较遥远,普通用户最常接触到的就是前面提到的智能设备为软件提供的这些能力了。除了这些之外,用户在操作软件时的行为,大部分也是可以被识别记录的,比如触摸、滑动、点击、摇一摇、横竖屏、截屏等。只要软件能有反应,就说明有程序接口可以响应,就可以被记录。
还有 PC 上最常见的鼠标点击,可以全局记录鼠标的任何点击,哪怕只是你手指抽筋在空白处随便点了几下。把这些点击数据汇总起来,叠加到界面上,就成了点击热力图:
除了鼠标点击之外,你晃鼠标,屏幕上的箭头就动,那么如果有需要的话,你的整个鼠标轨迹都是可以被记录的。有些人的手是随心而动,可能某个瞬间想看哪里,鼠标箭头就跟了过去,然后思考一下又放弃了。那么根据整个鼠标轨迹,你发现用户明明对这部分内容产生了兴趣,但是停留几秒,又移走了,那么就可以分析一下,是不是这部分内容设计得不够吸引人,诸如此类。
正常的情况下,对于摄像头、麦克风、GPS 等涉及隐私的能力,系统会询问我们是否允许获取这个能力。然而,极端情况下的黑客攻击,我们是无法阻止的。此外,很多人在授权这些能力的时候,其实并不清楚会带来怎样的后果。就像是你不知道勾选了“同意xxx用户使用协议”意味着什么一样。
举个例子,手机相册的授权请求,往往都是要求读写权限,比如各种 P 图 APP。写权限好理解,就是它可以存照片到我的手机里;那么读权限呢?有没有可能在你不知情的情况下扫描所有照片,分析你的生活习惯呢?
即使没有,你只是单纯地上传了一张自拍,这意味着什么? a. 设备信息、用户信息、可能还有其他信息,与你这张脸绑定了,大概率照片中的人就是设备主人; b. 除了脸之外,照片中可能有其他重要信息。比如背景中标志建筑,门牌号,店铺名,这暴露了你的身份和位置; c. 照片的元信息中可能存储了拍摄时间、地点等重要信息; d. 更夸张一点,你的瞳孔倒影、墨镜反光、或者其他细微之处的影像,也可能暴露重要信息。
大家可能听过“社会工程学”(Social Engineering,又被翻译为:社交工程学),就是通过这些蛛丝马迹,再加上一些非技术手段,来获取某个人的隐私信息的。而授权这些数据权限,可能就是个开始。
再比如,有的人可能接到过催债短信,但短信里的人并不熟悉,只是有点印象。这其实是以往办事需要,存储了某人的手机号,而这个人恰好使用了某些网贷 APP,并且逾期没有还款。然后网贷公司就会批量地向这个人的通讯录好友发送短信,而你恰好就在其中。
有些时候,我们的数据泄露并不是被动的,而是我们主动把数据交给了别人,然后我们的数据又被滥用导致。比如,买房之后很长一段时间,都会收到各种中介的骚扰。甚至不需要买房,只是手机注册了某个房产 APP,然后你的手机号就会在房产圈一遍一遍倒卖,甚至可以持续好几年。
再比如,淘宝上有个经典的骗局,就是一分钱抢购。用户下单之后,卖家就可以拿到用户的姓名、手机、收货地址了。这样骗到几百上千个信息后,活动下线。那么就拿到了一份非常有价值的信息,然后再以每条几毛到几元的价格出售即可盈利。类似的,大部分快递物流的纸质单据上,都有明确的姓名手机和住址,这在以前可能不是什么问题,但是互联网时代就不一样了,快递员用心记录下来,都可以拿这个数据卖钱。什么?手写太麻烦?有 OCR 拍照识别啊~
要求上传身份证的,就更要小心了,要知道很多办事流程只要身份证扫描件或复印件即可。那么一旦你的电子版身份证流出,就可能出现新闻里说的,莫名其妙多了 N 张信用卡,甚至身份被顶替的事件。
前面讲述了一些基本的能力,和典型的用户行为记录,那么设备记录这些数据之后,如何上报给服务端呢?也就是说,你的数据是怎么被别人“拿走”的呢?下面,我们就来看看目前主流的数据埋点及上报技术有哪些。
我们可以按照自动化程度,将埋点方法分为三类,即手动埋点、半自动埋点、全自动埋点。所有的埋点方式,都要包含基础代码。在 APP 中,一般称为 SDK(Software Development Kit),在网页中也可以有 SDK,或者就是一段通用的统计代码片段。除此之外的自动化程度,才是它们之间的差异所在,下面逐个进行讲解。
手动埋点也叫代码埋点,那么是谁手动呢?当然是开发哥了。根据需求的不同,开发哥在某个 APP、小程序、网页中进行埋点。其基本原理,就是为界面中的某个元素(按钮、图片、视频等)绑定一个事件,即前文提到的触摸、点击等事件。然后再用户执行这些动作的时候,就可以通过程序捕捉到,并记录下来,上报给服务器。下面是(你能看懂的)伪代码示意:
<button onclick=“send_data_to_server (‘按钮被点击‘) ”>按钮</button>
如果把执行的动作写到每个元素中,显然是不科学的,我们可以把上报的逻辑抽离出来,而只是为这个元素分配一个标记:
<button data-tag=“12345”>按钮</button>
然后在程序的公共逻辑中监听特定的事件,并将对应元素的动作上报:
if ( event.type == ‘click’ ) { send_data_to_server ( ’触发事件的元素的 tag’ );}
当按钮被点击时,公共的上报程序将按钮的 tag 上报给服务器,服务器就可以根据这个预先埋好的 tag 来识别这个元素。
手动埋点方式是最原始,也是定制程度最高的,可以根据需求完全定制。缺点就是开发周期长,需求变更时不够灵活。
许多埋点工作其实是重复劳动,并且有共同的特征可以抽离,那么必然可以工具化或自动化。但这个过程既要保证系统的便利性,又要保留一定的扩展性,于是就有了所谓半自动的埋点。
顾名思义,这种方式有实现了某种程度的自动化,不完全需要编码。但是需要人工干预,比如设置参数、修改配置等。那么原理其实也很简单,我们只需要把识别和定义元素的 tag 部分,抽离成可以配置的信息即可:
<button data-tag=“{{ 可以配置的部分 }}”>按钮</button>
那么具体如何配置,这个配置如何应用到代码中,就是程序员小哥的工作了。目前有些数据统计平台提供了可视化的埋点技术,其实就是在这一层前面加了可视化的界面,让操作人员可以更方便地选到这些元素,然后系统再把这些配置整合到程序中即可。
全自动埋点,也叫无埋点,无痕埋点。从名字上来看,就是完全自动化,什么都不需要做。然而事实并非如此。前面提过,所谓全自动埋点,也是要在应用中要包含基础代码的。差别在于,这种方式只需要包含基础代码,不需要额外的开发。
其原理,就是将用户的一切可捕获的行为上报,然后由产品人员自己决定关注哪些数据。或者是由产品运营人员自己定义事件,决定要监测哪些元素或用户行为,然后保存配置即可。这样,其实就回到了 2.2 的半自动可视化埋点状态了。据说可视化埋点是可以解放程序员的。当然,这只是理想状态,不然程序员就都失业了。涉及到业务属性的数据,如订单号、金额、商品数据等需要调接口的埋点,可视化埋点就无法支持了。此外,由于各个端的代码结构各不相同,也未必都能可视化获取所有元素,这也是可视化埋点的局限性。
总而言之,可视化埋点只是个辅助能力,重点就在于可视化。能够满足一部分需求,解放部分生产力。但是稍微复杂一些的埋点,还是需要编码来完成。
前面阐述了客户端的埋点技术,下面再来介绍一下主流的上报技术。
无论是 APP 还是浏览器,我们都可以统一称作客户端。大多数情况下,客户端是通过 HTTP 请求,将数据上报给服务器的。APP 或桌面软件使用相应的程序语言发送请求,而网页一般使用 Javascript 脚本语言发送请求。
这个过程可能发生在用户刚刚进入界面时,也可能发生在用户离开界面之前,或者用户执行某个动作时上报,或者在用户无感知的情况下间歇性上报。
具体的上报时机选择各有利弊,需要在统计的实时性、服务器压力、数据的准确性之间进行权衡。比如,如果把数据攒一部分再上报,虽然效率提高了,服务器压力也小了,但是丢数据的风险就提高了。
这里可以解释有些时候数据为什么会不准确,因为客户端上报是要通过网络发送请求的,请求过程可能会丢失数据,称作丢包。再比如极端情况下,客户端刚想发送数据到服务器,但是网络突然断掉了,这时候如果联网时没有重试机制,或者不再联网,那这部分数据必然是统计不到了。
如果是网页端的 Javascript 脚本上报,还会存在比如页面的其他业务逻辑出错导致脚本不再执行,或者页面关闭前 onbeforeunload 事件未执行等等。总之,要接受一定程度的上报误差,只要误差在可容忍的范围内即可。
在网页中,用户首次看到的一切,都是从服务器返回的(APP 不同,因为部分界面和逻辑已经安装在了用户的设备上,展示这部分界面不需要网络请求)。那么服务器在应答你的客户端请求的时候,也能拿到一些基本信息,比如你的浏览器类型、版本号、屏幕分辨率、IP 地址等等。这些也可以作为基本的分析数据,比如业务中的网页到底要兼容哪些设备,就可以先参照一下这些统计数据,看看是否要放弃兼容那些占比非常小的浏览器或设备。
这些数据有部分是可以通过页面中的脚本语言获取,再“异步”上报给服务器的。所谓“异步”,即并非在你访问网页的瞬间执行,而是有延后,异步执行的逻辑。除了服务器能获得的这些基本信息外,其他信息都要通过上文阐述的埋点技术获取,并异步发送给服务器记录了。
这里讲的识别分析方法,还没有到数据分析层面。只是对于上报的零散数据有一个基本的认识。
前面讲过,设备的基本信息是可以获取的,但是也可能被伪造。那么到底怎样才算是一个真实的设备呢?常用的办法,就是为每一个设备分配一个唯一的 ID,至于这个 ID 叫什么就无所谓了。比如友盟的设备唯一 ID 叫做 UMID,其定义为:新增用户以 UMID 作为唯一设备识别,UMID 是基于友盟+自己的设备 ID 生产算法,在 APP 的生命周期保持稳定性和唯一性。而 TalkingData 的设备唯一 ID 为 TDID,TDID 是基于 SDK 获取的设备信息以及常量参数并结合 TD 的加密方案生成一台设备的标识,以便持久化来保持设备的唯一性。
从上面一段话我们可以发现,各家都是拥有自己独特的生成算法的。为什么这样呢?答案就是,普通的算法太容易被伪造,只能绞尽脑汁想出不易被破解的算法,才能真正识别出真实的唯一设备。
至于具体的算法,基本都是依赖设备的 MAC 地址,以及其他辅助信息生成的,具体不展开。
同理,用户如果不加足够的验证条件,也是很容易被伪造的。因此,就要有针对用户的唯一性判断。我们可以为用户也分配一个唯一 ID,可以叫 uid,uuid,unionId 什么都可以。那么,这个唯一当然是理想状态,根据具体实现不同,我们能做到应用内唯一,业务内唯一,跨业务唯一,全网内唯一等等。
网站数据统计中常说的 UV(Unique Visitor)独立访客,就是指这个唯一用户的访问计数。而 PV (Page View)访问量,就是用户每次打开某个页面的计数。那么,要想定义 UV,首先要看你定义的用户,是在什么范围内的唯一用户,即对你来说,满足哪些条件才能称为一个用户。这个条件可以是唯一的手机号,唯一的微信 unionId,唯一的设备 ID,你自己的系统生成的唯一 ID 等等。关于如何识别唯一用户,后面我会单独写文章介绍,本文先说到这里。
用户行为分析这个概念很大,这里简单介绍几个概念和原理。方便大家理解基本的用户行为分析是怎样实现的。
前面介绍过鼠标事件的记录原理,那么鼠标轨迹记录也很简单了,只要检测到鼠标移动,就把当前的位置记下来,再择机发送给服务端即可。
鼠标轨迹的意义,在于看出用户的纠结与彷徨,思考过程中手部下意识的移动,和真的挪过去又放弃点击,都可以在一定程度上,根据鼠标位置和间隔及停留时间推测出来。
我们都知道用户的浏览顺序是有统计规律的,所以一般网页的核心信息架构都设计成 F 形。但是用户端没有眼动仪,要想追踪用户的浏览过程是不可能的,除非你黑掉用户的摄像头。此时,鼠标轨迹的意义就是帮助分析用户的思考过程,属于用户研究的范畴。
鼠标轨迹再结合停留时间,就成了一副抽象派的艺术作品,用来做艺术创作也是不错的:有些时候,我们不仅希望知道用户在某个页面是怎么操作的,还希望知道用户在整个网站或应用中的操作流程是怎样的,具体从哪个界面跳到了哪个界面,最后在哪里转化,在哪里离开的。然后再根据这些数据优化网站或应用的的关键路径,提高转化率。
上文提到过单个 tag 的上报原理,那么若想记录路径,就需要记录多个节点或操作。这些操作可能是在一个网站或应用中,也可能跨越了不同的网站和应用。无论哪种形式,都要保证这个数据可以一直传递下去,才有可能记录路径。比如,如果是不同网站之间的传递,可能就需要通过在网址后面附加参数来实现:具体流程如下:
?rel_id=page_1,page_2,page_3
如果几个页面不是同个系统,你只能掌控落地页,即 PAGE_3,那么链接上带的参数也足够说明用户的访问路径了。如果路径中的页面你都能掌控,那么也可以根据设备唯一 ID 或者 用户唯一 ID 加上访问的时间顺序来确定用户操作路径,即服务器拿到的访问记录为:
用户访问了 ?rel_id=page_1用户访问了 ?rel_id=page_2用户访问了 ?rel_id=page_3
这种情况下页面 123 中都需要埋入上报代码,每个页面只上报自己的 URL 即可。上报逻辑应尽可能多地上报原始数据,比如可以附加当前页面的停留时间等,方便日后进行更复杂的数据分析。
路径分析的目的就是要提高转化率,那么程序逻辑上如何定义转化率呢?我们先来看看转化率的定义:
在网站分析中,转化率一般的定义是,实现设定目标的次数,与访问次数的比值。
可见,定义的关键在于分母,即达成目标的次数。我们的目标可以是下单、购买、或者到达某个页面。如果是到达页面,那么每一步的页面跳转都有一个转化率,剩下的就是蹦失率,或者叫跳出率了。要想提高转化率,不仅要在落地页(Landing Page)上下功夫,关键路径的优化也很重要。
因此,在关键路径数据的基础上,单独分析某个页面的到达次数,可以计算转化率。或者,如果想通过下单或支付来计算转化率的话,一个简单的办法就是,看用户是否到达了“下单成功”或者“支付成功”页面,并且前面有合理的依赖路径。当然,最准确的方式还是以实际的订单数据和支付数据为准。
目前互联网上已有众多成熟的数据统计平台及工具,各家都有自己独特的特点和优势。也有许多公司会考虑自建平台,但不知是否可行,本章将浅析其利弊。
目前主流的 APP 或网站统计平台有:GrowingIO、神策数据、MTA、百度统计、谷歌分析、诸葛IO、友盟等等。具体大家可以去官网了解,这里不做介绍。
还有许多行业分析报告的平台,底层也是通过大数据+AI 分析出更高维度的结论,供大家查看。比如艾瑞咨询的数据报告,相信做互联网的同学们都有自己的百宝箱,这里也不赘述。
最后说说自建数据平台的利弊。首先,业务数据是敏感数据,接入第三方就要放宽心把数据交给其他平台。而自建平台就没有这个烦恼。其次,第三方平台虽然提供了很多强大的功能,但无法实现定制化的统计分析。容易陷入进退两难的境地。而自建平台灵活性就高很多,但是对人员和资源的要求相对较高。
最后,无论是使用第三方平台还是自建平台,都是停留在工具层面,若想真正得出有价值的结论,需要资深的数据分析人员来分析这些数据。就算是 AI 也要有科学的分析模型做指导,才能按照正确的路线学习进化下去。
综上,我认为如果是起步阶段的公司,建议直接使用成熟的平台,基本可以满足需求。如果是成熟的大公司,建议自建和外部同时使用,一方面可以满足定制化需求,一方面可以借鉴外部工具的优点,取长补短,综合参考。
最后,结合前面的知识,我们再回到文初的两个小故事。故事一中,招商银行之所以打电话给我,定是在“e招贷”页面进行了埋点上报,并标记为关键操作。如果某用户浏览过这个页面,就将其打标为“缺钱,亟需用钱”等。在营销管理系统中,再将这批用户筛选出来,由营销人员挨个打电话推销产品。
故事二中,数据的差异是怎么产生的?首先,两家平台对用户访问的定义可能不同。本例中百度是统计的用户打开页面算一个访问,而我们自建平台则是定义为有一个设备唯一 ID 进来,算一个访问。这里就产生了差异。此外,如果是点击按钮后打开一个新页面,那么这里有两个动作,一个是点击,一个是进入新页面,这里的统计口径也可能有差异。最后,前面 3.1 小节提到了上报时机的权衡,就是因为上报时候可能会丢数据。比如用户的网络忽然断掉,还有网络传输过程的丢包。这也会导致一定的差异。所以,遇到这种情况,只要确定逻辑上没有硬伤,并且统计口径一致,是允许一定程度的不一致的。问:为什么百度谷歌的搜索结果点击之后都会跳转一次?答:因为搜索引擎没法主动在我们的页面嵌入统计代码,所以通过跳转带参数的方式(4.3.2),在中间页进行数据埋点上报操作。
答:邀请机制重点在于记录邀请关系,那么当你把链接分享给别人,别人再打开的时候,系统如何知道是你分享的呢?这就是链接上的乱码参数的作用。为什么是乱码?这是因为系统希望知道是谁邀请的,但是不希望其他人可以自己破解并篡改参数。比如活动 ID 如果是数字,就可以随便修改,访问其他可能不想让你看到的活动。领券 ID 如果是自增数字,就可以遍历数字领取所有能耐领的券。
问:为什么不同系统统计出来的 PV,UV 会不同?答:根据前文所述,可能有五种原因:1,埋点逻辑不同;2,上报机制不同;3,统计口径不同;4,程序错误;5,人为错误。首先要明确双方的统计口径,比如是否都以服务端日志统计到的页面打开次数为准,还是以页面脚本上报的打开次数为准。再看上报逻辑,有没有可能错误率不同,或上报的数据不一致。然后再排查系统逻辑是否有问题,或是否有改动。最后,再看是否在统计时发生了人为的错误导致最后统计结果出错。
答:根据前文所述,若想能埋点上报,首先要嵌入基础的代码。而外投的广告都是在其他平台,一般情况下无法在外部页面嵌入代码。比如朋友圈广告的展示。
答:如果外投位置可以配合埋入代码,或者展示的时候可以请求我们自己的资源(图片、视频),或者主动调用我们的接口,那么可以作为辅助参考数据。但这个也可能造假。所以最好是修改统计口径,比如以实际到达我们自己的落地页为计费规则,或者是 CPS 方式,记录引流,然后以我们实际的成交量为准计费。
答:我们知道有些设备会被微信或百度等判定为异常设备,而拒绝使用其账号。先不管这个设备到底做了什么,我们只说些基本的检测规则。如果是微信本身,那么最基本的,账号发的请求中设备信息是否完整,是否真实设备,设备是否经常登录过多账号,设备是否经常换 IP,设备是否有位置变化等等,都是考虑因素。还可能根据关联账号体系的行为共同检测,比如关联的 QQ 号是否有异常。总之,一家公司自己的 APP 矩阵,是可以把数据共享,综合起来判定一台设备的行为的。比如百度系,头条系等等。
问:为什么随便一个网站上都能推荐我在淘宝搜索过的商品?答:网站接入了淘宝的广告,即这个网站嵌入了淘宝的代码,那么如果你之前在淘宝浏览过某些品类,就会被记录下来,在这些网站中再次推荐给你相关的商品。同样,搜索的相关推荐也一样,你在百度搜了些东西,然后看很多网站就都有这些字样,甚至有时可能有点尴尬。
答:这个灵魂拷问,可以这样理解:首先,你在网上的一切数据,都只是存在远程的另一些电脑里。比如银行流水算隐私了吧?即使一般的银行职员没权限看,银行的 DBA (数据库管理员)总不能闭眼睛操作吧?安全是相对的,互联网公司一般会将用户隐私数据加密存储,普通员工肯定是看不到的,只有拥有相应权限的人员才能看到,所以总体上可以说是安全的。除非极端情况,比如黑客攻击,内部管控问题等。
好了,以上就是关于“用户数据埋点采集技术”的全部,我们再补充下大纲,你学会了吗?如果有任何问题,可以随时留言交流。
本文转载于微信公众号:姬小光(ID:hi-laser),已经取得作者授权,未经作者授权,禁止转载。
【转载说明】  若上述素材出现侵权,请及时联系我们删除及进行处理:8088013@qq.com