Facebook 上的 data-lynx-uri 链接

Facebook 上的 data-lynx-uri 链接

我很久以前就注意到,Facebook 上发布的链接以某种方式被扭曲了。如果我将鼠标悬停在链接或页面预览上,我的浏览器(在本例中为 Mac 版 Safari)将显示粘贴在帖子中的预期链接(例如http://www.example.com/)。但是,如果我右键单击并复制链接,然后将其粘贴到某个新选项卡的地址栏中,URI 就会大不相同:它将类似于https://l.facebook.com/l.php?u=http%3A%2F%2Fwww.example.com%2F&h=xxxxxwhere ,xxxx实际上是一个唯一标识符,毫无疑问链接到我的帐户和其他任何东西。我假设 Facebook 使用它来跟踪人们点击的内容。我想知道他们是否试图通过使用浏览器不显示有效跟踪链接的方案来“隐藏”这一事实。我查看了 HTML 源代码,看起来标签a使用正确的 URI 作为其href属性,但它有两个附加属性,data-lynx-mode具有值origin(从我所见,可能还有其他属性),data-lynx-uri其中包含实际复制并在用户交互时跟踪的链接,即我上面提到的链接。我在网上快速搜索了一下,没有找到太多关于这些属性的文档——但它们似乎主要(如果不是唯一的话)用于与 Facebook 链接相关——尽管浏览器似乎以特定的方式对它们做出反应,但由于状态栏中显示的内容与复制到剪贴板的内容不同,因此有些不一致。有人有关于它们的更多信息吗?它们可能只是专有的,并被一些 JavaScript 代码使用,从而覆盖正常的链接跟踪?它们可以被“忽略”,以便浏览器改为跟踪正确的链接,而不会提供给 Facebook 的分析机器吗?

感谢您的想法!

编辑

stachu 的答案很有效(使用 Tampermonkey for Safari,单击链接时直接转到原始页面),但对于我的特定用途来说还不够:我使用不同的浏览器浏览 Facebook 和常规浏览(称之为偏执),我通常会从 Safari 复制链接并在其他浏览器中打开它。右键单击并从 Safari 中选择“复制链接”仍然会获取跟踪链接,而不是实际的href。我试图找出当我这样做时会发生什么,也许一些 javascript 会捕获该操作并混淆链接,或者 Safari 是否默认data-lynx-uri在存在时复制它??

编辑2

Facebook 确实在链接上来回切换,在右键单击时将href属性值更改为内容data-lynx-uri,并在将鼠标悬停在元素上时将其设置回其原始值 - 在我看来,他们真的只是试图混淆显示并欺骗用户看不到重定向。我试图捕捉右键单击并使用 javascript/Tampermonkey 恢复链接的值,但出于某种原因,我的函数没有被调用 :-|。

document.addEventListener('contextmenu', function(e) {
    Array.from(e.target.attributes).filter(attribute => attribute.name.startsWith("data-lynx-")).forEach(attribute => e.target.removeAttribute(attribute.name));
    var href = e.target.getAttribute("href");
    var regex = /^https:\/\/l\.facebook\.com\/l\.php\?u=(http.*?)&.*$/;
    var match = regex.exec(href);
    if(match[1]) {
        var uri = match[1].replace(/%3A/g, ':').replace(/%2F/g, '/').replace(/%26/g, '&').replace(/%3D/g, '=').replace(/%3F/g, '?');
        e.target.setAttribute("href", uri);
    }
}, false);

答案1

您可以使用以下方式将自己的脚本添加到 Facebook 网站:油脂猴如果您使用 FireFox。

每次点击时触发的示例脚本

document.addEventListener('click', event => {
    let target = event.target;

    if (target.tagName.toLowerCase() === "a") {
        Array.from(target.attributes).filter(attribute => attribute.name.startsWith("data-lynx-")).forEach(attribute => target.removeAttribute(attribute.name));
    }
})

如果目标元素(您单击的)是链接(a标签),则脚本会删除data-lynx-*属性。

您应该检查某些脚本是否已将href属性更改为 Facebook 跟踪链接(域l.facebook.com),并将此案例添加到您的脚本中。

您应该检查该脚本是否能够在使用 AJAX 添加内容的情况下正常工作。

答案2

许多网站都使用了这种技术。本文解释它们的工作原理以及如何解决这个问题。 这个视频还解释了整个过程。请注意,Facebook 和 Google 在 2019 年 4 月左右改变了他们的跟踪方法

相关内容