Chrome extension ajouter javascript externe au html de la page courante

j'ajoute du JavaScript externe à la fin de la page via mon extension chrome. Le JavaScript externe essaie ensuite de renvoyer certaines données au serveur, mais cela n'a pas lieu.

le JavaScript veut obtenir l'url de la page courante et le referrer et le poster de nouveau sur le serveur.

est-ce que n'importe qui peut s'il Vous Plaît me conseiller ce qui ne va pas ici et comment puis-je si ce n'est pas possible de cette façon puis-je poster des données à partir de la page actuelle retour vers serveur.

manifeste.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"]
    }
  ]
}

pour maintenant 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);
})();
22
demandé sur Rob W 2012-04-23 22:10:07

3 réponses

Contenu scripts de faire pas exécuter dans le champ d'application de la page ( voir aussi ), ils sont exécutés dans un contexte entre votre poste et la page web.

puisque les trackers sont du type "Injected script", ceux-ci fonctionnent entièrement dans le contexte de la page web. Mais pas les variables _gaq et Hasync . Par conséquent, les scripts de piste ne peuvent pas lire les variables de configuration.

il y a deux (trois) façons de le réparer.

  1. injectez votre code (tel qu'indiqué dans la question) en utilisant cette méthode . Utiliser cette méthode pour votre but est découragé , parce que votre script écrira une variable globale couramment utilisée. La mise en œuvre de votre script en utilisant cette méthode va break le suivi sur de nombreux sites Web - ne l'utilisez pas .
  2. Fully exécutez le code dans le cadre d'un script de contenu:

    Deux options:
    1. Inclure des fichiers externes dans l'extension
    2. inclut les fichiers externes dans l'extension, plus implémenter une fonction de mise à jour automatique.

Méthode 1: copie entièrement locale

manifest.json (seules les parties pertinentes sont indiquées):

{
  "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 , définir les variables comme suit:

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', '']);

télécharger https://ssl.google-analytics.com/ga.js , et le sauver comme ga.js .

Télécharger http://s10.histats.com/js15_as.js , et le sauver comme js15_as.js .

Méthode 2: injection a Mise à jour GA

si vous voulez avoir une version à jour de GA, une façon alambiquée d'injecter le code doit être utilisée, parce que les scripts de contenu ne peuvent pas être inclus à partir d'une URL externe .

une ancienne version de cette réponse s'est appuyée sur la page d'arrière-plan et chrome.tabs.executeScript à cette fin, mais depuis Chrome 20, une meilleure méthode est devenue disponible: utiliser le chrome.storage API pour mettre en cache le code JavaScript. Pour garder le code à jour, je stockerai une date de "dernière mise à jour" dans le stockage; vous pouvez également utiliser l'API chrome.alarms à la place.

Remarque: N'oubliez pas d'inclure une copie locale du fichier externe dans votre extension, dans le cas où l'utilisateur ne dispose pas d'une connexion internet, etc. sans connexion internet, Google Analytics ne fonctionnerait pas de toute façon.

script de contenu, 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();
}

Minimum fichier manifeste:

{
  "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"]
}

La même méthode peut être utilisée pour d'autres trackers. Le minimum d'exigences en matière d'autorisation:

  • https://ssl.google-analytics.com/ga.js , donc cela devrait être ajouté à la section des permissions. https://*/* ou <all_urls> est également suffisant.
  • optionnel : unlimitedStorage - si vous souhaitez stocker un grand morceau de données avec chrome.storage .
39
répondu Rob W 2017-05-23 11:33:24

j'ai lu à travers ce fil: https://groups.google.com/a/chromium.org/forum/#!topic/chromium-extensions / yc-ouDqfMw0 et trouvé qu'il y a une méthode officielle de chrome pour ajouter le script analytique à la page, et ce n'est pas dans les documents officiels.

vous pouvez vous référer à cette extension pour référence: https://github.com/GoogleChrome/chrome-app-samples/tree/master/analytics et il utilise ce lib: https://github.com/GoogleChrome/chrome-platform-analytics

fondamentalement, vous incluez manuellement le script localement:

  <script src="your_path/google-analytics-bundle.js"></script>
  <script src="main.js"></script>

alors vous appelez quelques fonctions de bibliothèque:

var service, tracker, out;

function initAnalyticsConfig(config) {
  document.getElementById('settings-loading').hidden = true;
  document.getElementById('settings-loaded').hidden = false;

  var checkbox = document.getElementById('analytics');
  checkbox.checked = config.isTrackingPermitted();
  checkbox.onchange = function() {
    config.setTrackingPermitted(checkbox.checked);
  };
}

note: apparemment, vous avez pour avoir une fonction opt out https://github.com/GoogleChrome/chrome-platform-analytics/wiki#add-privacy-support-aka-opt-out

function startApp() {
  // Initialize the Analytics service object with the name of your app.
  service = analytics.getService('ice_cream_app');
  service.getConfig().addCallback(initAnalyticsConfig);

  // Get a Tracker using your Google Analytics app Tracking ID.
  tracker = service.getTracker('UA-XXXXX-X');

  // Record an "appView" each time the user launches your app or goes to a new
  // screen within the app.
  tracker.sendAppView('MainView');
}

window.onload = startApp;
5
répondu awongh 2014-05-18 04:46:33

2015 mise à Jour

La nouvelle Universal Analytics extrait peut certainement gérer plusieurs trackers , donc en supposant que vous donnez le vôtre un nom unique et exécuter tous code google Analytics dans le contexte , vous devriez être bon d'aller.

// add Universal Analytics to the page (could be made conditional)
runFunctionInPageContext(function () {
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o);
  a.async=1;a.src=g;document.documentElement.appendChild(a)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
});

// all Google Analytics calls should use our tracker name  
// and be run inside the page's context
runFunctionInPageContext(function () {
  ga('create', 'UA-12345-6', 'auto', {'name': 'myTracker'});
  ga('myTracker.send', 'pageview'); // note the prefix
});

// simple helper function
function runFunctionInPageContext(fn) {
  var script = document.createElement('script');
  script.textContent = '(' + fn.toString() + '());';
  document.documentElement.appendChild(script);
  document.documentElement.removeChild(script);
}

Note, il y a une légère modification dans l'extrait analytique pour utiliser document.documentElement au lieu du premier <script> élément. C'est parce que google suppose que vous ajoutez analytics dans un bloc de script en ligne, alors que vous l'ajoutez ici à partir d'un script de contenu.

4
répondu galambalazs 2015-10-07 09:29:04