PiNet 元数据

概述

PiNet 支持代表您的应用程序公开元数据标签。此功能最实用的用途是代理负责 Facebook Open Graph 和 Twitter Cards 缩略图的 HTML 元标签,这可以进一步提升您的应用程序的知名度和增长。

Open Graph 示例

目前有两种方法可以使用该功能,在本文档的后续部分,我们将分别称之为frontend流程backend。

前端元数据支持

所有在 PiNet 注册的应用默认启用元数据支持选项。该frontend选项会像机器人一样从您的应用前端抓取数据,然后代表您发布这些数据。作为开发者,您只需确保在 HTML 文件中正确添加 meta 标签,无需担心 PiNet 如何抓取它们。metatags.io 是一个用于验证 HTML 文件的实用工具。如果您想要发布的meta标签已存在于该工具中,并且您选择了相应的流程,PiNet 也应该会自动抓取它们frontend。

元frontend数据支持对于以下类型的开发者来说是一个相关的选项:

a. 对公开整个应用程序的单一元数据集感兴趣,b. 对在开发 SSR 应用程序时公开每个页面的动态元数据感兴趣。

后端元数据支持

尽管该frontend流程非常简单,且对使用 Web 和 SSR 框架的开发人员所需的自定义配置极少,但对于单页应用程序 (SPA) 开发人员来说可能不太方便。因此,PiNet 还提供了一个自定义解决方案,该方案涉及backendPiNet 与您的应用程序之间的通信,以便如果您正在开发单页应用程序,则可以使您的页面动态生成元数据标签。

先决条件

使用backend元数据支持选项之前,必须先在 Pi 开发者门户应用中启用它。打开 Pi 开发者门户应用,选择要为其启用backendPiNet 元数据支持的应用,然后进入“PiNet 设置”。在“元数据支持类型backend”字段中选择该选项,并提供有效的后端 URL。

注意:在配置 PiNet 设置之前,该应用程序必须在 Pi 开发者门户中注册一个已验证的域名。

前往 Pi 开发者门户中的 PiNet 设置 前往 Pi 开发者门户中的 PiNet 设置

后端设置

