作为系列文章的第五篇,本文重点探讨数据采集层中的微信分享追踪系统。微信分享,早已成为移动互联网运营的主要方向之一,以Web H5页面(下面称之为微信海报)为载体,利用微信庞大的好友关系进行传播,实现宣传、拉新等营销目的。以下图为例,假设有一个海报被分享到了微信中,用户A与B首先看到了这个海报,浏览后又分享给了自己的好友,用户C看到了A分享的海报,浏览后继续分享给了自己的好友。这便形成了一个简单的传播链,其中蕴含了两种数据:

  • 行为,指的是用户对微信海报的操作,比如打开、分享。
  • 关系,指的是在海报传播过程中,用户之间形成的传播关系,比如用户A将海报传播给C。

    微信分享次数统计、微信公众号分享关注统计

这样的数据的意义在于:第一,统计分析各个渠道的海报的传播效果;第二,对传播贡献较大的用户发放微信红包奖励,提高用户的分享积极性。微信分享追踪系统,便是完成对这两种数据的采集和存储。在过去的一年里,受到公司业务和运营推广方向的影响,这部分数据驱动了近一半的推广业务。 
  熟悉微信开发的朋友应该知道,第一,每个微信用户在某个公众号下都拥有一个唯一的open_id,打开微信海报时,可以通过OAuth2静默授权在用户无感知的情况下拿到其open_id;第二,通过微信JS-SDK,我们可以捕捉到用户对海报页面的分享事件;第三,拿到用户在公众号下的open_id后,便可以对该用户发放微信红包了。基于这三点,我们便可以实现相关的数据追踪和分享奖励了,本文主要是总结我们在微信分享追踪上的方案演进。

  首先要说一点的是,其实微信分享追踪系统本身并不复杂,但是与复杂的产品业务结合到一起,就变得越来越复杂了。如何做到将数据逻辑与产品业务逻辑剥离开,以不变应万变,就是这里要说的方案演进了。

1. 早期服务

早期的微信分享追踪系统,笔者曾经在浅谈微信公众号营销背后的技术一文中介绍过,其时序图如下所示。基本流程是:第一,用户打开海报时,通过OAuth2授权,将open_id加入到页面链接中;第二,前端上报浏览事件,需要带上open_id和传播链信息;第三,用户分享时,需要在分享出去的链接中加上传播链信息,所谓传播链信息,就是每个分享过的用户的open_id组合,比如“open_id_1;open_id_2”;第四,上报用户的分享事件,需要带上open_id和传播链信息。后端收到上报数据后,根据不同的功能需求,将数据保存到不同的数据表中,用于后期消费。随着业务的发展,这个系统暴露出一些问题:

  • 随着推广活动的调整,统计和奖励政策也随之变化,比如有的依据一度分享者的分享次数进行奖励,有的依据一度、二度分享者带来的浏览量进行奖励等等,还有需要根据上报的参数不同做不同的处理。所有逻辑都在上报的API请求中处理,来一个需求加一段逻辑,导致该请求的功能不断膨胀,而且一些推广活动已经下线了,相关的逻辑也没有清理掉。
  • 参数比较混乱,页面URL中携带了不同的参数,包括微信相关参数、产品相关参数,前端上报时需要携带不同的参数,而前端页面太多,经常搞错。

微信分享次数统计、微信公众号分享关注统计

2. neo4j的尝试

于是,我们思考,有没有可能在后端直接构建完整的传播信息,后期使用时直接根据条件就可以查询出所需的数据,前端上报时也不用携带传播链信息,我们想到了图形数据库存储技术。 
  图形数据库是一种非关系型数据库,它应用图形理论存储实体之间的关系信息。在文章开头的那张传播图中,用户的行为数据其实可以归结为用户与海报之间的关系数据,这样,这个系统其实就包含两种实体:用户、海报,三种关系:用户打开海报、用户分享海报、用户之间的传播。在诸多图形数据库中,我们决定选择比较成熟、文档相对丰富的neo4j来做DEMO。采用neo4j的查询语法,很简单的就可以查询出所需数据,简单示例一下。

