介绍
Open Graph 协议
使任何网页都可以成为社交中的丰富对象。例如,用于 Facebook
以允许任何网页具有与 Facebook
上任何其他对象相同的功能。
以下是把链接分享到钉钉
,钉钉识别后显示的效果:
基本元数据
要将网页变成图形对象,需要将基本元数据
添加到页面。在网页中放置额外的<meta>
标签。<head>
页面的几个必需属性是:
og:title
- 对象的标题,如上图中的第一行。og:description
- 对象的描述,如上图的第二行。og:image
- 一个图像 URL,如上图中的右侧图像。og:url
- 对象的规范 URL,将用作图表中的永久 ID,例如“https://www.milovetingting.cn/”。
一个简单的示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<meta property="og:title" content="这是标题">
<meta property="og:description" content="这是内容">
<meta property="og:image" content="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Fbf6fe5f0-4e5c-4dd1-9545-f58151164f0c%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1687600526&t=3464298caa9ef5ecf854ef360e9db93c">
<meta property="og:url" content="https://www.milovetingting.cn">
<title>示例页面</title>
</head>
<body>
<p>这是一个示例页面。</p>
</body>
</html>
具体案例
需求
将web
中某个具体的页面分享到whatsapp
,并能显示为卡片
形式,当点击卡片时跳转我们指定的页面。
实现
由于项目是用flutter
开发,整个web实际运行时都是在index.html
上显示。而由于我们需要在不同页面显示不同的标题、描述、图片等信息,因此需要动态修改这些元数据。
方案一
:
通过js
脚本读取当前网页的url
,并提取需要的参数
,再通过js动态修改对应的meta
元素。
运行后,通过查看网页元素,发现meta信息已经设置上去,但是在whatsapp中无法识别。
原因:og元数据不能通过js动态设置。
方案二
:
通过访问服务端的一个接口,在接口中返回具体的html页面数据,然后在html中再作跳转。
当分享到whatsapp时,会首先访问这个接口,接口返回的数据,会被识别出来,从而形成卡片效果。而当点击时,会先访问到接口返回的页面,然后这个页面会做重定向到实际需要分享的页面。
@Controller
@RequestMapping("/share")
public class ShareController {
@RequestMapping("/chance")
@ResponseBody
public String share() {
Random random = new Random();
return "<!DOCTYPE html>\n" +
"<html>\n" +
"\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
" <meta http-equiv=\"refresh\" content=\"1;url=https://www.milovetingting.cn\"> \n" +
" <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0\">\n" +
" <meta property=\"og:title\" content=\"这是标题"+random.nextInt(100)+"\">\n" +
" <meta property=\"og:description\" content=\"这是内容"+random.nextInt(100)+"\">\n" +
" <meta property=\"og:url\" content=\"https://www.milovetingting.cn\" />" +
" <meta property=\"og:image\" content=\"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Fbf6fe5f0-4e5c-4dd1-9545-f58151164f0c%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1687600526&t=3464298caa9ef5ecf854ef360e9db93c\" />" +
" <title>示例页面" + random.nextInt(100) + "</title>\n" +
"</head>\n" +
"\n" +
"<body>\n" +
" <p>这是一个示例页面。</p>\n" +
"</body>\n" +
"\n" +
"</html>";
}
}
参考
更多meta数据可参考下面网址:
https://ogp.me/