我目前正在尝试检测用户是否安装了某个Chrome扩展程序。 Chrome扩展程序不是我自己的,我没有源代码。我已经在很多帖子中尝试了方法,但它们都失败了。我已经尝试过以及失败的原因详述如下。
这导致无法读取未定义'的属性连接。执行时:
var myPort=chrome.extension.connect('idldbjenlmipmpigmfamdlfifkkeaplc', some_object_to_send_on_connect);
尝试按如下方式加载扩展程序的资源以测试它是否存在,但在浏览器中转到此网址会导致找不到您的文件' Chrome错误页面(请注意,我在Windows本地计算机上转到C:\ Users \\ AppData \ Local \ Google \ Chrome \ User Data \ Default \ Extensions \ idldbjenlmipmpigmfamdlfifkkeaplc \ 1.0.0.1_0 \找到此路径):
chrome-extension://idldbjenlmipmpigmfamdlfifkkeaplc/1.0.0.1_0/icon_16.png
使用Chrome管理,但这会导致控制台错误,无法读取未定义的属性get'执行时
chrome.management.get("idldbjenlmipmpigmfamdlfifkkeaplc", function(a){console.log(a);});
我遇到的大多数其他答案似乎都涉及扩展程序是由试图检查它的同一个人编写的。
答案 0 :(得分:4)
connect
/ message
方法意味着它希望从中连接起源列表中的扩展名specifically listed your website。除非您自己编写此扩展,否则这不太可能,因为这不是通配符域。
从web上下文引用扩展名中的文件将返回404 模拟网络错误,除非扩展名为declared them as web-accessible。这曾经在2012年之前工作,但Google将其作为指纹识别方法关闭 - 现在扩展必须明确列出可以访问的资源。 您特别提及的扩展程序未列出任何文件可通过网络访问,因此此路由也已关闭。
chrome.management
是一个扩展API;网站根本无法使用它。
最后,如果扩展程序的内容脚本以某种方式修改了您网页的DOM,您可以检测到这些更改。但它不是很可靠,因为内容脚本可以改变它们的逻辑。 同样,在您的特定情况下,扩展程序会侦听DOM事件,但无论如何都不会明确接收到该事件 - 因此此路由已关闭。
请注意,通常情况下,您无法确定内容脚本代码是否与runs in an isolated context一起运行。
总而言之,这个问题没有神奇的解决方案。扩展必须合作才能被发现,你无法绕过它。
将connect
/ message
方法默认列入所有扩展程序的原始白名单;但是,要实现此功能,目标扩展程序需要收听onConnectExternal
或onMessageExternal
事件,这不常见。
Web访问资源对来自其他扩展的访问具有相同的限制,因此情况并不好。
使用您自己的内容脚本观察页面是否有变化是可能的,但同样可能没有可观察的页面,您不能依赖这些更改始终是相同的。
与扩展网页交互类似,来自不同扩展的内容脚本在隔离的上下文中运行,因此无法直接“捕获”正在运行的代码。
来自扩展程序的 chrome.management
API是检测正在安装的第三方扩展程序的唯一方法,但请注意requires "management"
permission及其可怕的警告。