# 查询1度分享者
MATCH (u:User) - [:FORWARD] -> (p:Poster) RETURN u# 查询浏览情况
MATCH (u:User) - [:OPEN] -> (p:Poster) RETURN u
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

下图呈现基于neo4j存储的新系统时序图,在OAuth2授权的重定向过程中,建立User和Poster节点信息,以及二者之间的OPEN关系信息,并且对页面URL计算hash值(去除无用参数信息),然后将用户open_id和URL的hash值加到页面URL中返回给前端。用户分享时,把该用户的open_id作为parent字段值,加到分享链接中,新用户打开该链接时,会根据该值来建立User与User节点之间的SPREAD关系信息。在用户分享的事件中,做一次数据上报,携带open_id和页面URL的hash值即可,后端拿到信息后,便可以建立User与Poster之间的FORWARD关系信息。如此,便可以建立完整的微信分享追踪数据了。

微信分享次数统计、微信公众号分享关注统计

然而,一切并非预期的那么完美,在DEMO过程中,我们发现有两点问题不能很好的满足我们的需求:

  • 无法根据时间条件快速查询信息,比如查询出昨天的一度分享者。
  • 在查询用户间的关系时,会发生误判。比如在下图所示的传播关系中,UserA和UserC的传播关系是发生在海报PosterA上的,在PosterB上并没有,但是当我们尝试查询二度分享者时,会将UserA->UserC->PosterB误判为二度分享。
# 查询2度分享者
MATCH (u1:User) - [:SPREAD] -> (u2:User) - [:FORWARD] -> (p:Poster) RETURN u2, p
  • 1
  • 2
  • 1
  • 2

微信分享次数统计、微信公众号分享关注统计

虽然这些问题可以想办法绕过去,比如根据时间建立不同的实体节点等等,但是这样会把数据存储做复杂化,经过权衡,我们暂时搁置了这个方案。

3. 基于用户行为数据采集系统的方案

在创业公司做数据分析(三)用户行为数据采集系统一文中,曾经提到早期的数据采集服务是分散在各个业务功能中的,后来我们重新构建了统一的用户行为数据采集系统。在完成这个系统后,我们开始考虑将上述的微信分享追踪系统并入其中,主要工作有:

  • 数据上报的流程与早期的系统一致,但是更换原有的上报方式,采用用户行为数据采集系统的方案统一上报微信分享的数据;
  • 数据接入Kafka后,一方面直接将原始数据存储到Elasticsearch,另一方面,以worker的形式来消费数据,根据相应的业务需求提取出所需的数据存入格式化数据表中,用于统计和奖励活动。当某个推广活动结束后,将其所属的worker停掉即可。

微信分享次数统计、微信公众号分享关注统计

通过这样的改进,我们暂时解决了前端上报混乱和后端业务逻辑膨胀的问题,将数据上报和业务需求隔离开。数据方面,实时数据流在Kafka中,历史数据也在Elasticsearch中有存储;业务需求方面,来了一个新的需求后,我们只需添加一个新的worker来实现消费逻辑,活动结束后停掉worker。来源:www.vkbang.com

