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