用户脚本不在 Facebook "Like" iframe 中执行

Userscript does not execute in Facebook "Like" iframe

根据 ,我应该能够通过指定匹配 URL 来让用户脚本在 iframe 中工作。但是,如果 Facebook 的 iframe 嵌入按钮,它对我不起作用 - 比如 - codeforces.com.

作为 MVCE,这里有一个小脚本:

// ==UserScript==
// @name         Bug test
// @version      0.1
// @author       Gaurang Tandon
// @match        https://codeforces.com/*
// @match        https://www.facebook.com/v2.8/plugins/like.php
// @match        https://www.facebook.com/v2.8/plugins/like.php/
// @match        https://www.facebook.com/v2.8/plugins/like.php/*

// ==/UserScript==

(function() {
    'use strict';

    console.log(window.location.hostname);
}();

在 codeforces.com 上加载它只会在 DevTools 控制台中提供一条日志语句,即 codeforces.com。删除其中的一两个 @match 指令不会有任何改变。

为什么脚本不在那个 iframe 中 运行?

首先 MCVE 有几个问题:

  1. @match需要:

    // @match  https://www.facebook.com/v2.8/plugins/like.php*
    

    因为典型的 URL 是这样的:www.facebook.com/v2.8/plugins/like.php?app_id...

  2. 最后一行存在语法错误。它是 }(); 它需要是 } ) ();
    如果您查看控制台或使用 Tampermonkey 编辑器菜单中的 Developer -> 运行 syntax check,您会发现。

接下来,Tampermonkey 试图保护您 免于这种愚蠢行为默认将某些站点列入黑名单
以 Facebook 为例:

  1. Facebook 无处不在向其小部件、脚本、图像和 iframe 发送垃圾邮件。如果每个实例上的脚本 运行 可能会降低许多站点的性能。 (就个人而言,使用 uMatrix 和 uBlock 等工具可以完全关闭 Facebook 和类似网站。)
  2. Facebook 小部件是恶意脚本编写者的主要目标。因此,由于很少有合理的理由编写这些脚本,Tampermonkey 会默认尝试阻止它们。


您可以通过以下方式查看 Tampermonkey 试图阻止的内容

  1. 转到 Tampermonkey 设置。

  2. 配置模式设置为"Beginner"或"Advanced":

  3. 向下滚动到“安全”。

  4. 列入黑名单的页面框中,您可能会看到如下行:

    *://www.facebook.com/plugins/*
    *://www.facebook.com/*/plugins/*
    
  5. 删除停止所需执行的行,然后按该文本框的 保存 按钮。