通过 Javascript 将 Discourse 评论嵌入到另一个网站上

是否有办法通过嵌入 Discourse 的页面找到关联的话题 ID 或 Discourse URL?我们希望在包含嵌入评论的页面中,为 schema.org 的 discussionUrl JSON-LD 提供 Discourse URL。例如:

https://www.comses.net/codebases/c9d55182-4444-4cc1-9a6f-dcf9c4ca942a/releases/1.0.1/

https://forum.comses.net/t/evolution-of-ecological-communities-testing-constraint-closure/8816

1 个赞

是的,我们专门为此提供了一个 API 端点。示例如下:

curl 'https://meta.discourse.org/embed/info?embed_url=https://blog.discourse.org/2021/04/discourse-team-grows-to-50' -H 'API-KEY: logapikeygoeshere' -H 'API-USERNAME: apiusernamehere' 

响应结果如下:

{
  "topic_id": 187794,
  "post_id": 925017,
  "topic_slug": "discourse-team-grows-to-50-blog",
  "comment_count": 2
}

好问题,已将其添加到主题开头。

9 个赞

大家好——我一直在关注这个话题,并试图了解“导入的主题在有人回复之前将不公开”这一功能的运作方式——

基本上,我已经成功在网页中嵌入了一个 Discourse 主题——但希望嵌入的页面能显示该主题中的所有帖子,而不仅仅是对原始帖子的回复。

“导入的主题在有人回复之前将不公开”这一设置难道不应该实现这一点吗?我尝试过启用/禁用该选项以及“截断帖子”选项,但似乎并未观察到任何区别。

——有任何建议吗?提前感谢!

_Chuck

更新:我找到了这个主题,以及由 @arivanandan 编写的一个 Discourse 插件(非常感谢!)——我将尝试实施并更新结果以供后人参考。

更新 2:插件有效!再次非常感谢 @arivanandan!!

3 个赞

你好!

是否可以嵌入用户统计摘要?例如:

统计

  • 访问天数:240 天

  • 阅读时长:6 天

  • 最近阅读时长:4 天

  • 查看主题数:1.5k

  • 阅读帖子数:9.1k

  • 已给予:539

  • 书签数:34

  • 创建主题数:38

  • 创建帖子数:1.2k

  • 已接收:320

  • 解决方案数:61

5 个赞

这描述了我们当前的使用场景。当用户同时登录了两个站点时,一切运行正常。

我遇到的问题是,如果用户未登录我们的 Discourse 实例(该实例不支持匿名访问),那么在嵌入评论的位置他们将看不到任何内容。

是否可以在这种情况下让嵌入组件显示一条“登录 Discourse 以查看讨论”的提示?

6 个赞

我曾在类似的情况下遇到过同样的问题,对我有效的解决方案是将两个站点都放在同一个身份提供商下,使用 DiscourseConnect - Discourse 官方单点登录 (SSO)

5 个赞

谢谢,但在这种情况下这不可行。

不过,当前的行为似乎有些奇怪,因为如果登录出现问题,用户将看不到任何提示。是否有理由不显示一个会重定向到 Discourse 站点的登录链接呢?

3 个赞

我也遇到了同样的问题。即使网站设置为私密模式,如果能查看嵌入的评论就太好了。总体而言,我非常喜欢 Discourse,并且能够将评论添加到 Ghost 中,这绝对是一个加分项!

3 个赞

有没有办法在每次调用脚本时传递一个唯一的 div id?我在主文章下有异步内容加载,希望评论也能显示在这些项目上。当然,当前设置的问题在于它们都会显示在 ‘discourse-comments’ 这个 div id 中。

谢谢。@eviltrout

2 个赞

目前无法传递动态 ID。不过,我欢迎为此提交 PR!

2 个赞

@eviltrout 呃……好吧,我现在知道什么是 PR 了,但该如何发起一个拉取请求呢?

1 个赞

抱歉,你能说得更清楚一点吗?我不是 Ruby 开发者,所以很遗憾,这段代码不会由我来实现。我曾经稍微尝试过,但没能深入下去。

我实际上愿意付费添加此功能。你觉得在“市场”板块发帖是否合适?谢谢。

2 个赞

是的,如果您无法自行添加该功能,市场是一个很好的起步选择。

