4

我正在尝试使用 Ruby 发布到 Google Measurement Protocol:

uri = URI.parse("http://www.google-analytics.com/collect")
params = {"v"=>"1", "tid"=>"UA-XXXXXXXX-X", "cid"=>"XXXXXXXXX.XXXXXXXXX", "t"=>"event", "ec"=>"200", "ea"=>"John"}
result = Net::HTTP.post_form(uri, params) #<Net::HTTPOK 200 OK readbody=true> 
result.body # "GIF89a\x01\x00\x01\x00\x80\xFF\x00\xFF\xFF\xFF\x00\x00\x00,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;" 

还尝试发送 GET 请求而不是 POST:

RestClient.get("http://www.google-analytics.com/collect", params: params, timeout: 4, open_timeout: 4) # "GIF89a\x01\x00\x01\x00\x80\xFF\x00\xFF\xFF\xFF\x00\x00\x00,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;" 

并且没有跟踪该事件: 在此处输入图像描述

他们我试图通过简单地将它们输入 Chrome 来发送相同的参数:

在此处输入图像描述

有效:

在此处输入图像描述

我想当我使用 Ruby 将请求发送到管理协议时,我缺少一个标头或类似的东西。但我无法弄清楚我错过了什么。

4

3 回答 3

1

与python有类似的问题。设置User-Agent标题后工作

curl 示例如下所示

curl -H "user-agent: Some user agent" "https://ssl.google-analytics.com/collect?v=1&<other query params>"
于 2015-12-03T12:54:18.180 回答
1

尝试改变:

uri = URI.parse("http://www.google-analytics.com/collect")

至:

uri = URI.parse("https://www.google-analytics.com/debug/collect")

这样,您将针对 Measurement Protocol Validation Server 测试该请求,而不是获取"GIF89a\x01\x00\x01\x00\x80\xFF\x00\xFF\xFF\xFF\x00\x00\x00,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;"响应正文,您将得到类似的东西

{
  "hitParsingResult": [
    {
      "valid": false,
      "hit": "GET /debug/collect?tid=fake\u0026v=1 HTTP/1.1",
      "parserMessage": [
        {
          "messageType": "ERROR",
          "description": "The value provided for parameter 'tid' is invalid. Please see xxx for details.",
          "parameter": "tid"
        },
        {
          "messageType": "ERROR",
          "description": "Tracking Id is a required field for this hit. Please see xxx for details.",
          "parameter": "tid"
        }
      ]
    }
  ]
}

您可以在此处阅读更多信息:https ://developers.google.com/analytics/devguides/collection/protocol/v1/validating-hits

于 2018-03-19T14:39:13.353 回答
0

您不需要用户代理,只需遵循事件跟踪规则 & rest-client。使用Post方法并填写所有参数。

您可以使用rest-client这样的 post 方法:

RestClient.post('https://www.google-analytics.com/collect?v=1&tid=UA-XXXXXXXXX-1&cid=XXXX-XXX&t=event&ec=Event%20Category&ea=Event%20Action&ev=1&el=Event%20Label', {}, {})

使用 post 方法格式化 rest 客户端:

RestClient.post(url, payload, headers={})

资源 :

于 2017-05-03T02:24:35.077 回答