从Chrome扩展程序中获取谷歌分析API的数据?

时间:2015-09-18 13:22:48

标签: javascript api google-chrome google-chrome-extension google-analytics

我正在尝试开发一个表单放弃热映射器

function newMarkup(id, uniqueHits){
var min = Math.min.apply(null,uniqueHits);
var max = Math.max.apply(null,uniqueHits);
var med = max / 2;
for(var num = 0; num < id.length; num++){
    styleElement(id[num], uniqueHits[num], min, max, med);
}}

function styleElement(element, value, min, max, med){
    var el = $("[id$=" + element + "]");
    if(el.prop('nodeName') === "INPUT"){
        if(value == max){
            el.addClass('very-good');
        }
        if(value < max && value > med){
            el.addClass('good');
        }
        if(value == med){
            el.addClass('average');
        }
        if(value < med && value > min){
            el.addClass('not-so-good');
        }
        if(value == min){
            el.addClass('poor');
        }
    } else {
        el = el.next();
        if(value == max){
            el.addClass('very-good');
        }
        if(value < max && value > med){
            el.addClass('good');
        }
        if(value == med){
            el.addClass('average');
        }
        if(value < med && value > min){
            el.addClass('not-so-good');
        }
        if(value == min){
            el.addClass('poor');
        }
    }
}

我想知道是否可以通过chrome扩展程序调用api?

基本上我正在尝试执行此调用以获取数据:

gapi.client.analytics.data.ga.get({
    'ids': 'ga:' + profileId,
    'start-date': '7daysAgo',
    'end-date': 'today',
    'metrics': 'ga:uniqueEvents',
    'dimensions': 'ga:eventLabel',
    'sort':'-ga:uniqueEvents',
    'filters': "ga:eventCategory==Form Field Tracking - /join"
})

我尝试通过在MVC Web应用程序中使用iFrame来创建我的热图,但由于尝试跨域发送数据的麻烦,我放弃了。

我想知道是否可以从chrome扩展程序中获取分析API的数据?我想它必须以与谷歌脚本如何使用分析API(使用服务帐户)类似的方式完成,但我无法找到任何文档或查明是否可能。 (脚本中的代码示例)

function runReport(profileId) {
    var today = new Date();
    var oneWeekAgo = new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000);

    var startDate = Utilities.formatDate(oneWeekAgo, Session.getTimeZone(), 'yyyy-MM-dd');
    var endDate = Utilities.formatDate(today, Session.getTimeZone(), 'yyyy-MM-dd');
    var tableId  = 'ga:' + profileId;
    var metric = 'ga:uniqueEvents';
    var options = {
        'dimensions': 'ga:eventLabel',
        'sort':'-ga:uniqueEvents',
        'filters': "ga:eventCategory==Form Field Tracking - /join"
    };
    var report = Analytics.Data.Ga.get(tableId, startDate, endDate, metric, options);
}

我非常感谢任何人对我有任何帮助或建议。我正在尝试从Chrome扩展程序查询google analytic的API。这可能吗?

1 个答案:

答案 0 :(得分:0)

未在GA上进行过专门测试,但这是处理需要API外部服务器的脚本的一般方法:

  1. 内容脚本无法向其他网站发出请求,因此应通过sending a message
  2. 询问后台页面。
  3. 后台页面包含清单中引用的ga.js脚本,此文件必须出现在扩展程序中,它不是远程加载的脚本。
  4. 我们添加corresponding CSP rule(在清单中添加)后,后台页面可以与外部API服务器通信
  5. 现在,后台页面侦听器接收来自步骤1的消息,后者调用GA并将结果发送回原始选项卡的内容脚本(收到第一条消息时保存tabId)。 / LI>
    • 的manifest.json:

      "content_scripts": [
          {
              "matches": ["<all_urls>"],
              "run_at": "document_start",
              "all_frames": true,
              "js": ["content.js"]
          }
      ],
      "background": {
          "scripts": ["background.js", "ga.js"]
      },
      "content_security_policy": 
          "script-src 'self' https://ssl.google-analytics.com; object-src 'self'",
      .............
      
    • content.js:

      chrome.runtime.sendMessage({type: "getGA", data: some_data_for_GA});
      chrome.runtime.onMessage.addListener(function(msg) {
          if (msg.type == "GA") {
              // apply msg.data to the page elements
              ...................
          }
      });
      
    • background.js:

      chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
          var tabId = sender.tab.id, frameId = sender.frameId;
          if (msg.type == "getGA") {
              gapi.client.analytics.data.ga.get({
                  ..................... // use msg.data if needed
              }).execute(function(response) {
                  sendMessageToFrameId(tabId, frameId, {type: "GA", data: response});
              });
          }
      });
      
      function sendMessageToFrameId(tabId, frameId, msg) {
          // 1. frameId works since Chrome 41 and throws on prior versions
          // 2. without frameId Chrome 45 sends the message to wrong tabs
          try { chrome.tabs.sendMessage(tabId, msg, {frameId: frameId}); }
          catch(e) { chrome.tabs.sendMessage(tabId, msg); }
      }