无法从 Google App Engine Post 事件到 Google 分析

Can't Post Events to Google Analytics from Google App Engine

我正在尝试使用来自我的 Google App Engine (Java) 网络应用程序的 Measurement Protocol post 一个事件到 google 分析。

我通过直接提交 URL 测试了 URL,它立即(实时)显示在 Google Analytics 中。但是当我尝试在应用程序中 post 它时,什么也没有显示。

所以我假设开始时我的 Java 代码有缺陷(也许是),所以我用 Google 的示例代码替换了我的代码以从 Google App Engine 集成Google 分析 here。我稍微修改了一下,但这里是关键位...

private static final URL GA_URL_ENDPOINT = getGoogleAnalyticsEndpoint();

private static URL getGoogleAnalyticsEndpoint() {
    try {
        return new URL("http", "www.google-analytics.com", "/collect");
    } catch (MalformedURLException e) {
        throw new RuntimeException(e);
    }
}

public boolean trackEvent(
        String category, String action, String label, String value) {

    try {

    Map<String, String> map = new LinkedHashMap<>();
    map.put("v", "1");             // Version.
    map.put("tid", gaTrackingId);
    map.put("cid", "555");
    map.put("t", "event");         // Event hit type.
    map.put("ec", encode(category, true));
    map.put("ea", encode(action, true));
    map.put("el", encode(label, false));
    map.put("ev", encode(value, false));

    HTTPRequest request = new HTTPRequest(GA_URL_ENDPOINT, HTTPMethod.POST);
    request.addHeader(CONTENT_TYPE_HEADER);
    request.setPayload(getPostData(map));

    HTTPResponse httpResponse = urlFetchService.fetch(request);

    // Return True if the call was successful.
    log.info("Response code for GA event is: " + httpResponse.getResponseCode());
    return httpResponse.getResponseCode() >= 200;

    } catch ( Exception e ) {
        //HANDLE EXCEPTION
        return false;
    }
}

private static byte[] getPostData(Map<String, String> map) {
    StringBuilder sb = new StringBuilder();
    for (Map.Entry<String, String> entry : map.entrySet()) {
        sb.append(entry.getKey());
        sb.append('=');
        sb.append(entry.getValue());
        sb.append('&');
    }
    if (sb.length() > 0) {
        sb.setLength(sb.length() - 1); // Remove the trailing &.
    }
    log.info("GA event string is: " + sb.toString());
    return sb.toString().getBytes(StandardCharsets.UTF_8);
}

private static String encode(String value, boolean required)
        throws UnsupportedEncodingException {
    if (value == null) {
        if (required) {
            throw new IllegalArgumentException("Required parameter not set.");
        }
        return "";
    }
    return URLEncoder.encode(value, StandardCharsets.UTF_8.name());
}

调用这段代码时,我从日志文件中获取了参数字符串:

v=1&tid=UA-XXXXXXXX-1&cid=555&t=event&ec=settings&ea=autopost-on&el=rkAutoPost&ev=5

我还看到我从对 google 的调用中获得了 2xx 响应代码。但是 GA 界面中没有任何显示(实时或其他方式)。

然后我尝试从我的浏览器中执行 GET...

http://www.google-analytics.com/collect?v=1&tid=UA-XXXXXXXX-1&cid=555&t=event&ec=settings&ea=autopost-on&el=rkAutoPost&ev=5

... 这会立即实时发布到 GA。所以这告诉我这不是消息内容的问题。

请注意,我还创建了一个全新的干净视图以确保没有任何内容被过滤掉...没有帮助。

有什么想法吗?谢谢!

与我读过的关于类似主题的所有其他问题一样,这是一个愚蠢的错误:问题是我确实在 GA 中创建了一个新的、干净的视图,但是当我创建它时我检查了...

Exclude all hits from known bots and spiders

...因此,对 Google App Engine 的调用生成的所有事件都被过滤掉了。呃.

TL:DR; GA 通过 User Agent 请求 header 过滤来自 GAE 的事件。通过测量协议的 ua 参数覆盖 User Agent


Google Analytics (GA) 正在根据包含字符串 "AppEngine-Google; (+http://code.google.com/appengine; appid: APPID)"User Agent header 过滤 Google App Engine (GAE) 流量。我试图将 User Agent 设置为自定义字符串,尽管 as stated here,GAE 将上述字符串附加到任何自定义 User Agent 字符串,这足以让 GA 过滤事件。

其他答案建议通过取消选中 "Exclude all hits from known bots and spiders" Bot Filtering 选项来更新视图设置将允许来自 GAE 的事件,尽管这对我不起作用。无论如何,过滤机器人流量似乎很有用,所以我并不急于取消选中此选项。

解决方案是通过 GAE 未更新的测量协议的 ua 选项覆盖 User Agent。问题中提供的示例的结果参数字符串将是:

v=1&t=event&tid=UA-XXXXXXXX-1&cid=555&ec=settings&ea=autopost-on&el=rkAutoPost&ev=5&ua=Custom%20User%20Agent

其中我的 ua 参数设置为 Custom User Agent

希望这能在将来为某人节省一些时间:)

TL;DR 在浏览器上禁用隐私跟踪扩展

在我的例子中,对 GA 的 POST 请求不是从已部署的 Web 应用程序发出的,但是当我在开发中执行该应用程序时可以看到我,即 locallhost。

浏览器网络选项卡在本地显示对 https://www.google-analytics.com 的调用,但在已部署的应用程序中没有显示。

我在阻止机器人的浏览器上启用了一些隐私跟踪扩展!

如果您需要分析与添加拦截器一起使用,您需要通过第一方代理获取您的分析 javascript 资源。