YouTube 视频 Onebox 嵌入功能停止工作

我很希望能得到一些建议,同时也有一些关于如何更好处理此事的想法。

可能发生了什么

一种理论是,我们的服务器可能被 YouTube 识别为在批量抓取音乐视频,从而受到限制或被封锁。

我们只是英国一个不起眼的小论坛,流量微薄,但有几个帖子(实际上是一个因篇幅过大而拆分为两个的帖子),分别包含 1 万和 2 千条音乐视频帖子。这是一个音乐接龙:下一位发帖人只需发布一首与前帖相关(有时是某种间接关联)的歌曲。

当然,我们还有其他包含 YouTube 链接的帖子,但这一条尤其密集(约 100%)全是音乐内容。

本周末进行了一次重新生成(rebake)后,我推测 YouTube 可能注意到 Onebox 器试图抓取大量音乐视频的头部信息,其算法因此将我们列入了“黑名单”。

随后我重新尝试生成帖子,这恐怕进一步证实了 YouTube 的怀疑:从该 IP 地址发出的所有请求似乎都只是为了下载音乐视频。

可能与 Digital Ocean 有关

因此,我在 Google 上搜索 YouTube 的 429 错误,忽略所有 YouTube API 相关结果后,最终指向了一组听起来类似的问题,这些问题的共同点是:由于使用虚拟服务器,其 IP 地址被灰名单化/黑名单化/封禁,其中特别提到了 Digital Ocean。

有观点认为,YouTube 可能会“封禁”一系列 IP 地址,导致其他合法服务器也遭受牵连。

以下是其中一个问题及潜在解决方案:

https://support.google.com/youtube/thread/21697789?hl=en

还有另一位在 medium.com 上工作的 embed.ly API 开发人员提出的另一个案例:

https://support.google.com/youtube/thread/21939228?hl=en

第一个帖子中提出的建议是在 droplet 上禁用 IPv6。

有人知道这听起来是否合理,或者是否会引起其他问题吗?

我目前尚未执行此操作,以便收集可能有助于解决问题的其他数据。

应该发生什么?

首先,我理解大家的反应可能是:我的情况属于边缘案例,无需做出任何更改。

我能理解这一点。但如果 @marcozambi 和我在相对较短的时间内发现了相同的问题,那就表明其他人也可能遇到类似情况。也许 YouTube 最近对嵌入内容的监管变得更加严格了?

我想提醒大家,目前我的论坛完全处于停滞状态。我有数万个链接未能成功生成 Onebox,但我不知道它们具体在哪里。唯一能想到的办法是全面重新生成,但这几乎肯定会招致 YouTube 更多的负面关注。

至少,当 Onebox 遇到速率限制错误时,不能静默失败。它必须引起管理员的注意,并在可能的情况下暂停触发速率限制问题的进程。

让论坛所有者注意到此问题的选项

我认为这并不容易,一点都不容易。

我认为 Onebox 扮演着几种截然不同的角色:

a) 在用户撰写帖子时实时构建 Onebox;
b) 在后台无头模式下响应旧帖子的重新生成(通常包含已知链接);
c) 在迁移/重新生成期间处理大量后台作业帖子。

如果速率限制错误发生在场景 a) 中,作者会注意到 Onebox 未展开,可能会向论坛管理员投诉,从而引起注意。也许也可以在撰写过程中捕获该单一错误,并向管理员推送错误或消息?

在场景 b) 中,失败可能发生在帖子后台处理过程中,因此需要重试;如果重试次数已达上限,则应标记为失败并通知论坛管理员。

在场景 c) 中,需要知晓大量失败同时发生的整体背景。目前,我认为没有对帖子重新生成过程的全局控制,因此无法将 Onebox 返回的 10,000 个 429 错误识别为一个更大的问题,而不是向管理员发送 10,000 条独立消息。

实际上,此类故障意味着所有针对 YouTube(可能还有其他提供商)视频展开的 Onebox 调用都必须暂停,直到我们不再受速率限制。

