使用Amazon Pinpoint对用户行为追踪

1.前言

最近在做一个项目,我们的后台大数据团队需要了解用户在使用app的时候,都进行了哪些操作,在哪个页面都干了些什么,以及app日活和月活等等,各种数据。总之就是监控用户行为,说好听一点就是发送反馈数据,提升用户体验。

用时下流行的叫法就是:

高情商:提升用户体验

低情商:监控用户一举一动

使用Amazon Pinpoint对用户行为追踪使用Amazon Pinpoint对用户行为追踪使用Amazon Pinpoint对用户行为追踪 ​​​

不要骂我,任何一个市面上的app都会这么干,抖音、微信、微博、QQ、支付婊、淘宝、京东等等,有一个算一个,一个都别想跑。

使用Amazon Pinpoint对用户行为追踪

所以我们也为了更好地提升用户体验,当然也需要在代码里面加一点点东西咯。

做data tracking的平台很多,亚马逊、微软、谷歌、腾讯、阿里、字节、可能每家都有自己定制的一套服务,我们采用的是亚马逊的PinPoint技术,没有为什么,后台选的。

由于AWS的文档真的是乱成狗,导致我们在最基本的初始化sdk,都花了一个星期,可见官方文档有多差,包名管理混乱,连基本的示例代码都没有,文档是N年以前的,点击去各种跳转,到最后发现全都不能用。不过相比于.net平台,aws在安卓、苹果、web方便,可谓是下足了功夫,示例代码,配置截图,真的就差帮写实际项目集成代码了。所以在折腾了一个星期后,我们终于跑通了所有流程,仅以此文档记录一下踩过的坑,也让以后想”提升用户体验”的同行少走弯路。

2. PinPoint功能介绍

客户希望与他们喜爱的企业和品牌保持联系。他们通过各种线上和线下渠道忠实地关注最新的产品、新闻和促销活动。但客户越来越希望接收主动的相关数字通信。Amazon Pinpoint 是一项灵活且可扩展的出站和入站营销传播服务。

①通信渠道

Amazon Pinpoint 通过电子邮件、语音、推送通知和 SMS 渠道实现送达和规模,从而覆盖全球数亿客户。

②营销消息

使用 Amazon Pinpoint 在合适的时间向合适的人发送合适的信息,从而实现推广营销传播。

③事务性消息

事务性消息是指发送给特定接收者的按需消息。您可以使用 Amazon Pinpoint API 和 AWS 软件开发工具包,通过电子邮件、推送、SMS 或语音发送事务性消息。您也可以通过编程方式根据 Web 或移动应用程序中的客户活动触发事务性消息。

④分析

使用 Amazon Pinpoint 提供的分析可以通过查看与用户参与度、活动延伸范围、收入等相关的趋势,深入了解用户群。

在用户与您的项目交互时,Amazon Pinpoint 收集并存储这些交互的分析数据。您可以查看这些数据,以便了解用户参与度、购买活动以及人数统计等方面的信息。例如,如果您有一个移动应用程序,您可以查看显示每天打开您应用程序的用户数、用户打开您应用程序的时间以及您应用程序产生的收入的图表和指标。

其实我们为了提升用户体验,也就是用了PinPoint的分析功能。

3. PinPoint源码

实际上PinPoint只是AWS的一个很小部分而已, AWS一整套SDK包含了上百个服务,详见下图。

有兴趣的可以自己去看源代码:https://github.com/aws/aws-sdk-net

使用Amazon Pinpoint对用户行为追踪

4. 下载PinPoint包

Nuget搜索awssdk.pinpoint,这个包几乎每天一更,而且都是稳定版,所以使用最新版即可。

或者使用命令行

Install-Package AWSSDK.Pinpoint -Version 3.7.1.4

使用Amazon Pinpoint对用户行为追踪

除了PinPoint,我们还需要下载一个单独的 AWSSDK.CognitoIdentity包,这个是专门管理授权的。

使用Amazon Pinpoint对用户行为追踪

一开始我查了很久,以为是AWSSDK提供的,因为他里面也包含一个相同的AWSSDK.CognitoIdentity,但是却不能授权。而且这个包还是2016年的,。。。

使用Amazon Pinpoint对用户行为追踪 ​​​使用Amazon Pinpoint对用户行为追踪 ​​​使用Amazon Pinpoint对用户行为追踪 ​​​

使用Amazon Pinpoint对用户行为追踪

5. 初始化PinPoint

PinPoint初始化一般通过AWSCredentials这个参数,而AWSCredentials初始化则需要通过刚才提到的包AWSSDK.CognitoIdentity里面的CognitoAWSCredentials,找后端要PoolId和Region

使用Amazon Pinpoint对用户行为追踪

使用Amazon Pinpoint对用户行为追踪

