2

私は、主に学習目的でChrome拡張機能を作成しています。これは、GoogleAnalyticsがインストールされている場合にGoogleAnalyticsの追跡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({}); 
    }
});

リスナーはリクエストを受信して​​います。GoogleAnalyticsはテストしているウェブページに確実にインストールされています。window._gaqとwindow._gaq._getAsyncTracker()._ getAccount()はどちらもコンソールからアクセスでき、期待どおりの結果を返します。

リスナーを介してアクセスするときにwindow._gaqが未定義なのはなぜですか?Chrome拡張機能からどのようにアクセスする必要がありますか?

これにはセキュリティ上の理由があると思いますので、マニフェストを変更して以下を含めるようにしましたが、それでも運がありません

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

二次的な質問は次のようになると思います。

私が使用している方法で可能なことを達成しようとしています(ページのコンテンツで正規表現マッチングを使用して同様の結果を得ることができましたが、オブジェクトに直接アクセスしたいと思います)

4

2 に答える 2

4

これは、コンテンツセキュリティポリシーとは何の関係もありません。コンテンツスクリプトをWebページに挿入し、Webページの変数にアクセスしようとしていると思います。コンテンツスクリプトは孤立した世界で実行されるため、これを直接実行することはできません。詳細については、 https://developer.chrome.com/trunk/extensions/content_scripts.html#execution-environmentを参照してください。

Webページの変数にアクセスするには(この場合は必要です)、ページに<script>タグを挿入する必要があります。そのスクリプトでGoogleAnalyticsIDを取得し、コンテンツスクリプト(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 に答える