javascript检查用户是否安装了Chrome扩展程序

2,016 阅读3分钟

需要一个外部JavaScript脚本来检测用户是否安装了我的扩展程序。

一、

Chrome现在可以将邮件从网站发送到扩展程序。

所以在扩展background.js(content.js不起作用)中添加如下内容:

chrome.runtime.onMessageExternal.addListener(
    function(request, sender, sendResponse) {
        if (request) {
            if (request.message) {
                if (request.message == "version") {
                    sendResponse({version: 1.0});
                }
            }
        }
        return true;
    });

然后,您可以通过网站拨打电话:

var hasExtension = false;

chrome.runtime.sendMessage(extensionId, { message: "version" },
    function (reply) {
        if (reply) {
            if (reply.version) {
                if (reply.version >= requiredVersion) {
                    hasExtension = true;
                }
            }
        }
        else {
          hasExtension = false;
        }
    });

然后,您可以检查hasExtension变量。 唯一的缺点是调用是异步的,所以你必须以某种方式解决这个问题。

编辑:如下所述,您需要在manifest.json中添加一个条目,列出可以向您的插件发送消息的域。 例如:

"externally_connectable": {
    "matches": ["*://localhost/*", "*://your.domain.com/*"]
},

二、

我确信有一种直接的方法(直接调用扩展中的函数,或者使用扩展的JS类),但是间接方法(直到更好的方式出现):

让您的Chrome扩展程序在页面上查找特定的DIV或其他元素,并使用非常具体的ID。

例如:

<div id="ExtensionCheck_JamesEggersAwesomeExtension"></div>

执行getElementById并将innerHTML设置为您的分机的版本号或其他内容。 然后,您可以阅读该客户端的内容。

直接方法:

var myPort=chrome.extension.connect('yourextensionid_qwerqweroijwefoijwef', some_object_to_send_on_connect);

三、

公开Web可访问资源,但这将允许任何网站测试您的扩展是否已安装

假设您的扩展程序ID为runtime.getURL(),并在扩展程序的文件中添加文件(例如,透明像素图像)为test.png。

然后,使用runtime.getURL()清单键将此文件公开到网页:

// 在manifest.json里
 "web_accessible_resources": [
    "test.png",
    "icon/*"  // 可以访问icon文件夹下所有文件
  ],

在您的网页中,您可以尝试通过其完整URL(在runtime.getURL()标记中,通过XHR或以任何其他方式)加载此文件:

chrome-extension://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/test.png

如果文件加载,则安装扩展。 如果加载此文件时出错,则表示未安装扩展程序。

// Code from https://groups.google.com/a/chromium.org/d/msg/chromium-extensions/8ArcsWMBaM4/2GKwVOZm1qMJ
function detectExtension(extensionId, callback) { 
  var img; 
  img = new Image(); 
  img.src = "chrome-extension://" + extensionId + "/test.png"; 
  img.onload = function() { 
    callback(true); 
  }; 
  img.onerror = function() { 
    callback(false); 
  };
}

值得注意的是:如果加载此文件时出错,则表示网络堆栈错误将出现在控制台中,不可能使其静音。 当Chromecast使用这种方法时,由于这个原因引起了相当多的争议; 最简单的解决方案是将Chrome团队完全将Dev Tools中的特定错误列入黑名单。

重要说明:此方法在Firefox WebExtensions中不起作用。 Web可访问资源固有地将扩展名暴露给指纹识别,因为通过知道ID可以预测URL。 Firefox决定通过为Web可访问资源分配特定于实例的随机URL来关闭该漏洞:

然后可以使用以下URL访问这些文件:

runtime.getURL()

此UUID是为每个浏览器实例随机生成的,不是您的扩展程序ID。 这可以防止网站对用户安装的扩展名进行指纹识别。

但是,虽然扩展程序可以使用runtime.getURL()来获取此地址,但您无法在您的网站中对其进行硬编码。

来源链接: www.itranslater.com/qa/details/…