像 Facebook 和 Instagram 这样的网站为开发者提供了一个 oEmbed 端点。Iframely 服务会从公共互联网上的网站创建嵌入内容。对于私有网络(例如企业 CMS)中的内容,本文档概述了如何丰富内容或构建一个 API,以便 Enhanced Media Embed 服务器利用它来创建丰富的超链接。我们还将提供有关 Enhanced Media Embed 服务器摘要卡片的一些信息。
Enhanced Media Embed 服务器为私有内容创建的嵌入有三种增强选项:
使用 Open Graph 或其他元标签注释内容
开发返回 oEmbed 格式 JSON 的自定义端点
开发返回 TinyMCE Enhanced Media Embed 格式 JSON 的自定义端点
关于 Cookie 和认证的说明
如果内容或端点与 Enhanced Media Embed 服务器位于同一域名下,Cookie 将转发到该服务器。这应该复用 CMS 环境中用户的现有登录状态。
示例如下:
Enhanced Media Embed 服务器的可访问地址为
http://mydomain.example.com/media您的自定义 oEmbed 端点的可访问地址为
http://mydomain.example.com/endpoint您已在
http://mydomain.example.com/cms处登录到您的 CMS您从
http://mydomain.example.com/cms/secretcontent嵌入内容,该内容通常需要认证才能访问因为您的内容、oEmbed 端点和 Enhanced Media Embed 服务器都在同一域名下,所以可以使用 Cookie 透传嵌入
http://mydomain.example.com/cms/secretcontent
使用 Open Graph 或其他元标签注释内容
Open Graph
如果您的内容使用了 Open Graph 标签标记,并且可以通过 HTTP GET 请求从 Enhanced Media Embed 服务器访问,那么将根据您的内容创建名片样式的嵌入。
如果在配置中启用了 Iframely,则 Open Graph 查找将由 Iframely 执行。Iframely 要求内容必须在互联网上公开可访问。
至少,您需要定义以下 Open Graph 标签:
og:titleog:image
建议同时定义以下内容:
og:urlog:descriptionog:site_name
此外,您可以通过定义以下内容来指定要包含在嵌入中的视频或音频资源:
og:video和og:video:type(所有浏览器仅支持 MP4)og:audio和og:audio:type(所有浏览器仅支持 MP3)
SEO 标签
作为 Open Graph 标签的替代方案,您可以使用搜索引擎(如 Google)推荐的旧式风格包含元标签。
<title>...</title><meta name="description">...</meta><link rel=image_src href="..." />
优点
这是在没有现有嵌入 API 的情况下创建嵌入的最简单方法
无需服务器配置
存在现有的 CMS 插件可以将这些标签添加到内容中
Enhanced Media Embed 服务器将负责创建嵌入 HTML 和样式
缺点
页面必须对 Enhanced Media Embed 服务器可访问(不能需要认证)
Enhanced Media Embed 服务器创建的嵌入 HTML 和样式不可配置
仅适用于 HTML URL
Iframely 只能作为全局选项启用或禁用。如果启用了 Iframely,则所有内容必须对世界开放,且不会发生 Cookie 透传。
自定义 API
作为在内容中包含元标签的替代方案,您可以编写一个自定义 API,以 oEmbed 或 TinyMCE Enhanced Media Embed 格式返回 JSON。
有关如何让 Enhanced Media Embed 服务器利用您的自定义 API 的详细信息,请参阅配置自定义端点文档。
oEmbed 端点
这是一个流行的选择,许多 CMS 都有支持 oEmbed 的现有插件。虽然您可以通过这种方式创建自定义 HTML 嵌入,但它们不能包含脚本。如果 HTML 包含脚本,则 Enhanced Media Embed 服务器将嵌入一个 摘要卡片。
优点
存在支持 oEmbed 的现有 CMS 插件
您可以编写自己的自定义 HTML
缺点
该规范中没有为同一 URL 的多个嵌入表示留出空间
必须是单独的 API,而不是仅仅嵌入在内容中的元数据
错误消息未作为规范的一部分定义
TinyMCE Enhanced Media Embed 端点
开发自定义 API 端点的另一种选项是返回 TinyMCE Enhanced Media Embed 格式的 JSON。
优点
您可以编写自己的自定义 HTML
该格式能够容纳同一 URL 的多个嵌入表示
更好地定义了向媒体服务器传达错误的能力
缺点
必须是单独的 API,而不是仅仅嵌入在内容中的元数据
现有插件不支持
TinyMCE 编辑器尚未充分利用此格式
TinyMCE Enhanced Media Embed 格式
HTTP 响应状态码
HTTP 200 (OK):
EphoxEmbedObjHTTP 400 (用户错误):
ErrorObjHTTP 503 (上游错误):
ErrorObjHTTP 500 (意外错误):
ErrorObj
JSON 响应对象
EphoxEmbedObj
rel、media 和 html 组合形成您服务器选择的可嵌入资源的默认表示。Enhanced Media Embed 服务器的客户端(例如 TinyMCE 编辑器)可以在 links 中查找替代表示。
title(可选)包含文档标题的字符串。
author_name(可选)包含作者姓名的字符串。
author_iri(可选)包含作者 IRI 的字符串。
provider_iri(可选)包含资源提供者 IRI 的字符串。
provider_name(可选)包含资源提供者名称的字符串。
short_iri(可选)包含资源缩短 IRI 的字符串。
canonical_iri(必需)包含资源 IRI 的字符串。
description(可选)包含文档描述的字符串。
cache_age(可选)包含该资源建议缓存寿命(秒)的整数。
date(可选)包含文档日期的字符串,格式为 YYYY-MM-DD。
links(必需)LinksObj
rel(可选)RelObj
media(可选)MediaObj
html(可选)包含 TinyMCE 要嵌入的 HTML 片段的字符串。
RelObj
一个描述嵌入主要类型、来源以及您可能想知道的任何技术属性(自动播放、ssl、文件格式(flash、html5 等))的标签数组。
primary(必需)PrimaryRels 数组
technical(必需)TechnicalRels 数组
source(必需)SourceRels 数组
PrimaryRel
一个描述嵌入主要类型的字符串,包含以下值之一:
player:视频或音频播放器thumbnail:资源的缩略图表示image:资源的完整尺寸图像readerfile:未提供 HTML。应仅为可下载文件的超链接。surveyapp:如果在移动设备上播放,将切换到移动应用的嵌入(例如 soundcloud)summary:摘要卡片(无脚本嵌入)iconlogopromo
TechnicalRel
描述嵌入技术属性的字符串,包含以下值之一:
flashhtml5gifvinlinesslautoplay
SourceRel
描述嵌入来源的字符串,包含以下值之一:
iframely: 来自 Iframelyopengraph: 从资源中的 Open Graph 标签生成twitter: 从 Twitter Card 检索oembed: 从 oEmbed API 检索sm4fallback: Ephox 回退嵌入,检查 SEO 标签和 Open Graph 标签。script_censor: 原始嵌入(来自 Iframely 或 oEmbed)包含脚本,已转换为摘要卡片。smartframe_censor: 原始嵌入包含 Iframely 智能框架,已被审查转换为摘要卡片,以避免对 Iframely 的内容依赖。
LinksObj
表示此资源的所有可能表示形式。
players(必填)LinkObjs 数组
thumbnails(必填)LinkObjs 数组
apps(必填)LinkObjs 数组
readers(必填)LinkObjs 数组
surveys(必填)LinkObjs 数组
summary_cards(必填)LinkObjs 数组
icons(必填)LinkObjs 数组
logos(必填)LinkObjs 数组
promos(必填)LinkObjs 数组
images(必填)LinkObjs 数组
files(必填)LinkObjs 数组
LinkObj
这表示您可以链接到 / 嵌入的表示形式。
media(可选)MediaObj
rels(必填)RelObj
href(可选)包含资源 URL 的字符串。
mime_type(必填)包含资源 mime-type 的字符串。
html(必填)包含可嵌入 HTML 片段的字符串。
MediaObj
媒体对象描述嵌入的边界。它可以是 响应式 或 固定 的。
type(必填)值为 `fixed` 或
responsive的字符串
当 type 为 fixed 时的字段:
width(必填)包含以像素为单位的宽度的整数。
height(必填)包含以像素为单位的高度的整数。
paddingBottom(可选)整数
当 type 为 responsive 时的字段:
aspectRatio(可选)双精度数
paddingBottom(可选)整数
width(必填)DimensionBoundObj
height(必填)DimensionBoundObj
DimensionBoundObj
维度边界定义响应式嵌入的高度或宽度。
type(必填)值为
fixed、constrained或unbounded的字符串
当 type 为 fixed 时的字段:
pixels(必填)整数
当 type 为 constrained 时的字段:
min_pixels(可选)整数
max_pixels(可选)整数
当 type 为 unbounded 时无其他字段。
ErrorObj
code(必填)值为
400(用户输入错误) 或502(上游故障) 的整数
subcode(必填)具有下列值之一的整数:
当
code为 502 时:1- 上游连接问题2- 上游返回非 OK3- 上游返回服务器无法理解的响应
当
code为 501 时:1- 未实现 URI 支持
当
code为 400 时:1- URI 解析失败2- URI 是相对的3- URI 为空4- URI 不是 http 或 https5- 最大宽度不是正整数
msg(必填)给开发人员 / 支持人员的字符串消息。
摘要卡片
当 Enhanced Media Embed 服务器生成 URL 的摘要卡片(使用标题、缩略图、描述和网站)时,它会返回如下所示的 HTML 片段。您应将样式应用于文档样式以符合您的偏好。
<div class="ephox-summary-card">
<a class="ephox-summary-card-url-thumbnail" href="http://www.imdb.com/title/tt0117500/">
<img class="ephox-summary-card-thumbnail" src="https://images-na.ssl-images-amazon.com/images/M/MV5BZDJjOTE0N2EtMmRlZS00NzU0LWE0ZWQtM2Q3MWMxNjcwZjBhXkEyXkFqcGdeQXVyNDk3NzU2MTQ@._V1_UY1200_CR90,0,630,1200_AL_.jpg">
</a>
<a class="ephox-summary-card-link" href="http://www.imdb.com/title/tt0117500/">
<span class="ephox-summary-card-title">The Rock (1996)</span><br><br>
<span class="ephox-summary-card-description">Directed by Michael Bay. With Sean Connery, Nicolas Cage, Ed Harris, John Spencer. A mild-mannered chemist and an ex-con must lead the counterstrike when a rogue group of military men, led by a renegade general, threaten a nerve gas attack from Alcatraz against San Francisco.</span><br><br>
<span class="ephox-summary-card-website">IMDb</span>
</a>
</div>推荐 CSS
.ephox-summary-card {
border: 1px solid #AAA;
box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12);
padding: 10px;
overflow: hidden;
margin-bottom: 1em;
}
.ephox-summary-card a {
text-decoration: none;
color: inherit;
}
.ephox-summary-card a:visited {
color: inherit;
}
.ephox-summary-card-title {
font-size: 1.2em;
display: block;
}
.ephox-summary-card-author {
color: #999;
display: block;
margin-top: 0.5em;
}
.ephox-summary-card-website {
color: #999;
display: block;
margin-top: 0.5em;
}
.ephox-summary-card-thumbnail {
max-width: 180px;
max-height: 180px;
margin-left: 2em;
float: right;
}
.ephox-summary-card-description {
margin-top: 0.5em;
display: block;
}