其他方法

限制出站请求

我想“预防胜于治疗”的原则可能意味着可以在 Discourse 请求前设置速率限制器,这样 Discourse 就可以根据某些配置设置来暂缓请求。

但这会给重新生成和迁移带来极大麻烦。

Onebox Assistant

也许我们都需要与缓存和代理嵌入内容的机构建立商业合作关系,例如 @merefield 在其 Onebox Assistant 插件中使用的服务?

将“机器人”加入白名单

我们能否找到一种方法将 Discourse 的“机器人”加入 YouTube 白名单?这可能过于开放,容易遭到滥用。

YouTube API

就像 Onebox 对 Twitter 所做的那样,如果 YouTube API 的速率限制更高,我们是否可以使用它?

这里有一些不错的研究,谢谢。

不知您是否注意到,我提到过 Signal 消息应用也存在 YouTube 预览问题,这仍然是一个未解决的议题:

https://meta.discourse.org/t/onebox-assistant-crawl-for-those-previews-reliably/107405/9?u=merefield

WhatsApp 上也会出现同样的问题。

我想补充一点,我们每隔两到三周就会定期被 YouTube“封禁”,封禁持续一周左右,然后我们会被解封。随后这一循环会重复发生。
我们只有几百个 YouTube 视频链接,我们的用户每天发布的链接不超过几个……

那么,如果不使用 OneBox Assistant 插件,在 Discourse 基础版中是否有其他方法可以预览 youtu.be 链接?

Onebox 应该能展开所有格式的 YouTube 链接。

您那边无法正常工作吗?

如果是的话,您遇到了什么问题?

我使用的是最新版的 Discourse,刚发了一条包含 youtu.be 链接的帖子,但没有显示预览。普通的 YouTube 链接可以正常显示。

让我们看看

https://youtu.be/gLCduDJVksc 在我看来没问题

是的,它在 meta.discourse 上可以工作。我正在尝试弄清楚为什么在我的站点上不行。是否有任何设置可以在管理面板中进行配置?

如上文所述,YouTube 很可能已封禁您的服务器或 IP 地址段。

但是普通的 YouTube 链接可以正常使用。如果它们被禁止了,难道所有链接都不能用了吗?

并非如此,@AntiMetaman

正如 @codinghorror 在上面建议的那样,YouTube 似乎对某些格式的 YouTube 链接进行了速率限制或禁止,而其他格式仍能正常工作。

在我的情况下,使用 ‘/embed’ 格式的链接可以工作,但其他格式不行。

看起来 YouTube 针对不同格式提供了不同的速率限制。‘/embed’ 格式似乎允许更大的数量。这纯属个人经验,我还没有任何确凿的数据支持这一点。

有几个问题:

您是否托管在 Digital Ocean 上?

您是否运行 IPv6?

您是否检查过视频 ID 是否正确生成(11 个字符)?(这个问题有点傻,但您可能会惊讶地发现确实有人出错)

对于某个特定的 YouTube 视频,您是否尝试过所有三种支持的格式?即:

哪些能工作,哪些不能?

我在这个问题上碰壁数周,但终于找到了一个可行的解决方案——但我真的不明白它为什么能工作。

假设您遇到的是相同的问题,请尝试安装 Onebox Assistant 插件,然后启用它,但不要进行配置。

我发现,在启用该插件后需要重启服务器以确保其正常工作。

在这种配置下(实际上根本不应该工作),我原本受到速率限制的 YouTube 视频(任何格式)都能被 Onebox 正常展开——但我完全不知道这是如何实现的。

我一直在与作者 @merefield 讨论这个问题…

https://meta.discourse.org/t/onebox-assistant-crawl-for-those-previews-reliably/107405/36?u=bletch

如果(这是一个很大的“如果”)这对您也有效,那么这并非真正的修复方案,因为它只是方法返回值的一个怪癖,长期依赖并不稳妥。

另外,我还按照 Onebox Assistant 插件的初衷使用过它——通过订阅 embed.rocks,效果非常好。

您能定义一下常规和非常规的 YouTube 链接吗?

如果是这种情况,为什么 Onebox 不能在轮询数据之前先转换为适用的格式?

我想可能吧,但这算不上“修复”。

所有格式似乎都受到了速率限制,最终都会失败。就连“/embed”格式在我尝试重新生成之前某次重新生成过程中失败的 YouTube 嵌入内容后,也对我失效了。

此外,我仅在这里看到过两次关于“/embed”路径在其他方法失败时仍能成功的经验分享——包括我自己的经历。

目前证据尚不充分,受影响的“受害者”也还不够多,不足以建议做出任何更改。

你也遇到了这个问题吗,@Terrapop?还是你只是出于兴趣关注此事?

随着我们即将把热门社区迁移至 Discourse,我对此很关注。目前正处于测试阶段,暂时可以运行,但我们希望从一开始就搭建一个可靠的设置。因此,我们可能会配置 Onebox Assistant 指向我们自己的端点,该端点将转发并缓存来自 embeds.rock 的响应;如果失败,则从 Iframely 获取数据。

好的,我刚才随便测试了一下,在 meta.discourse 上成功复现了这个问题!我认为这和 Markdown 有关。我的 youtu.be 链接在我的论坛上确实能按预期工作,只是下面这些示例不行。YouTube 完全没有屏蔽我的主机。

  1. 这个链接即使在 meta.discourse 上也无法工作:https://youtu.be/MLpyi-oVoI

看到了吗?视频链接本身没问题。如果你把链接放到下一行,它依然无法工作。

  1. 这个也不行:
    https://youtu.be/MLpyi-oVoIY

你看到了吗?现在如果我把同样的链接粘贴到这里,它就能工作了:

很高兴你没有被 YouTube 屏蔽。我认为一切运行正常——这只是一个格式问题。

我认为 Onebox 展开需要满足两个条件:a) 链接必须独占一行并位于行首;b) 如果链接位于列表中间,则其前面需要额外的换行符。

如果你查看你帖子的原始版本:

https://meta.discourse.org/raw/153748/36

Ok, so I was just playing around and I was able to reproduce it here on meta.discourse! I believe it has something to do with markdown. My youtu.be links do in fact work my forum as intended just not in the examples below. Youtube isn't blocking my host at all.

1. This won't work even on meta.discourse: https://youtu.be/MLpyi-oVoI

See? There's nothing wrong with the video link. If you put the link on the next line, it still won't work.

2. This won't work either:
https://youtu.be/MLpyi-oVoIY

You see? Now if I paste this same link here, it will work:

https://youtu.be/MLpyi-oVoIY

你可以看到,第一项 1. 中的链接出现在行中间,因此不会展开。链接必须是行首的第一个内容。

而在第二项 2. 中,YouTube 链接前只有一个换行符,因此它也不会展开。

如果你查看你帖子的格式化版本,可能会注意到 YouTube 链接有悬挂缩进……

……这意味着 Markdown 仍然将该链接视为项目符号 2 的一部分,因此不会展开它。

你可以这样做:

  1. 这是一些填充文本
  2. 这个链接可以工作,因为我在这一行和 YouTube 链接之间留下了两个换行符

好的,我只需要学会使用 Markdown,并把 YouTube 链接单独放一行。我的用户还在适应中,有一篇用户发帖引起了我的注意,里面的 youtu.be 链接无法工作,这才引发了这一切。

你好,我两天前开始重新生成超过 100 万篇帖子,但从今天起 YouTube 预览无法再工作,所以我猜我的 IP 被禁用了。
在这种情况下有什么建议吗?我应该只是等待重新生成完成,然后联系 YouTube 看看能否解除禁令吗?
或者使用 https://meta.discourse.org/t/onebox-assistant-crawl-for-those-previews-reliably/107405?

如果你能承担得起,这确实是一个可行的办法。