2

我正在编写Chrome扩展程序,主要用于学习目的,如果安装了Google Analytics(分析),则会向我显示Google分析跟踪ID(UA-xxxxxx-x)。从Chrome扩展程序访问Google Analytics window._gaq

我明白,我需要使用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({}); 
    } 
}); 

侦听器接收到请求,谷歌分析是肯定的安装我正在测试的网页,window._gaq和window._gaq._getAsyncTracker()._ getAccount()都可以通过控制台访问,并返回我期望的结果。

为什么window._gaq在通过侦听器访问时未定义?我应该如何从Chrome扩展中访问它?

我有一个想法,存在安全原因所以也尝试修改清单包括以下但仍没有运气

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

我想一个次要的问题是:

是什么,我想在我使用的方式来实现可能的(我已成功使用页面的内容,正则表达式匹配得到了类似的结果,而是想直接访问的对象)

回答

4

这没有关系o使用内容安全策略。我认为你正在向网页注入内容脚本并试图访问网页中的变量。由于内容脚本在孤立的世界中执行,因此不能直接执行此操作。有关更多详细信息,请参阅https://developer.chrome.com/trunk/extensions/content_scripts.html#execution-environment

要访问网页中的变量(在您的情况下是必需的),您必须在页面中注入一个<脚本>标记。在该脚本中检索Google AnalyticsID,并与内容脚本(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。

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; 
}