微信分享次数统计、微信公众号分享关注统计相关推荐

  1. 微信公众号分享链接自定义hash值的处理

    微信公众号默认的分享样式是直接分享一条链接的,样式丑陋.但是微信jsdk暴露了分享的API可以自定义分享样式. 一.分享鉴权及分享接口冲定义 这一块的文档很全面,不做细述.关键代码如下: functi ...

  2. 微信公众号分享配置无效。。分享出来的只是纯链接了,如何自定义微信公众号的分享

    微信公众号分享配置无效..分享出来的只是纯链接了 挺久没接微信公众号的项目开发了,最近突然接了一个,结果微信自定义分享给我整懵了.原本配置的好好的,屡试不爽的代码,居然死活不生效,开启debug,开发 ...

  3. 微信查券返利机器人公众号搭建教程分享

    微信查券返利机器人公众号搭建教程分享 一.登陆淘宝联盟 用需要开通淘宝联盟的手机淘宝扫码授权登陆联盟 地址:https://www.alimama.com 二.配置推广位,获取PID(推荐使用会员PI ...

  4. 微信公众号分享网页注意点

    最近自己要做微信分享的防封,就研究一下市面做的分享防封原理,基本分流防封是一个做法. 过程讲述: 通过一个微信公众号分享一个入口,记住这个分享内容网页的内容最好一点违规的都没有,标题和图片可以带有诱导 ...

  5. 微信公众号分享问题总结

    文章目录 前言 微信公众号分享问题总结 微信的一些其他问题 结束 前言 -time:2020/11/18 第一次写博客,以后准备在解决一些问题的时候,写在博客里,方便自己寻找 这篇就 总结一些微信公众 ...

  6. 移动端App分享,以及微信小程序和公众号分享功能实现

    移动端App分享,以及微信小程序和公众号分享功能实现 分享功能记录收藏,上链接 前端工作记录

  7. (第三方平台)开发相关,解除80端口占用,微信公众号分享jssdk实现,微信开放平台登录接口接入,2022微信分享接入本地调试,微信分享定制

    一.开发相关 1.平台地址 微信开放平台 QQ互联平台SDK 2.文章收集 来自CSDN兄台的QQ登录使用的教程 微信网站应用开发的详细流程和引导 VueJs单页应用实现微信网页授权及微信分享功能 [ ...

  8. 微信公众号分享开发过程中报错com.foxinmy.weixin4j.exception.WeixinException: 40164 invalid ip 120.79.217.10 (记录)

    最近在开发公众号分享功能的时候遇到的一个问题,记录一下. 报错信息如下: [Fatal Error] :1722:33: The content of elements must consist of ...

  9. 微信终极秘籍:精通公众号商业运营(最强作者阵容资深大号实战揭秘营销极限智慧唯一基于5.0)...

    微信终极秘籍:精通公众号商业运营(最强作者阵容资深大号实战揭秘营销极限智慧唯一基于5.0) 青龙老贼 赵黎 方雨 刘琪 潘越飞 编 ISBN 978-7-121-22036-4 2014年1月出版 定 ...

最新文章

  1. 构建Chua 混沌电路 - 基本测试
  2. windows 10 上office2016 word崩溃的解决方案
  3. 表格中的border-spacing与border
  4. 【转】关于arcgis server ADF的几种超时
  5. boost::function用法的测试程序
  6. 关于 SAP Spartacus defaultCmsContentProvider 和默认 layoutConfig 的一些测试
  7. ASP+COM技术在嵌入式Webserver中的应用
  8. mvc html绑定变量,c# – Asp.Net MVC 3使用变量对象进行自定义模型绑定
  9. Bondareva-Shapley 定理
  10. Xilinx FPGA下载mcs文件时的下载配置
  11. python获取pdf页面尺寸_python-从pdf提取页面作为jpeg
  12. python跟plc通信
  13. vue中reject与provide使用
  14. 让机器认知中文实体 — 复旦大学知识工场发布中文实体识别与链接服务
  15. 中标麒麟官方源——参考
  16. Google Play Install Referrer API 和 Facebook App Ads Referral 集成
  17. MySQL-创建用户和授权
  18. java哲学家就餐_哲学家就餐问题的解决方案(三种)
  19. 【Revit二次开发】模型中存储数据——参数和外部存储(Parameter, Schema and Entity)
  20. 京东商城主图、细节图、视频以及评论图分类下载方法

热门文章

  1. 软件工程---个人总结
  2. SMTP邮箱服务器发送邮件
  3. Java语言编写小游戏
  4. VBA批量导入多个文件夹下的图片到PPT
  5. Linux内存memtest,详细讲解 Linux极品内存检测软件 Memtest86
  6. 关于在win10电脑开启移动热点,手机连上wifi显示无互联网连接的问题
  7. 生产质量分析方案,人机料法环全面解析,必看好文
  8. 企业公关“示弱”思维下的“变脸”戏法
  9. 全国各省市车牌号码一览表
  10. flutter在IOS上的登录实现——QQ登录、微信登录、自动识别手机号一键登录、apple登录