你好!我想将所有外部链接(如果无法过滤,则包括所有链接)重定向到类似 exit.website.tld/?page={{URL}} 的地址。Discourse 支持这个功能吗?如果不支持,是否有相关插件?我已经搜索过,但使用目前的搜索关键词没有找到合适的插件。这类似于 Steam 的做法(示例)。
我也一直在思考这个问题;我想在所有外部链接后附加互联网档案馆的存档 URL,而且说实话:如果能按类别设置那就太酷了。
我猜应该可以通过插件实现某种过滤功能,但大家在使用主题组件时似乎会突破数据处理的规则。如果目前还无法实现,大家会倾向于通过插件还是主题组件来添加这个功能呢?
我们认为这有点像是一种对不友好的用户功能(类似于“论坛签名”),因此它需要作为一个插件来实现。不确定是否可以通过主题组件来实现?
我之前见过类似的请求,通常与安全相关,比如:
哦不!你即将访问一个超链接指向的网站!你准备好面对不可思议的危险了吗?!?!
我_猜_在某些极其罕见的社区和情境下,这可能说得通……呃……我猜?
我负责一个网站归档分类。我们的使用场景非常具体,甚至有点“懒”。![]()
另外,我认为网页存档代理类似于在消息中抓取图片的副本,但再次强调,我负责一个网站归档分类。![]()
在我看来,这实际上可能确实是一个安全问题。当然,在 Discourse 元论坛或某些编程论坛上,人们知道如何区分 URL 等,但在那些不太专注于技术的论坛(尤其是面向非技术工作、学校等的论坛)上,许多人可能不会注意到他们访问的是一个看起来相同但顶级域名(TLD)不同,甚至域名完全不同的网站。
虽然这当然对某些论坛来说可能显得不友好,但没人说它必须默认启用。你可以将其设计为一个复选框,点击后由 Discourse 自身提供页面,或直接链接到自定义页面。
在我看来,这更像是一个应该直接集成在 Discourse 中的核心功能,但当然,这只是我个人的看法。
Jeff 已明确表示,这必须是一个插件(除非可以在主题中实现,这似乎很有可能)。历史经验表明,如果你开发了登录功能,并且有数百个网站希望使用它,其中包括数十家企业客户,那么它很可能在几年内就会成为官方插件。
但是,如果它确实可以在主题中实现(我认为这是可能的),那么可以说 Discourse 已经支持该功能,你只需要一个主题来实现它!你可以查看 Discourse 主题开发者指南,或者在 Marketplace 频道发帖并附上预算。我猜测费用至少为 1000 美元,但也可能我猜错了。
虽然我没有使用 Discourse 主题等的经验,但我具备基础的 JavaScript 和 HTML 知识。像这样的工作不应该超过 10 到 20 分钟。为什么需要 1000 美元的预算?
如果你能在二十分钟内完成,那你早就该做完了。我还在 JavaScript 和 Ember 方面不太熟练,也许这比我想象的容易得多。我觉得这需要好几个小时的工作量。
请贴出你主题链接!我迫不及待想看看了。
大约 5 分钟后,我得到了可用的 JS 代码(虽然还需要一些改进,但已经可以运行了;顺便一提,只有 10 行)。现在我唯一需要弄清楚的是如何在页面加载后运行这段代码…
太棒了!很高兴这么容易!那类事情通常要花我大量时间。我通常更擅长预估它应该花多长时间。
通常情况下,该脚本只是检查当前是否在文章页面上,遍历所有 <article> 标签,找到其中实际的内容标签,再遍历其中的所有 <a> 标签,如果其 href 不是官方网址(使用一些基础的正则表达式判断),就在其前面添加退出页面 URL。
但我仍在努力解决如何在页面加载完成且所有动态内容(例如帖子)加载完毕之后才运行 JS 代码的问题。一个临时的解决方案是延迟 1-2 秒再执行代码,但这并不是最佳方案,而且对某些用户来说,加载时间可能更长……
[quote=“pfaffman, 帖子:7, 主题:146798”]
Jeff 已明确表示,这需要作为一个插件来实现(除非能在主题中完成,这似乎很有可能)。[/quote]
这当然可以作为主题组件来实现,但请记住,如果你希望它也能影响爬虫视图,就必须将其做成插件。
你正在寻找的功能被称为“帖子装饰器”(post decorator)。它是一个钩子,允许你在每个帖子渲染之前运行脚本。它是 插件 API 的一部分。
现在,关于你想做的事情(重定向所有外部链接)。我认为增加这么多摩擦并不是个好主意,所以我无法在这方面帮助你——况且你已经自己解决了那部分问题。不过,这里有一个带注释的示例,展示如何创建一个针对帖子中所有外部链接的设置。
这段代码应放在你的主题/主题组件的 header 部分:
<script type="text/discourse-plugin" version="0.8">
// 存储主机名以便重复使用。
const siteHostname = location.hostname;
// 让我们创建一个装饰器,在每个帖子中执行此操作
api.decorateCooked(
post => {
// 帖子中有链接吗?
const links = [...post[0].querySelectorAll("a")];
// 如果没有链接,直接退出。
if (!links.length) return;
// 有链接,让我们过滤它们,只获取外部链接
const externalLinks = links.filter(
link => link.hostname !== siteHostname
);
// 如果有外部链接,我们可以做一些处理。例如,我们可以
// 为每个外部链接添加一个类,如下所示。
externalLinks.forEach(link => {
link.classList.add('external-link');
// 在这里做更多处理。
});
},
// 我们给装饰器一个 ID 以防止内存泄漏。
{ id: "external-link-decorator" }
);
</script>
再次强调,重定向用户会带来太多摩擦,很快就会让人厌烦。因此,我建议你考虑其他方法,比如在外部链接旁边添加一个微妙的图标,并教导你的用户其含义,怎么样?
我认为这种使用场景更适合通过插件或外部集成(利用帖子创建/编辑的 webhook)来更好地实现,这样可以确保所有链接的网站都被妥善保存,无论是否有人点击过它们。
3 个帖子被拆分为新主题:在新标签页中打开外部链接时出现问题

