2

我正在编写一个 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'"

我想第二个问题是:

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

4

2 回答 2

4

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

要访问网页中的变量(在您的情况下是必需的),您必须在页面中注入 <script> 标记。在该脚本中检索 Google Analytics ID,并与内容脚本 ( https://developer.chrome.com/trunk/extensions/content_scripts.html#host-page-communication ) 进行通信,以让内容脚本将其发送回您的扩展程序.

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

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。

于 2013-03-08T21:54:08.600 回答
0

尽管我对此并不感到特别自豪,但它确实有效;我认为如果不将另一个脚本注入页面,您就无法访问页面上的变量。

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;
}
于 2013-03-09T05:01:22.490 回答