26

我有很多网站,想构建一个仪表板,在单个页面上显示每个网站上的实时访问者数量。(其他人想要这个吗?)现在查看此信息的唯一方法是为每个站点打开一个新选项卡。

谷歌没有实时 API,所以我想知道是否可以抓取这些数据。Eduardo Cereto 发现 Google 通过实时/绑定网络请求传输实时数据。任何更精明的人都知道我应该如何开始?这就是我的想法:

  1. 弄清楚如何以编程方式进行身份验证

  2. 检查所有实时/绑定请求,看看它们是如何变化的。每个请求都有唯一的密钥吗?那是从哪里来的?以下是我对请求的细分:

    https://www.google.com/analytics/realtime/bind?VER=8

    & key= [这是什么?它从何而来?21 个字符的小写字母数字,每个请求保持相同]

    & ds= [这是什么?它从何而来?21 个字符的小写字母数字,每个请求保持相同]

    & pageId=rt-standard%2Frt-概述

    & q=t%3A0%7C%3A1%3A0%3A%2Ct%3A11%7C%3A1%3A5%3A%2Cot%3A0%3A0%3A4%2Cot%3A0%3A0%3A3%2Ct%3A7%7C%3A1% 3A10%3A6%3D%3DREFERRAL%3B%2Ct%3A10%7C%3A1%3A10%3A%2Ct%3A18%7C%3A1%3A10%3A%2Ct%3A4%7C5%7C2%7C%3A1%3A10%3A2! %3Dzz%3B%2C&f

    变量 URI 解码为这个q(什么?):t:0|:1:0:,t:11|:1:5:,ot:0:0:4,ot:0:0:3,t: 7|:1:10:6==REFERRAL;,t:10|:1:10:,t:18|:1:10:,t:4|5|2|:1:10:2!=zz ;,&F

    & RID=rpc

    & SID= [这是什么?它从何而来?16 个字符的大写字母数字,每次请求保持不变]

    & CI=0

    & AID= [这是什么?它从何而来?整数,从 1 开始,奇怪地递增到 150,然后是 298]

    & TYPE=xmlhttp

    & zx= [这是什么?它从何而来?12 个字符的小写字母数字,每个请求都会更改]

    & t=1

  3. 检查所有实时/绑定响应以了解它们如何变化。数据是怎么进来的?它看起来像一些改变的 JSON。我需要连接多少次才能获取数据?网站上的活跃访问者在哪里?以下是示例数据的转储:

19
[[151,["noop"]
]
]
388
[[152,["rt",[{"ot:0:0:4":{"timeUnit":"MINUTES","overTimeData":[{"values":[49,53,52,40,42,55,49,41,51,52,47,42,62,82,76,71,81,66,81,86,71,66,65,65,55,51,53,73,71,81],"name":"Total"}]},"ot:0:0:3":{"timeUnit":"SECONDS","overTimeData":[{"values":[0,1,1,1,1,0,1,0,1,1,1,0,2,0,2,2,1,0,0,0,0,0,2,1,1,2,1,2,0,5,1,0,2,1,1,1,2,0,2,1,0,5,1,1,2,0,0,0,0,0,0,0,0,0,1,1,0,3,2,0],"name":"Total"}]}}]]]
]
388
[[153,["rt",[{"ot:0:0:4":{"timeUnit":"MINUTES","overTimeData":[{"values":[52,53,52,40,42,55,49,41,51,52,47,42,62,82,76,71,81,66,81,86,71,66,65,65,55,51,53,73,71,81],"name":"Total"}]},"ot:0:0:3":{"timeUnit":"SECONDS","overTimeData":[{"values":[2,1,1,1,1,1,0,1,0,1,1,1,0,2,0,2,2,1,0,0,0,0,0,2,1,1,2,1,2,0,5,1,0,2,1,1,1,2,0,2,1,0,5,1,1,2,0,0,0,0,0,0,0,0,0,1,1,0,3,2],"name":"Total"}]}}]]]
]
388
[[154,["rt",[{"ot:0:0:4":{"timeUnit":"MINUTES","overTimeData":[{"values":[53,53,52,40,42,55,49,41,51,52,47,42,62,82,76,71,81,66,81,86,71,66,65,65,55,51,53,73,71,81],"name":"Total"}]},"ot:0:0:3":{"timeUnit":"SECONDS","overTimeData":[{"values":[0,3,1,1,1,1,1,0,1,0,1,1,1,0,2,0,2,2,1,0,0,0,0,0,2,1,1,2,1,2,0,5,1,0,2,1,1,1,2,0,2,1,0,5,1,1,2,0,0,0,0,0,0,0,0,0,1,1,0,3],"name":"Total"}]}}]]]
]

让我知道您是否可以帮助解决上述任何问题!

在此处输入图像描述

4

4 回答 4

10

