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架构的时候该怎么做呢?看图:
当然是选择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
批量限制
- 可对每个请求指定最多 20 个匹配
- 所有匹配负载的总大小不能超过 16K 字节
- 单个匹配负载不能超过 8K 字节
t表示匹配类型,这里我选择发送的匹配类型是事件跟踪类型:event,ec表示事件类别,ea表示事件操作,其它更多参数请参考开发文档,介绍的很详细。
操作步骤
现在开始讲具体步骤流程。
- 拥有一个google账号,注册的话最好是用Google Chrome浏览器进行注册
- 用该账号登录google analytics
- 登录进去后点击创建媒体资源
- 这里我们选择网站,因为我们需要创建之后的媒体资源ID,格式形如:UA-XXXXX-X,然后点击继续
- 网站名称我们可以填写自己软件的名称,这个任意,其实就是依托这个网站来统计我们的数据,我填写的是我公司官网地址。行业类别选择计算机与电子产品,然后点击创建。
- 创建成功之后会生成一个跟踪ID,记住这个ID,这个ID就是每次上传匹配的tid值。
- 接下来就是我们使用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平台通过报告的形式看我们上传的数据,就需要自己去定义报告的形式了。