【问题标题】:Accessing Google Analytics window._gaq from Chrome Extension从 Chrome 扩展程序访问 Google Analytics window._gaq
【发布时间】:2013-03-01 20:40:45
【问题描述】:

我正在编写一个 chrome 扩展程序,主要用于学习目的,如果安装了 Google Analytics,它将向我显示 Google Analytics 跟踪 ID (UA-xxxxxx-x)。

我了解我需要使用 sendRequest 到页面中的内容脚本来检索信息,并且已成功实现该功能

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
    // analytics request check GA and send back
    if(request.requestDetail == "analytics") {

    console.log(window._gaq);
    console.log(window._gaq._getAsyncTracker()._getAccount());

    // unknown response, send back nothing!
    } else {
        sendResponse({}); 
    }
});

侦听器正在接收请求,Google Analytics(分析)肯定安装在我正在测试的网页上,window._gaq 和 window._gaq._getAsyncTracker()._getAccount() 都可以通过控制台访问并返回我所期望的。

为什么通过监听器访问时window._gaq未定义?我应该如何从 chrome 扩展程序访问它?

我知道这是出于安全原因,因此也尝试修改清单以包含以下内容,但仍然没有运气

"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'"

我想第二个问题是:

我正在尝试以我使用的方式实现的目标(我已经设法在页面内容上使用正则表达式匹配获得了类似的结果,但想直接访问对象)

【问题讨论】:

    标签: javascript google-chrome google-chrome-extension google-analytics


    【解决方案1】:

    这与内容安全政策无关。我认为您正在将内容脚本注入网页并尝试访问网页中的变量。由于内容脚本是在一个孤立的世界中执行的,因此您无法直接执行此操作。详情请参阅https://developer.chrome.com/trunk/extensions/content_scripts.html#execution-environment

    要访问网页中的变量(在您的情况下是必需的),您必须在页面中注入

    这是一个简单的例子(免责声明:只是为了说明如何做。我自己没有测试。):

    window.addEventListener("message", function(event) {
     if (event.source != window)
      return;
    if (event.data.type && (event.data.type == "FROM_PAGE")) {
      chrome.extension.sendMessage(...); // Send analytics ID (in event.data.googleAnalyticsId) to your extension here
    }, false);
    var script = document.createElement('script');
    script.appendChild(document.createTextNode('window.postMessage({googleAnalyticsId: (window._gaq ? window._gaq._getAsyncTracker()._getAccount() : ""), type: "FROM_PAGE"}, "*");');
    document.appendChild(script);
    

    另请注意,chrome.extension.onRequest/sendRequest 已被弃用很长时间 (https://developer.chrome.com/trunk/extensions/whats_new.html#20)。您应该改用 onMessage/sendMessage。

    【讨论】:

      【解决方案2】:

      虽然我对这个并不特别自豪,但它确实有效;我认为如果不向页面中注入另一个脚本,您就无法访问页面上的变量。

      var find_ga_account = function(){
          var scripts = document.querySelectorAll('script:not([src])'),
              i = 0,
              match,
              ua = false;
      
          for( ; i < scripts.length; i++){
              match = scripts[i].textContent.match(/_setAccount['"]+,[\s]?['"]+(.*)['"]+/)
              if(match && match.length > 0){
                  ua = match[1];
              }
          }
          return ua;
      }
      

      【讨论】:

        猜你喜欢
        • 2010-11-29
        • 2013-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-13
        • 2013-03-15
        • 2017-03-08
        • 2012-01-09
        相关资源
        最近更新 更多