26

Chrome 拡張機能を使用して、外部 JavaScript をページの最後に追加しています。次に、外部 JavaScript はデータをサーバーに戻そうとしますが、それは行われません。

JavaScript は、現在のページの URL とリファラーを取得し、それをサーバーに送り返したいと考えています。

ここで何が問題なのか、現在のページからサーバーにデータを戻すことができない場合は、どうすればよいかアドバイスしてください。

マニフェスト.json

{
  "name": "Website Safety",
  "version": "1.0",
  "manifest_version": 2,
  "description": "The Website Safety Extension.",
  "browser_action": {
    "name": "View the website information for ",
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  },
  "permissions": [
    "tabs", "http://*/*", "https://*/*"
  ],
  "background": {
  //  "scripts": ["refresh.js"]
    "page": "background.html"
  },
  "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'",
  //"background_page": "background.html"

  "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["contentScript.js"]
    }
  ]
}

とりあえず contentScript.js

var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-31046309-1']);
_gaq.push(['_setAllowLinker', true]);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
//ga.src = 'https://ssl.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();

var _Hasync= _Hasync|| [];
_Hasync.push(['Histats.start', '1,1342541,4,0,0,0,00000000']);
_Hasync.push(['Histats.fasi', '1']);
_Hasync.push(['Histats.track_hits', '']);
(function() {
var hs = document.createElement('script'); hs.type = 'text/javascript'; hs.async = true;
hs.src = ('http://s10.histats.com/js15_as.js');
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(hs);
})();
4

3 に答える 3

44

コンテンツ スクリプトはページの範囲内では実行されず(も参照)、拡張機能と Web ページの間のコンテキストで実行されます。

トラッカーは「注入されたスクリプト」タイプであるため、これらは Web ページのコンテキストで完全に実行されます。しかし、変数_gaqHasync変数はそうではありません。その結果、トラック スクリプトは構成変数を読み取ることができません。

修正するには 2 つ (3 つ) の方法があります。

  1. このメソッドを使用して (質問に投稿されたように) コードを挿入します。スクリプトは一般的に使用されるグローバル変数を上書きするため、このメソッドを目的に使用することはお勧めできません。このメソッドを使用してスクリプトを実装すると、多くの Web サイトでトラッキングが中断されます。使用しないでください
  2. コンテンツ スクリプトの範囲内でコードを完全に実行する:
    2 つのオプション:
    1. 拡張子に外部ファイルを含める
    2. 拡張機能に外部ファイルを含め、さらに自動更新機能を実装します。

方法 1: 完全ローカル コピー

manifest.json(関連する部分のみが示されています):

{
  "name": "Website Safety",
  "version": "1.0",
  "manifest_version": 2,
  "description": "The Website Safety Extension.",
  "permissions": [
    "tabs", "http://*/*", "https://*/*"
  ],
  "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["ga-config.js", "ga.js", "js15_as.js"]
    }
  ]
}

ga-config.js、次のように変数を定義します。

var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-31046309-1']);
_gaq.push(['_setAllowLinker', true]);
_gaq.push(['_trackPageview']);

var _Hasync= _Hasync|| [];
_Hasync.push(['Histats.start', '1,1342541,4,0,0,0,00000000']);
_Hasync.push(['Histats.fasi', '1']);
_Hasync.push(['Histats.track_hits', '']);

https://ssl.google-analytics.com/ga.jsをダウンロードし、名前を付けて保存しga.jsます。http://s10.histats.com/js15_as.js
を ダウンロードし、名前を付けて保存します。js15_as.js

方法 2: 最新の GA を挿入する

GA の最新バージョンが必要な場合は、外部 URL からコンテンツ スクリプトを含めることができないため、複雑な方法でコードを挿入する必要があります。

この回答の古いバージョンは、この目的のためにバックグラウンド ページに依存していましたが、Chrome 20 以降、 API を使用して JavaScript コードをキャッシュするchrome.tabs.executeScriptというより良い方法が利用できるようになりました。chrome.storageコードを最新の状態に保つために、「最終更新」のタイムスタンプをストレージに保存します。chrome.alarms代わりに API を使用することもできます。

注: ユーザーがインターネットに接続していない場合などに備えて、拡張機能に外部ファイルのローカル コピーを含めることを忘れないでください。インターネットに接続していない と、Google アナリティクスは機能しません。

コンテンツ スクリプト、activate-ga.js.

var UPDATE_INTERVAL = 2 * 60 * 60 * 1000; // Update after 2 hour

// Retrieve GA from storage
chrome.storage.local.get({
    lastUpdated: 0,
    code: ''
}, function(items) {
    if (Date.now() - items.lastUpdated > UPDATE_INTERVAL) {
        // Get updated file, and if found, save it.
        get('https://ssl.google-analytics.com/ga.js', function(code) {
            if (!code) return;
            chrome.storage.local.set({lastUpdated: Date.now(), code: code});
        });
    }
    if (items.code) // Cached GA is available, use it
        execute(items.code);
    else // No cached version yet. Load from extension
        get(chrome.extension.getURL('ga.js'), execute);
});

// Typically run within a few milliseconds
function execute(code) {
    try { window.eval(code); } catch (e) { console.error(e); }
    // Run the rest of your code.
    // If your extension depends on GA, initialize it from here.
    // ...
}

function get(url, callback) {
    var x = new XMLHttpRequest();
    x.onload = x.onerror = function() { callback(x.responseText); };
    x.open('GET', url);
    x.send();
}

最小のマニフェスト ファイル:

{
  "name": "Website Safety",
  "version": "1.0",
  "manifest_version": 2,
  "permissions": [
    "tabs", "http://*/*", "https://*/*"
  ],
  "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["activate-ga.js"]
    }
  ],
  "web_accessible_resources": ["ga.js"]
}

他のトラッカーにも同じ方法を使用できます。許可の最小要件:

  • https://ssl.google-analytics.com/ga.jsであるため、権限セクションに追加する必要があります。https://*/*または<all_urls>でも十分です。
  • オプション: unlimitedStorage- で大量のデータを保存する場合chrome.storage
于 2012-04-29T09:19:00.130 に答える