1 个赞

功能很棒,各位。

我们很希望尽快使用它,但我们的网站上有超过 30,000 篇博客。我们不希望所有博客在没有评论的情况下都直接出现在论坛中。由于博客是在 OnLoad 时作为主题插入的,我在想是否有一种方法可以在嵌入页面中通过点击按钮来触发插入操作,这样就不会在访问时(例如通过 Google 访问)立即插入所有博客?

我认为我们新的主题概览页面会被博客淹没(这对我们的管理员来说是个问题,因为普通论坛用户默认看不到这些内容)。

1 个赞

并不存在这样的功能。将创建内容设为“不公开”的能力是为了应对这一特定使用场景而添加的,但我能理解,面对三万篇博客,这恐怕也显得杯水车薪。

或许你可以编写一个脚本,手动导入历史记录并保留原始发布日期?

3 个赞

我还有一个问题。我们现在正在使用它,但我们的文章中包含 nofollow 链接。而在论坛上,这些链接是 dofollow 的(nofollow 已消失)。

这个问题我们可以修复吗?或者仅靠 canonical 标签是否就足以确保不跟随主题文章中的链接?

1 个赞

不知道数据属性“nosnippet”是否会有帮助?Robots Meta Tags Specifications | Google Search Central  |  Documentation  |  Google for Developers

我不完全确定 Google 是会忽略标记为 nosnippet 的内容,还是仅仅表示不在搜索结果页面(SERP)预览中显示该内容?

2 个赞

如何使用此方法传输图片?

1 个赞

我编写了一些脚本,将我们的博客评论从 Disqus 迁移到 Discourse 论坛。在此过程中,我使用 Discourse API 创建了大量主题,而不是让此集成自动创建它们。对于旧帖子,我使用了 topicId 嵌入方法;而未来的新帖子则使用 discourseEmbedUrl 方法。

然而,我遇到了一个奇怪的问题:一些新主题仍然被创建了。(我怀疑这是由于我端的一个 bug 导致的,当时某些帖子短暂地缺少 topicId,而那些帖子被作为重复项创建了。)虽然我认为目前我这边没有解决方案,但我希望为未来提出一个方案。

由于嵌入控制器 尝试通过 embed_url 数据库列查找现有帖子,我希望在 创建主题 时提供一个 API 属性来设置该字段。这样,我的导入脚本就可以为主题设置此属性。这样一来,集成甚至不需要再在 JS 中担心在 topicIddiscourseEmbedUrl 字段之间切换。

2 个赞

我刚刚追踪到了嵌入插件出现此问题的根源。在配置嵌入时,有一个“允许的主机”(Allowed Hosts)设置,该设置会相应地设置 iframe 的内容安全策略(CSP),导致 iframe 仅能在该主机上显示。例如,如果我将嵌入配置为允许的主机为 example.com,然后尝试在 attacker.com 上嵌入 JS,iframe 将拒绝加载,并报错:

拒绝加载 'https://forum.example.com/' 的框架,因为祖先元素违反了以下内容安全策略指令:"frame-ancestors 'self' https://example.com"。

然而,此时 JS 实际上已经运行,并使用提供给嵌入代码的任意 URL 在论坛上创建了一个主题。

在我的情况下,问题在于我们使用 Netlify 来预览构建,因此博客的副本实际上是从 netlify.app 的 URL 提供服务的。该服务加载了 embed.js,并为之前错误导入的帖子创建了论坛线程。

这不一定是一个安全问题,因为它仍然只能为配置网站上的 URL 创建主题,且这些 URL 必须符合路径白名单。但这对当前的迁移策略来说是个问题,因为在将旧帖子迁移到 Discourse 时,我无法为论坛主题设置 embed_url

修复方法是添加一条 CSP 规则,防止 embed.js 在“允许的主机”设置中未配置的任何域名上运行。

作为概念验证,我将嵌入代码复制到一个完全无关的域名,并将 discourseEmbedUrl 设置为其中一个我导入的旧帖子。加载页面后,iframe 被阻止了,但 JS 已经运行并创建了论坛线程。

如果您认为这更偏向于安全问题而非普通漏洞,我很乐意删除此帖子,并通过 HackerOne 进行报告。

2 个赞