是否有办法获得已发布的帖子,但又不显示 onebox?

对于外部 Facebook Instant Article 生成器,我们需要已处理的 HTML 帖子,但不包含渲染后的一键框(oneboxes)…

是否已存在针对帖子的此类路由或 API 端点?

1 个赞

或许这能帮上忙 GitHub - discourse/raw-post-button · GitHub

1 个赞

你好 @adopilot,非常感谢你的反馈。能否请你详细说明一下?

这看起来是一个用于查看原始帖子的组件。

我们需要一个能够渲染已处理帖子但不包含一键框(oneboxes)的组件。

抱歉,我原以为您需要原始帖子,后来我意识到自己错了,因为帖子已经发布了。

1 个赞

有人吗?这能否以某种方式实现?

@Terrapop

你可以编写一个插件,当请求的 User Agent 字符串与 FB 机器人的 User Agent 字符串匹配时,隐藏(或移除)One Box 的 DOM 元素。

希望这能帮到你。

1 个赞

您需要对 HTML 进行后处理,因为已渲染的帖子中已经包含了所有展开的一键盒(onebox)的 HTML。

2 个赞

这正是问题所在。由于已渲染的帖子中包含“单框”(oneboxes,它们不再包含原始媒体链接,只有原始帖子才保留原始链接),我们无法将其转换为符合 Facebook Instant Articles (IA) 有效格式的文档。

Iframely 能够从独立链接生成符合 IA 标准的 iframe。我们曾尝试使用原始帖子,配合 PHP 的 Markdown 解析器(Markdown-It for PHP)以及 Iframely 来处理独立链接,但 Discourse 的 Markdown 解析过程要复杂得多,而我们并不希望重新实现 Discourse 对 Markdown 所执行的所有“魔法”处理。因此,我们正在寻找一种方案:获取已渲染的帖子,但其中不包含已解析的单框(因为我们希望随后通过 Iframely 对这些单框进行后处理)。

我们目前的方法适用于简单帖子:即以原始帖子为基础,使用 PHP 的 Markdown-It 将其转换为 HTML,再利用 Iframely 生成符合 IA 标准的媒体卡片(单框不符合该标准),然后将 HTML 转换为 Facebook IA 所需的 HTML 格式,并通过 Facebook PHP SDK 进行传输。然而,由于 Discourse 在 Markdown 解析过程中应用了大量额外规则,如果我们能直接从 Discourse 获取已解析的 HTML,同时排除其中的单框,那将理想得多。

1 个赞

你不需要在 Discourse 外部处理帖子。只需对负责的方法进行猴子补丁,并排除生成单盒(oneboxes)的部分。大致思路如此。

2 个赞

嗯,我们并不想总体上改变 Discourse 的烹饪行为,但需要一个 API 端点来生成已渲染的帖子,同时不包含 oneboxes(但保留原始独立链接,例如作为 a 标签)。

1 个赞

只需隐藏或移除该 DOM 元素即可。这其实很简单。

  1. 将用户代理字符串与 Ruby 进行匹配,并在匹配时设置一个布尔值。
  2. 如果该布尔值为真,则使用 JavaScript 隐藏该 DOM 元素。

这基本上就是“标准”做法,适用于开发者不希望显示(或想要移除)任何 DOM 元素的类似场景。


注意:

使用 Ruby 的 ‘gon’ gem 可以非常轻松地将任何 Ruby 变量传递给 JavaScript,不过我仅在 Rails 应用中使用过它,尚未在包含 EmberJS 的栈中使用(无论如何,将 Ruby 变量传递给 JS 的方法有很多)。