我正在编写一个 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 扩展程序访问它?
我认为这是出于安全原因,因此也尝试修改 list 以包含以下内容,但仍然没有成功
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'"
我想第二个问题是:
我正在尝试以我正在使用的方式实现可能的目标(我已经设法使用页面内容的正则表达式匹配来获得类似的结果,但希望直接访问对象)
最佳答案
这与内容安全策略无关。我认为您正在将内容脚本注入(inject)网页并尝试访问网页中的变量。由于内容脚本是在孤立的世界中执行的,因此您无法直接执行此操作。请参阅https://developer.chrome.com/trunk/extensions/content_scripts.html#execution-environment了解更多详情。
要访问网页中的变量(在您的情况下是必要的),您必须在页面中注入(inject) <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 来代替。
关于javascript - 从 Chrome 扩展程序访问 Google Analytics window._gaq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15166510/