# 是否有办法获得已发布的帖子，但又不显示 onebox？

**URL:** <https://meta.discourse.org/t/is-there-a-route-to-get-a-cooked-post-but-without-rendered-oneboxes/167157>\
**Category:** Support\
**Created:** [2020年十月14日 08:10 UTC](https://meta.discourse.org/t/is-there-a-route-to-get-a-cooked-post-but-without-rendered-oneboxes/167157 "2020-10-14T08:10:07Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![Terrapop](https://avatars.discourse-cdn.com/v4/letter/t/ecd19e/32.png) [@Terrapop](https://meta.discourse.org/u/Terrapop)\
**Post date:** [2020年十月14日 08:10 UTC](https://meta.discourse.org/t/is-there-a-route-to-get-a-cooked-post-but-without-rendered-oneboxes/167157/1 "2020-10-14T08:10:08Z")

</div>

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

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

---

<div class="post-metadata">

**Author:** ![adopilot](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/adopilot/32/105040_2.png) [@adopilot](https://meta.discourse.org/u/adopilot)\
**Post date:** [2020年十月14日 09:35 UTC](https://meta.discourse.org/t/is-there-a-route-to-get-a-cooked-post-but-without-rendered-oneboxes/167157/2 "2020-10-14T09:35:25Z")

</div>

或许这能帮上忙 [GitHub - discourse/raw-post-button · GitHub](https://github.com/discourse/raw-post-button)

---

<div class="post-metadata">

**Author:** ![Terrapop](https://avatars.discourse-cdn.com/v4/letter/t/ecd19e/32.png) [@Terrapop](https://meta.discourse.org/u/Terrapop)\
**Post date:** [2020年十月14日 09:50 UTC](https://meta.discourse.org/t/is-there-a-route-to-get-a-cooked-post-but-without-rendered-oneboxes/167157/3 "2020-10-14T09:50:10Z")

</div>

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

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

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

---

<div class="post-metadata">

**Author:** ![adopilot](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/adopilot/32/105040_2.png) [@adopilot](https://meta.discourse.org/u/adopilot)\
**Post date:** [2020年十月14日 10:02 UTC](https://meta.discourse.org/t/is-there-a-route-to-get-a-cooked-post-but-without-rendered-oneboxes/167157/4 "2020-10-14T10:02:02Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Terrapop](https://avatars.discourse-cdn.com/v4/letter/t/ecd19e/32.png) [@Terrapop](https://meta.discourse.org/u/Terrapop)\
**Post date:** [2020年十月20日 14:10 UTC](https://meta.discourse.org/t/is-there-a-route-to-get-a-cooked-post-but-without-rendered-oneboxes/167157/5 "2020-10-20T14:10:32Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![neounix](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/neounix/32/215617_2.png) [@neounix](https://meta.discourse.org/u/neounix)\
**Post date:** [2020年十月20日 14:52 UTC](https://meta.discourse.org/t/is-there-a-route-to-get-a-cooked-post-but-without-rendered-oneboxes/167157/6 "2020-10-20T14:52:00Z")

</div>

嘿 @Terrapop

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

希望这能帮到你。

---

<div class="post-metadata">

**Author:** ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)\
**Post date:** [2020年十月20日 23:47 UTC](https://meta.discourse.org/t/is-there-a-route-to-get-a-cooked-post-but-without-rendered-oneboxes/167157/7 "2020-10-20T23:47:39Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Terrapop](https://avatars.discourse-cdn.com/v4/letter/t/ecd19e/32.png) [@Terrapop](https://meta.discourse.org/u/Terrapop)\
**Post date:** [2020年十月21日 10:35 UTC](https://meta.discourse.org/t/is-there-a-route-to-get-a-cooked-post-but-without-rendered-oneboxes/167157/9 "2020-10-21T10:35:12Z")

</div>

这正是问题所在。由于已渲染的帖子中包含“单框”（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，同时排除其中的单框，那将理想得多。

---

<div class="post-metadata">

**Author:** ![fzngagan](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/fzngagan/32/259349_2.png) [@fzngagan](https://meta.discourse.org/u/fzngagan)\
**Post date:** [2020年十月21日 11:31 UTC](https://meta.discourse.org/t/is-there-a-route-to-get-a-cooked-post-but-without-rendered-oneboxes/167157/10 "2020-10-21T11:31:11Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Terrapop](https://avatars.discourse-cdn.com/v4/letter/t/ecd19e/32.png) [@Terrapop](https://meta.discourse.org/u/Terrapop)\
**Post date:** [2020年十月21日 11:51 UTC](https://meta.discourse.org/t/is-there-a-route-to-get-a-cooked-post-but-without-rendered-oneboxes/167157/12 "2020-10-21T11:51:29Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![neounix](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/neounix/32/215617_2.png) [@neounix](https://meta.discourse.org/u/neounix)\
**Post date:** [2020年十月21日 12:16 UTC](https://meta.discourse.org/t/is-there-a-route-to-get-a-cooked-post-but-without-rendered-oneboxes/167157/13 "2020-10-21T12:16:47Z")

</div>

> [@Terrapop](#):
>
> 如果能直接从 Discourse 获取解析后的 HTML 就好了，只是不要那些 oneboxes。

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

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

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

* * *

**注意：**

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