使用Amazon Pinpoint對使用者行為追蹤

貓叔Vincent發表於2021-04-04

1.前言


 

最近在做一個專案,我們的後臺大資料團隊需要了解使用者在使用app的時候,都進行了哪些操作,在哪個頁面都幹了些什麼,以及app日活和月活等等,各種資料。總之就是監控使用者行為,說好聽一點就是傳送反饋資料,提升使用者體驗。

用時下流行的叫法就是:

高情商:提升使用者體驗

低情商:監控使用者一舉一動

[doge][doge][doge] ​​​

不要罵我,任何一個市面上的app都會這麼幹,抖音、微信、微博、QQ、支付婊、淘寶、京東等等,有一個算一個,一個都別想跑。

 

 

所以我們也為了更好地提升使用者體驗,當然也需要在程式碼裡面加一點點東西咯。

做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

 

 

 

4. 下載PinPoint包


 

Nuget搜尋awssdk.pinpoint,這個包幾乎每天一更,而且都是穩定版,所以使用最新版即可。

或者使用命令列

Install-Package AWSSDK.Pinpoint -Version 3.7.1.4

 

 

除了PinPoint,我們還需要下載一個單獨的AWSSDK.CognitoIdentity包,這個是專門管理授權的。

 

 

一開始我查了很久,以為是AWSSDK提供的,因為他裡面也包含一個相同的AWSSDK.CognitoIdentity,但是卻不能授權。而且這個包還是2016年的,。。。

[黑線] ​​​[黑線] ​​​[黑線] ​​​

 

 

5. 初始化PinPoint


 

PinPoint初始化一般通過AWSCredentials這個引數,而AWSCredentials初始化則需要通過剛才提到的包AWSSDK.CognitoIdentity裡面的CognitoAWSCredentials,找後端要PoolId和Region

 

 

 

 

兩個都明白了之後,就很簡單了

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

 

6. 傳送PinPoint追蹤事件


 

傳送這個事件也是研究了很久,因為.net下的封裝只能說是半成品,而安卓ios下的封裝已經太完善了,只需要簡單的呼叫PutEvents即可。

而我們還需要從最基本的做起,只能說還要啥自行車,能用都不錯了。[跪了] ​​​[跪了] ​​​[跪了] ​​​

從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,表示伺服器已經接受我們的請求,並且正在處理。稍等幾分鐘即可看到資料。

 

下面是後臺看到的資料分析控制檯。

 

 

 

7. 總結


 

關於.net平臺下PinPoint的文章,我搜遍了全網,沒有看到過一篇,所以決定寫下來,給自己做個記錄,也方便以後用到PinPoint的同行,不要再浪費時間在這沒用的基本研究了,沒有任何意義。

但是PinPoint確實是一個非常強大的“提升使用者體驗”的好工具,希望AWS能將我這篇文章收錄,作為一個指引。最起碼我覺得比官方的文件繞來繞去還將不明白好多了。

後續我會翻譯一下成英文版,方便老外看懂。

相關文章