为了达到同样的效果,谷歌推出了新的实时 API。使用此 API,您可以轻松检索实时在线访问者以及具有以下维度和指标的多个 Google Analytics。https://developers.google.com/analytics/devguides/reporting/realtime/dimsmets/

这与 Google Analytics API 非常相似。要开始开发, https://developers.google.com/analytics/devguides/reporting/realtime/v3/devguide

于 2013-08-04T08:21:46.690 回答
6

使用谷歌浏览器,我可以在网络面板上看到数据。

请求端点是https://www.google.com/analytics/realtime/bind

似乎连接保持打开状态 2.5 分钟,在此期间它只是不断获得越来越多的数据。

大约 2.5 分钟后,连接关闭并打开一个新连接。

在“网络”面板上,您只能看到已终止连接的数据。所以让它打开 5 分钟左右,你就可以开始看到数据了。

我希望这能给你一个开始的地方。

于 2012-06-14T07:34:45.223 回答
6

让谷歌进入循环似乎是多余的。建议您使用从仪表板服务器按需提供的通用元素,并通过绝对 URL 在所有页面上包含此项目,以针对给定站点进行监控。输出项目的脚本可以读取浏览器询问的 IP,这些都可以登录到数据库中并过滤唯一性,从而提供实时人数。

<?php
$user_ip = $_SERVER["REMOTE_ADDR"];
/// Some MySQL to insert $user_ip to the database table for website XXX  goes here


$file = 'tracking_image.gif';
$type = 'image/gif';
header('Content-Type:'.$type);
header('Content-Length: ' . filesize($file));
readfile($file);
?>

修正案: 数据库还可以为其存储的每一行数据添加时间戳。这可用于进一步过滤结果并提供过去一小时或一分钟内的访问者数量。

带有 AJAX 的客户端 Javascript 用于微调或过度 杀伤 onblur 和 onfocus javascript 命令可用于判断页面是否可见,通过 Ajax 将数据传回仪表板服务器。http://www.thefutureoftheweb.com/demo/2007-05-16-detect-browser-window-focus/

当访问者关闭页面时,body 标签中的 javascript onunload函数也可以检测到这一点,并且 Ajax 可用于在浏览器最终关闭页面之前最后一次将数据发送回服务器。

由于您可能还希望收集有关访问者的一些信息,例如谷歌分析,这个页面https://panopticlick.eff.org/有很多可以检查和调整的 javascript。

于 2012-06-14T22:41:50.597 回答
5

我需要/想要个人使用的实时数据,所以我对他们的系统进行了一点逆向工程。

而不是绑定到/bind我从/getData(没有双关语)获取数据。

最低/getData要求显然是:https://www.google.com/analytics/realtime/realtime/getData?pageId&key={{propertyID}}&q=t:0|:1

以下是可能的查询参数和语法的简短说明,请记住,这些都是猜测,我不知道所有这些:

查询语法:pageId&key=propertyID&q=dataType:dimensions|:page|:limit:filters

价值观:

pageID: Required but seems to only be used for internal analytics.

propertyID: a{{accountID}}w{{webPropertyID}}p{{profileID}}, as specified at the Documentation link below. You can also find this in the URL of all analytics pages in the UI.


dataType:
    t: Current data
    ot: Overtime/Past
    c: Unknown, returns only a "count" value


dimensions (| separated or alone), most values are only applicable for t:
    1:  Country
    2:  City
    3:  Location code?
    4:  Latitude
    5:  Longitude
    6:  Traffic source type (Social, Referral, etc.)
    7:  Source
    8:  ?? Returns (not set)
    9:  Another location code? longer.
    10: Page URL
    11: Visitor Type (new/returning)
    12: ?? Returns (not set)
    13: ?? Returns (not set)
    14: Medium
    15: ?? Returns "1"

page:
    At first this seems to work for pagination but after further analysis it looks like it's also used to specify which of the 6 pages (Overview, Locations, Traffic Sources, Content, Events and Conversions) to return data for.

    For some reason 0 returns an impossibly high metrictotal

limit: Result limit per page, maximum of 50

filters:
    Syntax is as specified at the Documentation 2 link below except the OR is specified using | instead of a comma.6==CUSTOM;1==United%20States


您还可以通过逗号分隔多个查询(即q=t:1|2|:1|:10,t:6|:1|:10)将多个查询组合在一个请求中。

按照上面的“文档”,如果您想构建一个查询,以请求流量来源类型为 CUSTOM 位于美国的前 10 名活跃访问者的页面 URL 和城市,您将使用此 URL:https://www.google.com/analytics/realtime/realtime/getData?key={{propertyID}}&pageId&q=t:10|2|:1|:10:6==CUSTOM;1==United%20States


文档

文档 2


我希望我的答案是可读的并且(虽然有点晚了)足以回答你的问题并在未来帮助其他人。

于 2013-09-22T15:31:51.233 回答