两个都明白了之后,就很简单了

CognitoAWSCredentials credentials = new CognitoAWSCredentials(poolId, RegionEndpoint.USEast1);
var pinpoint = new AmazonPinpointClient(credentials, RegionEndpoint.USEast1);

6. 发送PinPoint追踪事件

发送这个事件也是研究了很久,因为.net下的封装只能说是半成品,而安卓ios下的封装已经太完善了,只需要简单的调用PutEvents即可。

而我们还需要从最基本的做起,只能说还要啥自行车,能用都不错了。

使用Amazon Pinpoint对用户行为追踪 ​​​使用Amazon Pinpoint对用户行为追踪 ​​​使用Amazon Pinpoint对用户行为追踪 ​​​

从EndpointDemographic、PublicEndpoint、Event、EventsBatch、EventsRequest、PutEventsRequest层层传递,

经过九九八十一难,才能取得真经————pinpoint.PutEventsAsync(putEventsRequest);

            try
            {
                CognitoAWSCredentials credentials = new CognitoAWSCredentials(poolId, RegionEndpoint.USEast1);
                var pinpoint = new AmazonPinpointClient(credentials, RegionEndpoint.USEast1);

                EndpointDemographic endpointDemographic = new EndpointDemographic
                {
                    AppVersion = "1.0.0",
                    Locale = "zh-hk",
                    Make = "xxx",
                    Model = "xxx",
                    ModelVersion = "19042",
                    Platform = "pc",
                    PlatformVersion = "19042",
                };

                PublicEndpoint publicEndpoint = new PublicEndpoint
                {
                    ChannelType = ChannelType.CUSTOM,
                    Demographic = endpointDemographic,
                    //More
                };

                //Maximum number of attribute keys and metric keys for each event ------ 40 per request
                Dictionary<string, string> attribute = new Dictionary<string, string>
                {
                    {"field1", "xxx" },
                    {"field2", "xxx" },
                    {"field3", "xxx" },
                    {"field4", "xxx" },
                    {"field5", "xxx" },
                    //More
                };

                var current = Package.Current;
                Event @event = new Event
                {
                    Attributes = attribute,
                    EventType = "xxx",
                    AppPackageName = Package.Current.Id.Name,
                    AppTitle = Package.Current.DisplayName,
                    AppVersionCode = "10000",
                    SdkName = GetAWSSDKName(pinpoint.Config.UserAgent),
                    ClientSdkVersion = GetAWSSDKVersion(pinpoint.Config.UserAgent),
                    Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss")
                };
                Dictionary<string, Event> events = new Dictionary<string, Event>();
                events.Add("Events", @event);

                EventsBatch eventsBatch = new EventsBatch
                {
                    Endpoint = publicEndpoint,
                    Events = events
                };

                Dictionary<string, EventsBatch> batchItem = new Dictionary<string, EventsBatch>();
                batchItem.Add(installId.ToString(), eventsBatch);

                EventsRequest eventsRequest = new EventsRequest
                {
                    BatchItem = batchItem
                };

                PutEventsRequest putEventsRequest = new PutEventsRequest
                {
                    ApplicationId = appId,
                    EventsRequest = eventsRequest
                };

                var res = await pinpoint.PutEventsAsync(putEventsRequest);
                if(res != null)
                {
                    Debug.WriteLine("PinPoint.PutEventsAsync: " + DateTime.UtcNow);
                    Debug.WriteLine("EndpointItemResponse: "
                        + res?.EventsResponse?.Results[installId.ToString()]?.EndpointItemResponse.StatusCode
                        + res?.EventsResponse?.Results[installId.ToString()]?.EndpointItemResponse.Message);
                    Debug.WriteLine("EndpointItemResponse: "
                        + res?.EventsResponse?.Results[installId.ToString()]?.EventsItemResponse["Events"].StatusCode
                        + res?.EventsResponse?.Results[installId.ToString()]?.EventsItemResponse["Events"].Message);
                }
            }
            catch (AmazonPinpointException ex)
            {

            }
            catch(Exception ex)
            {

            }    

注意我们在控制台输出的调试信息,当成功发送事件后,服务器会返回202Accepted,表示服务器已经接受我们的请求,并且正在处理。稍等几分钟即可看到数据。

下面是后台看到的数据分析控制台。

使用Amazon Pinpoint对用户行为追踪

7. 总结

关于.net平台下PinPoint的文章,我搜遍了全网,没有看到过一篇,所以决定写下来,给自己做个记录,也方便以后用到PinPoint的同行,不要再浪费时间在这没用的基本研究了,没有任何意义。

但是PinPoint确实是一个非常强大的”提升用户体验”的好工具,希望AWS能将我这篇文章收录,作为一个指引。最起码我觉得比官方的文档绕来绕去还将不明白好多了。

