欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c/c++客戶端使用google analytics进行数据埋点上传

程序员文章站 2024-01-03 17:58:10
...

google analytics开发参考地址:https://developers.google.cn/analytics
google analytics登录地址:https://analytics.google.com

前言

google analytics一般都是针对网站,web应用和移动应用平台,当我们的客户端是cs架构的时候该怎么做呢?看图:
c/c++客戶端使用google analytics进行数据埋点上传
当然是选择Measurement Protocol了!

Measurement Protocol:

Google Analytics Measurement Protocol 可让开发者通过 HTTP 请求直接向 Google Analytics 服务器发送原始用户互动数据。这样,开发者就可以衡量在各种环境中用户互动的情况。
既然是http那就包含报文头和content,比如我们要上传一个用户的点击播放按鈕的事件,content格式形如:

v=1&tid=UA-XXXXX-Y&cid=555&t=event&ec=play&ea=paly

当然我们也可以批量上传最多不超过20个匹配

v=1&tid=UA-XXXXX-Y&cid=555&t=event&ec=play&ea=paly
v=1&tid=UA-XXXXX-Y&cid=555&t=event&ec=play&ea=stop
v=1&tid=UA-XXXXX-Y&cid=555&t=event&ec=play&ea=test

批量限制

  1. 可对每个请求指定最多 20 个匹配
  2. 所有匹配负载的总大小不能超过 16K 字节
  3. 单个匹配负载不能超过 8K 字节

t表示匹配类型,这里我选择发送的匹配类型是事件跟踪类型:event,ec表示事件类别,ea表示事件操作,其它更多参数请参考开发文档,介绍的很详细。

操作步骤

现在开始讲具体步骤流程。

  1. 拥有一个google账号,注册的话最好是用Google Chrome浏览器进行注册
  2. 用该账号登录google analytics
  3. 登录进去后点击创建媒体资源
    c/c++客戶端使用google analytics进行数据埋点上传
  4. 这里我们选择网站,因为我们需要创建之后的媒体资源ID,格式形如:UA-XXXXX-X,然后点击继续
    c/c++客戶端使用google analytics进行数据埋点上传
  5. 网站名称我们可以填写自己软件的名称,这个任意,其实就是依托这个网站来统计我们的数据,我填写的是我公司官网地址。行业类别选择计算机与电子产品,然后点击创建。
    c/c++客戶端使用google analytics进行数据埋点上传
  6. 创建成功之后会生成一个跟踪ID,记住这个ID,这个ID就是每次上传匹配的tid值。
    c/c++客戶端使用google analytics进行数据埋点上传
  7. 接下来就是我们使用c++代码上传数据,下面是上传示例:
int main()
{
    WSADATA wData;
    ::WSAStartup(MAKEWORD(2, 2), &wData);
    
    SOCKET clientSocket = socket(AF_INET, 1, 0);
    struct sockaddr_in ServerAddr = { 0 };
    int Ret = 0;
    int AddrLen = 0;
    HANDLE hThread = 0;

    /*这里假设我要上传用户点击了某个按钮
    v:1
    t:匹配类型是事件event
    ec:事件类别是video
    ea:事件操作是点击停止按钮stop
    tid:就是我们创建媒体资源成功后的媒体资源ID
    cid:用户标识,可以用电脑mac进行标识
    */
    string strBody = "v=1&tid=UA-xxxxxx-2&cid=6058&t=event&ec=video&ea=stop";
    int body_len = strBody.length();
    
    char bufSend[1024] = {0};
    sprintf(bufSend, "POST /collect HTTP/1.1\r\n");
    sprintf(bufSend, "%sHost:%s\r\n", bufSend, "www.google-analytics.com");
    sprintf(bufSend, "%sContent-Length: %d\r\n", bufSend, body_len);
    sprintf(bufSend, "%s\r\n%s", bufSend, strBody.c_str());
    
    char addIp[256] = { 0 };
    char* url = (char*)"www.google-analytics.com";

    HOSTENT* pHostEnt;
    int             nAdapter = 0;
    struct       sockaddr_in   sAddr;

    pHostEnt = gethostbyname(url);
    if (pHostEnt)
    {
        if (pHostEnt->h_addr_list[nAdapter])
        {
            memcpy(&sAddr.sin_addr.s_addr, pHostEnt->h_addr_list[nAdapter], pHostEnt->h_length);
        }
    }
    else
    {
        cout << "gethostbyname error" << endl;
        return 0;
    }

    ServerAddr.sin_addr.s_addr = inet_addr(inet_ntoa(sAddr.sin_addr));
    ServerAddr.sin_port = htons(80);;
    ServerAddr.sin_family = AF_INET;
    char bufRecv[3069] = { 0 };
    int errNo = 0;
    errNo = connect(clientSocket, (sockaddr*)&ServerAddr, sizeof(ServerAddr));
    if (errNo == 0)
    {
        //如果发送成功,则返回发送成功的字节数;
        if (send(clientSocket, bufSend, strlen(bufSend), 0) > 0)
        {
            cout << "发送成功\n";

            //如果接受成功,则返回接受的字节数;
            if (recv(clientSocket, bufRecv, 3069, 0) > 0)
            {
                cout << "接受的数据:" << bufRecv << endl;
            }
        }
        
    }
    else
    {
        errNo = WSAGetLastError();
        cout << "connect error" << endl;
    }
    ::WSACleanup();
    cout << "end" << endl;
    return 0;
}

//QT项目上传数据代码示例

QString strContent = "v=1&tid=UA-xxxxxx-2&cid=6058&t=event&ec=video&ea=stop";
auto body = strContent.toLatin1();
    int body_len = strContent.length();

    QNetworkRequest request;
    request.setUrl(QUrl("https://www.google-analytics.com/collect"));

    request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("text/plain"));
    request.setRawHeader("POST","/collect HTTP/1.1");
    request.setRawHeader("Host","www.google-analytics.com");
    request.setRawHeader("Content-Length",QString::number(body_len).toStdString().c_str());

    QEventLoop eventLoop;
    QNetworkAccessManager *manager = new QNetworkAccessManager();
    QNetworkReply *reply = manager->post(request, body);

    QObject::connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
    eventLoop.exec();

    if (reply->error() == QNetworkReply::NoError)
        return  true;
    else
        return false;

最后

如果上传后返回200就表示上传成功了,上传成功后如果我们想在google analytics平台通过报告的形式看我们上传的数据,就需要自己去定义报告的形式了。
c/c++客戶端使用google analytics进行数据埋点上传

上一篇:

下一篇: