如何嵌入 youtube 直播聊天

Posted

技术标签:

【中文标题】如何嵌入 youtube 直播聊天【英文标题】:How to embed youtube livestream chat 【发布时间】:2019-02-27 07:32:33 【问题描述】:

我正在尝试将 youtube 直播聊天嵌入到我网站上的网页中,

<iframe allowfullscreen="" frameborder="0"  src="https://www.youtube.com/live_chat?v=hHW1oY26kxQ&embed_domain=localhost" ></iframe>

我正在尝试这个,但如果尝试使用我拥有的真实域进行嵌入域,则聊天根本不显示,但这也不起作用。

【问题讨论】:

嵌入 YouTube 实时聊天功能但不能在移动设备上运行:***.com/a/59349138/470749 我可以确认 127.0.01(无端口)工作,但我没有尝试 localhost。此外,iframe 可以在 Safari 的 Ipad 上运行,但不能在 iosandroid 上的 Chrome 上运行。 如果您请求网站的桌面版本而不是移动版本,这将在 iPad Chrome(当前)上运行。然而,这可能并不完全适用于所有网站。 【参考方案1】:

这似乎与 this change to iframes 的引入有关,至少在我遇到此问题时是这样。

要解决这个问题,我建议使用如下脚本:

<script>  
 let frame = document.createElement("iframe");  
 frame.referrerPolicy = "origin";  
 frame.src = "https://www.youtube.com/live_chat?v=VIDEO_ID&embed_domain=" + window.location.hostname;  
 frame.frameBorder = "0";  
 frame.id = "chat-embed";  
 let wrapper = document.getElementById("chat-embed-wrapper");  
 wrapper.appendChild(frame); 
</script>

其中chat-embed-wrapper 是ID 为chat-embed 的iframe 的父级,VIDEO_ID(在frame.src 分配中)是目标视频的ID。您必须针对您的设置稍作修改,但这是一般情况下的解决方案。

【讨论】:

【参考方案2】:

在我看来,YouTube 禁用了该功能以在外部网站上嵌入实时聊天,但后来忘记更新文档。或者,可能存在破坏此功能的未修复错误。

2021 年更新:聊天嵌入再次起作用。使用与以前相同的语法。根据a helpful comment below。

详情

YouTube 知识库仍然表示,仍然可以使用您发布的 URL(see here,在“嵌入实时聊天”部分)将实时聊天 iframe 嵌入到外部网站。

但是,当您尝试这样做并查看浏览器的控制台时,您会看到如下消息:

拒绝在框架中显示“https://www.youtube.com/live_chat?v=12345&embed_domain=example.com”,因为它将“X-Frame-Options”设置为“sameorigin”。

在查看对https://www.youtube.com/live_chat?… 请求的响应时,您还可以在浏览器开发者工具的“网络”选项卡中看到x-frame-options: SAMEORIGIN 标头。

这意味着 YouTube 不希望浏览器将其嵌入到 iframe 中,除非嵌入到 youtube.com 本身。 (在 YouTube 本身上,此嵌入代码仍然有效:当您检查 YouTube 上任何当前流式传输的实时视频的源代码时,您会发现那里的实时聊天窗口是使用相同的 /live_chat?… 请求在 iframe 中创建的。)

此功能已被删除的其他迹象:

YouTube 文档提到:

实时聊天模块仅存在于 YouTube 观看页面上——它不跟随嵌入式播放器。 (source)

我认为这是文档的新部分,而更下方的“嵌入实时聊天”部分已过时。

This tutorial 从 2016 年开始使用记录在案的 URL 格式在底部附近嵌入示例实时聊天,现在它显示相同的“拒绝在框架中显示 [...],因为它将 'X-Frame-Options' 设置为‘同源’。”假设这在 2016 年有效,那么 YouTube 方面肯定发生了一些变化。

这个Reddit thread 讲述了某人的嵌入式实时聊天如何在 2018 年 9 月初突然停止工作 - 就在这个问题被问到之前不久。

替代方案

您可以使用 YouTube Livestream API,尤其是 LiveChatMessages 端点来获取和创建聊天消息。周围可能有开源库来帮助解决这个问题。到目前为止,我找到了this one(可以显示但不能创建聊天消息)。

您可以嵌入自己的聊天,安装在您自己的服务器上或a cloud-hosted livestream chat solution。此解决方案还可以提供 YouTube 实时聊天不提供的功能,例如允许匿名访问者发帖。

您可以反向代理 https://www.youtube.com/live_chat?… URL,转发 YouTube 的响应,但删除 X-Frame-Options 标头。

如果您只需要一台或几台计算机的解决方案,您可以使用浏览器扩展程序从 YouTube 的响应中删除 X-Frame-Options 标头。见this question。

【讨论】:

2021 更新:在外部网站中嵌入 youtube 聊天似乎又可以工作了。关键是在嵌入 iframe URL:?embed_domain=www.your-external-domain.com 中包含 embed_domain URL 查询参数。请参阅此答案 support.google.com/youtube/answer/2524549?hl=en 中的文档。 还要注意 iframe src 属性中的印刷引号。这些 ”。我从带有这些引号的网站复制/粘贴,它坏了,导致我进入这个 ***。错误:&lt;iframe width=”350px” height=”500px” src=”embed-url-in-here” &gt;&lt;/iframe&gt;。不过,引号是问题所在,而不是 X-Frame-Options 标头。一旦我使用 ASCII 引号,它就可以正常工作。这些“。【参考方案3】:

我可以确认这确实有效。但是,当embed_domain 的值为“example.com”时,我收到了相同的 X 帧错误,即使页面的 url 以“https://www.example.com”开头。即确保值匹配window.location.hostname。如果您没有规范的主机重定向工作,Addison Crump 的解决方法可以解决这个问题。

【讨论】:

【参考方案4】:

我不确定你最终是否能做到这一点?我们已经设法使用这个 iframe 在我们的网站上运行它,希望它对您有所帮助:

<iframe src="https://www.youtube.com/live_chat?v=YourVidCodeHere&embed_domain=www.YourDomainHere.com" ></iframe> 

希望对您有所帮助:) PS 它不适用于移动设备(YouTube 表示他们已从移动设备中删除了此功能),但它可以在桌面和标签页上运行。

最好的祝愿。

【讨论】:

【参考方案5】:

Angular 的简单解决方案:

html 部分:

  <iframe frameborder="0"  [src]="url" ></iframe>

TS 部分:

constructor(private sanitizer: DomSanitizer) 

ngOnInit() 
  this.url = this.sanitizer.bypassSecurityTrustResourceUrl('https://www.youtube.com/live_chat?v=[YOUR_LIVESTREAM_ID]&embed_domain=' + window.location.hostname);

【讨论】:

以上是关于如何嵌入 youtube 直播聊天的主要内容,如果未能解决你的问题,请参考以下文章

如何嵌入新的 Youtube 直播视频永久 URL?

如何在 YouTube 直播期间获取通过“聊天”框输入的评论源?

如何在我的 ios 应用程序中嵌入 youtube 或 facebook 直播?

YouTube 直播嵌入代码不断变化

嵌入不带视频 ID 的 YouTube 频道的当前直播

如何使用 IFrame API 嵌入“YouTube Gaming”视频?