后续我会翻译一下成英文版,方便老外看懂。

Original: https://www.cnblogs.com/hupo376787/p/14606137.html
Author: 猫叔Vincent
Title: 使用Amazon Pinpoint对用户行为追踪

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/607349/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 你有想过在同一台服务器中,同时多开几个tomcat吗

    tomcat作为许多java项目的运行的环境,常用来跑java项目。而一台服务器只跑一个tomcat服务又太浪费资源了,so,我们可以在同一台服务器上,同时跑多个tomcat服务进…

    Linux 2023年6月8日
    095
  • 致远 OA 组合 getshell

    测试版本为: 致远 A8-V5 协同管理软件 V6.1SP2 1.&#x83B7;&#x53D6;cookie&#x4FE1;&#x606F; 2….

    Linux 2023年5月28日
    0318
  • vue指令——day01

    v-cloak:能够解决插值表达式闪烁的问题 <p v-cloak>{{ msg }}</p> v-text:会覆盖元素中原本的内容,但是插值表达式 只会替…

    Linux 2023年6月7日
    0115
  • shell运算符

    算术运算符 下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20: 运算符说明举例 + 加法 expr $a + $b 结果为 30。 – 减法 ex…

    Linux 2023年5月27日
    077
  • liunx安装docker (自我记录)

    1 安装 安装所需的软件包dnf install -y yum-utils device-mapper-persistent-data lvm2 安装 dnf install do…

    Linux 2023年6月7日
    0108
  • Tomcat 实现双向SSL认证

    大概思路: 使用openssl生产CA证书,使用keytool生产密钥库 1、生成CA密钥 genrsa [产生密钥命令] -des3 [加密算法] -out[密钥文件输出路径] …

    Linux 2023年6月14日
    084
  • MySQL表空间回收的正确姿势

    不知道大家有没有遇到这样的一种情况,线上业务在MySQL表上做增删改查操作,随着时间的推移,表里面的数据越来越多,表数据文件越来越大,数据库占用的空间自然也逐渐增长 为了缩小磁盘上…

    Linux 2023年6月13日
    097
  • 泛微 OA 前台 GetShell 复现

    自行搭建环境: 漏洞路径: /weaver/weaver.common.Ctrl/.css?arg0=com.cloudstore.api.service.Service_Chec…

    Linux 2023年5月28日
    0103
  • Redis Cluster集群

    Redis集群 Redis集群是一个可以在多个Redis节点之间进行数据共享的设施( installation )。 Redis集群不支持那些需要同时处理多个键的Redis命令,因…

    Linux 2023年5月28日
    092
  • 使用并发 ssh 连接来提升捞日志脚本执行效率

    问题背景 公司有简单粗略的日志服务,部署在多台机器实例上,采集的日志记录在每台机器的本地硬盘上,写一小时后日志文件自动切换,硬盘空间自动回滚。大约可以保存两三天的历史数据。为什么会…

    Linux 2023年5月27日
    074
  • vim使用心得

    /etc/vimrc 系统整体的vim设定值 ~/.vimrc 用户自己的vim设定值 (此文件的批注为单个双引号) 目前我只设定了: set nu “显示行号 Ori…

    Linux 2023年6月6日
    090
  • 《拉钩课程 — 计算机网络通关》学习笔记

    一、概述 1、程序员基础知识大致可以分为七种基本科学:计算机组成原理、操作系统、计算机网络、算法和数据结构、图形学、编译原理、编辑技巧。 2、ISP:Internet Servic…

    Linux 2023年6月16日
    0123
  • 内网渗透测试:利用DCOM进行横向渗透——利用ExecuteShellCommand在做远程命令执行

    COM COM即组件对象模型(Component Object Model,COM) ,是基于 Windows 平台的一套组件对象接口标准,由一组构造规范和组件对象库组成。COM是…

    Linux 2023年5月28日
    090
  • linux用户组管理

    一、简介 1、每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理,不同Linux系统对用户组的规定有所不同,如:Linux下在创建用户时,不指定用户组名,则会同时…

    Linux 2023年5月27日
    0126
  • 一道诡异的考试题

    题目: 给定$a$张黑牌,$b$白牌,甲,乙两人按以下顺序抽牌: 甲抽一张,乙抽一张,然后弃去一张,然后重复以上过程。 先抽到黑牌者胜,求甲和乙获胜的概率$mod 10045358…

    Linux 2023年6月6日
    090
  • macos 文件系统 git仓库 大小写敏感设置; git config core.ignorecase

    macos 的文件系统不区分文件名的大小写,这样会导致在一个文件夹,当修改一个文件名为大写的时候,git不能感知到。这样使用过程中会出现很多不必要的麻烦。之前设置过,最近使用,发现…

    Linux 2023年6月14日
    0118
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球