选择元数据支持类型后backend,PiNet 会向您的后端端点发送 GET 请求,并将/pinet/meta?pathname=<encoded-pathname>URL 的路径名作为搜索参数传递。例如,对于使用 PiNet 子域名example(可通过`<URL>` 访问https://example.pinet.com)的 PiNet 应用程序,当https://example.pinet.com/faq/1使用 `<URL>` 时,PiNet 会向 `<URL>` 发送 GET 请求https://examplebackendurl.com/pinet/meta?pathname=%2Ffaq%2F1',并期望收到PiNetMetadataDTO形状为 `<DTO>` 的响应。如果响应的 HTTP 状态码为 200 且形状正确,PiNet 将会对外公开元数据。

类型

PiNetMetadataDTO

PiNet 要求您提供PiNetMetadataDTO类型信息。DTO 顶层的所有字段都是可选的,因此如果您不想提供所有元数据详细信息,可以省略。但是,如果提供了某些嵌套类型,则需要您提供相应的必填字段。

在以下类型别名定义中,所有?键名后紧跟 `\` 的字段都表示可选字段。例如,`\`title?:表示可选字段,而 ` title:\` 则表示必填字段。

type PiNetMetadataDTO = {
  title?: string;
  description?: string;
  authors?: null | Author | Array<Author>;
  keywords?: null | string | Array<string>;
  creator?: null | string;
  publisher?: null | string;
  formatDetection?: null | FormatDetection;
  abstract?: null | string;
  archives?: null | string | Array<string>;
  category?: null | string;
  classification?: null | string;
  openGraph?: null | OGMetadata;
  twitter?: null | TwitterMetadata;
  icons?: null | string | Array<Icon> | Icons;
};


下面列出了上述代码中使用的默认 HTML 元标记的特定类型别名PiNetMetadataDTO:

type Author = {
  url?: string;
  name?: string;
};
type FormatDetection = {
  telephone?: boolean;
  date?: boolean;
  address?: boolean;
  email?: boolean;
  url?: boolean;
};
type IconDescriptor = {
  url: string;
  type?: string;
  sizes?: string;
  color?: string;
  rel?: string;
  media?: string;
  fetchPriority?: "high" | "low" | "auto";
};
type Icon = string | IconDescriptor;
type Icons = {
  icon?: Icon | Array<Icon>;
  shortcut?: Icon | Array<Icon>;
  apple?: Icon | Array<Icon>;
  other?: IconDescriptor | Array<IconDescriptor>;
};


OpenGraph

PiNet 允许您定义 OpenGraph 特有的元数据,这些元数据将代表您公开。其主要OGMetadata类型别名是可区分联合,其中type字段是判别因子。因此,如果定义了特定元数据,则某些OGMetadata联合成员允许您指定其他属性type。

type OGMetadata =
  | OGMetadataWebsite
  | OGMetadataArticle
  | OGMetadataBook
  | OGMetadataProfile
  | OGMetadataMusicSong
  | OGMetadataMusicAlbum
  | OGMetadataMusicPlaylist
  | OGMetadataMusicRadioStation
  | OGMetadataVideoMovie
  | OGMetadataVideoEpisode
  | OGMetadataVideoTVShow
  | OGMetadataVideoOther;
type OGMetadataBase = {
  title?: string;
  description?: string;
  emails?: Array<string>;
  phoneNumbers?: Array<string>;
  faxNumbers?: Array<string>;
  locale?: string;
  alternateLocale?: Array<string>;
  images?: OGImage | Array<OGImage>;
  audio?: Array<OGAudio>;
  videos?: Array<OGVideo>;
  countryName?: string;
};
type OGMetadataWebsite = OGMetadataBase & {
  type: "website";
};
type OGMetadataArticle = OGMetadataBase & {
  type: "article";
  publishedTime?: string;
  modifiedTime?: string;
  expirationTime?: string;
  authors?: null | string | Array<string>;
  section?: null | string;
  tags?: null | string | Array<string>;
};
type OGMetadataBook = OGMetadataBase & {
  type: "book";
  isbn?: null | string;
  releaseDate?: null | string;
  authors?: null | string | Array<string>;
};
type OGMetadataProfile = OGMetadataBase & {
  type: "profile";
  firstName?: null | string;
  lastName?: null | string;
  username?: null | string;
  gender?: null | string;
};
type OGMetadataMusicSong = OGMetadataBase & {
  type: "music.song";
  duration?: null | number;
  albums?: null | string | OGAlbum | Array<OGAlbum>;
  musicians?: null | string | Array<string>;
};
type OGMetadataMusicAlbum = OGMetadataBase & {
  type: "music.album";
  songs?: null | string | OGSong | Array<string | OGSong>;
  musicians?: null | string | Array<string>;
  releaseDate?: null | string;
};
type OGMetadataMusicPlaylist = OGMetadataBase & {
  type: "music.playlist";
  songs?: null | string | OGSong | Array<string | OGSong>;
  creators?: null | string | Array<string>;
};
type OGMetadataMusicRadioStation = OGMetadataBase & {
  type: "music.radio_station";
  creators?: null | string | Array<string>;
};
type OGMetadataVideoMovie = OGMetadataBase & {
  type: "video.movie";
  actors?: null | string | OGActor | Array<OGActor>;
  directors?: null | string | Array<string>;
  writers?: null | string | Array<string>;
  duration?: null | number;
  releaseDate?: null | string;
  tags?: null | string | Array<string>;
};
type OGMetadataVideoEpisode = OGMetadataBase & {
  type: "video.episode";
  actors?: null | string | OGActor | Array<OGActor>;
  directors?: null | string | Array<string>;
  writers?: null | string | Array<string>;
  duration?: null | number;
  releaseDate?: null | string;
  tags?: null | string | Array<string>;
  series?: null | string;
};
type OGMetadataVideoTVShow = OGMetadataBase & {
  type: "video.tv_show";
};
type OGMetadataVideoOther = OGMetadataBase & {
  type: "video.other";
};

OGMetadata下面列出了上述不同联盟成员重复使用的类型别名:

type OGImageDescriptor = {
  url: string;
  secureUrl?: string;
  alt?: string;
  type?: string;
  width?: string | number;
  height?: string | number;
};
type OGImage = string | OGImageDescriptor;
type OGVideoDescriptor = {
  url: string;
  secureUrl?: string;
  alt?: string;
  type?: string;
  width?: string | number;
  height?: string | number;
};
type OGVideo = string | OGVideoDescriptor;
type OGAudioDescriptor = {
  url: string;
  secureUrl?: string;
  alt?: string;
};
type OGAudio = string | OGAudioDescriptor;
type OGActor = {
  url: string;
  role?: string;
};
type OGSong = {
  url: string;
  disc?: number;
  track?: number;
};
type OGAlbum = {
  url: string;
  disc?: number;
  track?: number;
};


Twitter 卡片

与支持 OpenGraph 协议类似,PiNet 允许您定义 Twitter 特有的元数据。其主要OGTwitterMetadata类型别名是可区分联合,其中字段是判别项。因此,如果定义了特定属性card,则某些OGTwitterMetadata联合成员允许您指定其他属性。card

type TwitterMetadata =
  | TwitterMetadataBase
  | TwitterMetadataCardSummary
  | TwitterMetadataCardSummaryLargeImage
  | TwitterMetadataCardPlayer
  | TwitterMetadataCardApp;
type TwitterMetadataBase = {
  title?: string;
  description?: string;
  creator?: string;
  creatorId?: string;
  images?: TwitterImage | Array<TwitterImage>;
};
type TwitterMetadataCardSummary = TwitterMetadataBase & {
  card: "summary";
};
type TwitterMetadataCardSummaryLargeImage = TwitterMetadataBase & {
  card: "summary_large_image";
};
type TwitterMetadataCardPlayer = TwitterMetadataBase & {
  card: "player";
  players: TwitterPlayerDescriptor | Array<TwitterPlayerDescriptor>;
};
type TwitterMetadataCardApp = TwitterMetadataBase & {
  card: "app";
};
OGTwitterMetadata下面列出了上述不同联盟成员重复使用的类型别名:
type TwitterImageDescriptor = {
  url: string;
  secureUrl?: string;
  alt?: string;
  type?: string;
  width?: string | number;
  height?: string | number;
};
type TwitterImage = string | TwitterImageDescriptor;
type TwitterPlayerDescriptor = {
  url: string;
  width: number;
  height: number;
};

PiNetMetadataDTO验证工具

这PiNetMetadataDTO可能会变得相当复杂,您可能难以验证您提供的 DTO 是否能通过 PiNet 的内部验证。您可以使用PiNet上提供的表单来验证您的 DTO 是否有效。

打赏 Pi 打赏 微信打赏