Пользователи предпочитают смотреть или слушать контент, к которому у них уже есть доступ, например, контент по их подписке. Если Google знает, какой контент доступен пользователю в вашем приложении или на вашей платформе, он может сформировать более эффективный результат поиска или отклик, чтобы направить пользователя к этому контенту.

Определить требования к доступу к контенту
Вам необходимо определить требования к доступу для каждого пакета контента в вашем каталоге. При этом обратите внимание на следующие вопросы:
- Необходимо ли пользователям входить в ваше приложение или на платформу для доступа к контенту?
Нужна ли пользователям подписка?
Только действия для просмотра:
- Нужна ли пользователям подписка у внешнего поставщика услуг?
- Предлагаете ли вы многоуровневую, многопакетную или дополнительную подписку?
Только действия для просмотра: Нужно ли пользователям арендовать или покупать контент?
Меняются ли требования к доступу со временем?
Зависят ли требования к доступу от местоположения устройства?
Типы ограничения доступа
Существует два вида ограничений доступа:
Тип платного доступа
Вы можете ограничить доступ к контенту, выбрав тип платного доступа. В следующей таблице подробно описаны различные типы платного доступа:
Тип платного доступа | Пример | Категория |
---|---|---|
Покупка или вход в систему не требуются. | Треск | nologinrequired |
Пользователь должен быть авторизован, но ему не нужна платная подписка. | Вуду (AVOD) | free |
У пользователя должна быть активная подписка. Доступ не зависит от уровня подписки. | Нетфликс | |
У пользователя должна быть активная подписка. Доступ зависит от уровня подписки. | Hulu (дополнения) | |
Контент доступен в течение ограниченного периода времени после покупки. | Вуду | rental |
Контент доступен в течение неопределенного периода времени после покупки. | Вуду | purchase |
Контент доступен по кабельной подписке. | HBO Go | externalSubscription |
Тип платного доступа для Watch Actions
Чтобы указать тип платного доступа к контенту для действий просмотра, используйте свойство category
в спецификации доступа к действию :
"potentialAction": {
"@type":"WatchAction",
"target": { … },
"actionAccessibilityRequirement": {
"@type": "ActionAccessSpecification",
"category": "subscription",
"availabilityStarts": "2018-06-01T10:35:29Z",
"availabilityEnds": "2019-05-31T10:35:29Z",
"eligibleRegion": {
"@type": "Country",
"name": "US"
}
},
...
}
Тип платного доступа для действий «Прослушать»
Чтобы указать тип платного доступа к контенту для действий прослушивания, используйте свойство category
в объекте предложения :
"potentialAction": {
"@type":"ListenAction",
"target": { … },
"expectsAcceptanceOf":{
"@type":"Offer",
"category":"subscription",
"availabilityStarts": "2018-06-01T10:35:29Z",
"availabilityEnds": "2019-05-31T10:35:29Z",
"eligibleRegion": {
"@type":"Country",
"name":"US"
}
},
...
}
Географическая область
Необходимо указать географические регионы, где доступен контент. Используйте одно или оба из следующих свойств:
- Свойство
eligibleRegion
объекта спецификации доступа Action . Это свойство обязательно. - Свойство
ineligibleRegion
объекта спецификации доступа Action .
Пользователь может получить доступ к контенту, если местоположение устройства находится в пределах любого региона, указанного в eligibleRegion
, и не находится ни в одном регионе, указанном в ineligibleRegion
.
Свойства eligibleRegion
и ineligibleRegion
допускают следующие значения:
- Список
Country
,City
иState
. - Объект
GeoShape
. Подробные требования см. в разделе «СвойстваGeoShape
. - Список объектов
GeoShape
.
Если контент доступен глобально, используйте следующее специальное значение для eligibleRegion
:
"eligibleRegion": "EARTH",
варианты использования conformRegion
Ниже приведены примеры использования свойства eligibleRegion
:
- Пример 1:
eligibleRegion
со списком стран. - Пример 2:
eligibleRegion
с объектомGeoShape
, содержащим список почтовых индексов. - Пример 3:
eligibleRegion
с объектомGeoShape
, содержащим список кодов зоны прямой сортировки (FSA). - Пример 4:
eligibleRegion
с объектомGeoShape
, содержащим идентификатор DMA. - Пример 5:
eligibleRegion
со списком объектовGeoShape
. Каждый из них содержит идентификатор DMA. - Пример 6:
ineligibleRegion
с заблокированными почтовыми индексами.
Пример 1
eligibleRegion
со списком стран:
"actionAccessibilityRequirement": { "@type": "ActionAccessSpecification", "category": "subscription", "requiresSubscription": { "@type": "MediaSubscription", "@id": "http://www.example.com/north_america_network/subscription", "name": "Example Subscription", "commonTier": true }, "eligibleRegion": [ { "@type": "Country", "name": "US" }, { "@type": "Country", "name": "CA" } ] }
Пример 2
eligibleRegion
с объектом GeoShape
, содержащим список почтовых индексов:
"actionAccessibilityRequirement": { "@type": "ActionAccessSpecification", "category": "subscription", "requiresSubscription": { "@type": "MediaSubscription", "@id": "http://www.example.com/local_tv_network/subscription", "name": "Example Subscription", "commonTier": true }, "eligibleRegion": { "@type": "GeoShape", "@id": "http://example.com/area1", "addressCountry": "US", "postalCode": [ "94118", "94119" ] } }
Пример 3
eligibleRegion
с объектом GeoShape
, содержащим список кодов зоны прямой сортировки (FSA):
"actionAccessibilityRequirement": { "@type": "ActionAccessSpecification", "category": "subscription", "requiresSubscription": { "@type": "MediaSubscription", "@id": "http://www.example.com/local_tv_network/subscription", "name": "Example Subscription", "commonTier": true }, "additionalProperty": { "@type": "PropertyValue", "name": "DisplaySubscriptionIdentifier", "value": "http://www.example.com/local_tv_network/subscription" }, "eligibleRegion":{ "@type": "GeoShape", "@id": "http://example.com/area2", "addressCountry": "CA", "postalCode": [ "1A1", "K1A" ] } }
Пример 4
eligibleRegion
с объектом GeoShape
, содержащим идентификатор DMA:
"actionAccessibilityRequirement": { "@type": "ActionAccessSpecification", "category": "subscription", "requiresSubscription": { "@type": "MediaSubscription", "@id": "http://www.example.com/abcd/subscription", "name": "Example Subscription", "commonTier": true }, "additionalProperty": { "@type": "PropertyValue", "name": "DisplaySubscriptionIdentifier", "value": "http://www.example.com/abcd/subscription" }, "eligibleRegion":{ "@type": "GeoShape", "@id": "http://example.com/area3", "addressCountry": "US", "identifier": [ { "@type": "PropertyValue", "propertyID": "DMA_ID", "value": "501" } ] } }
Пример 5
eligibleRegion
со списком объектов GeoShape
. Каждый объект содержит идентификатор DMA:
"actionAccessibilityRequirement" : { "@type" : "ActionAccessSpecification", "eligibleRegion" : [ { "@id" : "http://example.com/dma/601", "@type" : "GeoShape", "addressCountry" : "US", "identifier" : { "@type" : "PropertyValue", "propertyID" : "DMA_ID", "value" : "601" } }, { "@id" : "http://example.com/dma/602", "@type" : "GeoShape", "addressCountry" : "US", "identifier" : { "@type" : "PropertyValue", "propertyID" : "DMA_ID", "value" : "602" } } ] }
Пример 6
ineligibleRegion
с заблокированными почтовыми индексами:
"actionAccessibilityRequirement": { "@type": "ActionAccessSpecification", "category": "subscription", "requiresSubscription": { "@type": "MediaSubscription", "@id": "http://www.example.com/local_tv_network/subscription", "name": "Example Subscription", "commonTier": true }, "additionalProperty": { "@type": "PropertyValue", "name": "DisplaySubscriptionIdentifier", "value": "http://www.example.com/local_tv_network/subscription" }, "eligibleRegion": { "@type": "Country", "name": "US" }, "ineligibleRegion": { "@type": "GeoShape", "@id": "http://example.com/area1", "addressCountry": "US", "postalCode": [ "94118", "94119" ] } }
Идентификатор права
Идентификатор права доступа, entitlementId
, — это строка, которая представляет доступ к группе контента в вашем каталоге медиаконтента. Чтобы определить, имеет ли пользователь доступ к вашему контенту, Google выполняет следующие действия:
- Мы делаем вызов API к вашей конечной точке прав , чтобы получить идентификаторы прав пользователя.
- Мы ищем требуемые идентификаторы прав доступа к контенту в вашем фиде Media Actions.
- Мы сопоставляем
entitlementId
пользователя со свойствомidentifier
объекта подписки на медиа в вашей ленте. Если хотя бы одинentitlementId
совпадает, мы определяем, что пользователь имеет доступ к контенту.

Google рекомендует использовать следующий синтаксис для entitlementId
:
<domain name> + colon (:) + <access level to content>
Примеры синтаксиса:
-
example.com:basic
-
example.com:premium
-
example.com:sports
Пример идентификатора права
В фиде MediaExampleCompany указано, что Movie XYZ
требуется example.com:basic
entitlementId
, как показано ниже:
{ "@context": ["http://schema.org", {"@language": "en"}], "@type": "Movie", "@id": "www.example.com/movie_xyz", "url": "www.example.com/movie_xyz", "name": "Movie XYZ", "potentialAction": { "@type": "WatchAction", "target": [ … ], "actionAccessibilityRequirement": { "@type": "ActionAccessSpecification", "category": "subscription", "requiresSubscription": { "@type": "MediaSubscription", "@id": "http://www.example.com/basic_subscription", "name": "Basic subscription", "commonTier": true ... }, "additionalProperty": { "@type": "PropertyValue", "name": "DisplaySubscriptionIdentifier", "value": "http://www.example.com/basic_subscription" }, ... } }, ... }
Варианты использования общего доступа
Ниже приведены распространенные варианты использования доступа:
- Бесплатно (вход в систему не требуется): контент доступен без входа в систему, подписки или покупки.
- Бесплатно (требуется авторизация): контент требует авторизации пользователя, но не требует подписки.
- Одноуровневая подписка: контент требует подписки. Все подписчики получают доступ к одному и тому же контенту, будь то фильмы или эпизоды, независимо от тарифного плана.
- Многоуровневая подписка: контент требует подписки. Подписчики могут получить доступ к разному контенту, будь то фильмы или эпизоды, в зависимости от уровня подписки. Например, «Серебряный» или «Золотой» .
- Дополнительная подписка: контент требует подписки. Подписчики могут добавлять премиум-контент в дополнение к своей обычной подписке.
- Разовая покупка: контент можно приобрести, после чего пользователь может получить к нему неограниченный доступ.
- Прямая трансляция: подписка включает доступ к местным, национальным и премиум-каналам.
- Сторонняя подписка: для просмотра контента пользователю необходимо войти в систему своего кабельного провайдера.
Бесплатно (вход в систему не требуется)
Вход не требуется
Контент доступен без входа в систему или подписки.
{ "actionAccessibilityRequirement": { "@type": "ActionAccessSpecification", "category": "nologinrequired", "availabilityStarts": "2015-01-01T00:00Z", "availabilityEnds": "2015-12-31T00:00Z", "eligibleRegion": { "@type": "Country", "name": "US" } } }
- Установить
category
nologinrequired
. - Не включайте
expectAcceptanceOf
.
Бесплатно (требуется вход в систему)
Требуется вход в систему
Для просмотра контента требуется авторизация пользователя, но не требуется подписка.
{ "actionAccessibilityRequirement": { "@type": "ActionAccessSpecification", "category": "free", "availabilityStarts": "2015-01-01T00:00Z", "availabilityEnds": "2015-12-31T00:00Z", "eligibleRegion": { "@type": "Country", "name": "US" } } }
- Установить
category
«free
. - Не включайте
expectAcceptanceOf
.
Одноуровневая подписка
В одноуровневой модели подписки у поставщика услуг есть один уровень подписки. Все подписчики получают доступ к одному и тому же контенту, будь то фильмы или сериалы, независимо от тарифного плана.
{ "actionAccessibilityRequirement": { "@type": "ActionAccessSpecification", "category": "subscription", "availabilityStarts": "2015-01-01T00:00Z", "availabilityEnds": "2015-12-31T00:00Z", "requiresSubscription": { "@type": "MediaSubscription", "name": "Example Package", "commonTier": true, "@id": "http://www.example.com/example_package" }, "additionalProperty": { "@type": "PropertyValue", "name": "DisplaySubscriptionIdentifier", "value": "http://www.example.com/example_package" }, "eligibleRegion": { "@type": "Country", "name": "US" } } }
Многоуровневая подписка
В многоуровневой модели подписки поставщик услуг предлагает несколько уровней подписки, например, «Золотой» , «Серебряный» и «Бронзовый» . Пользователи с подпиской верхнего уровня получают доступ ко всему контенту нижнего уровня. Однако пользователи с подпиской нижнего уровня не могут получить доступ к контенту верхнего уровня.

Рассмотрим следующий сценарий:
- Джейн подписана на уровень Gold . Ваша конечная точка прав доступа возвращает следующие идентификаторы
entitlementId
:-
example.com:bronze
-
example.com:silver
-
example.com:gold
-
- Джон подписан на уровень Bronze . Ваша конечная точка прав возвращает следующий
entitlementId
:-
example.com:bronze
-
- В вашем канале Media Actions описаны следующие требования:
- Для фильма А требуется
example.com:bronze
. - Для фильма B требуется
example.com:silver
.
- Для фильма А требуется
В этом сценарии Google определяет следующие уровни доступа для Джейн и Джона:
- У Джейн и Джона есть доступ к фильму А.
- У Джейн есть доступ к фильму Б , а у Джона — нет.
{ "actionAccessibilityRequirement": { "@type": "ActionAccessSpecification", "category": "subscription", "requiresSubscription": { "@type": "MediaSubscription", "@id": "http://www.example.com/basic_subscription", "name": "Bronze", "commonTier": true ... }, "additionalProperty": { "@type": "PropertyValue", "name": "DisplaySubscriptionIdentifier", "value": "http://www.example.com/basic_subscription" }, ... } }
Дополнительная подписка
В модели подписки с дополнительными услугами поставщик услуг позволяет пользователям расширять свои права и добавлять каналы к базовой подписке. Пользователи могут добавлять любое количество каналов.

Рассмотрим следующий сценарий:
- У Джейн есть подписки PRO и Sportz в дополнение к базовой . Ваша конечная точка прав доступа возвращает следующие идентификаторы
entitlementId
:-
example.com:basic
-
example.com:pro
-
example.com:sportz
-
- У Джона только базовая подписка. Ваша конечная точка прав возвращает следующий
entitlementId
:-
example.com:basic
-
- В вашем канале Media Actions описаны следующие требования:
- Для фильма A требуется
example.com:basic
. - Для фильма B требуется
example.com:pro
.
- Для фильма A требуется
В этом сценарии Google определяет следующие уровни доступа для Джейн и Джона:
- У Джейн и Джона есть доступ к фильму А.
- У Джейн есть доступ к фильму Б , а у Джона — нет.
{ "actionAccessibilityRequirement": { "@type": "ActionAccessSpecification", "category": "subscription", "availabilityStarts": "2015-01-01T00:00Z", "availabilityEnds": "2015-12-31T00:00Z", "eligibleRegion": { "@type": "Country", "name": "US" } "requiresSubscription": [ { "@type": "MediaSubscription", "@id": "https://www.example.com/package/basic", "name": "Basic", "sameAs": "https://www.example.com/package/basic", "commonTier": true }, { "@type": "MediaSubscription", "@id": "https://www.example.com/packages/basic/pro", "name": "PRO", "sameAs": "https://www.example.com/package/pro", "identifier": "example.com:pro", "commonTier": false }, { "@type": "MediaSubscription", "@id": "https://www.example.com/package/sportz", "name": "Sportz", "sameAs": "https://www.example.com/package/sports", "identifier": "example.com:sportz", "commonTier": false } ], "additionalProperty": { "@type": "PropertyValue", "name": "DisplaySubscriptionIdentifier", "value": "http://www.example.com/package/basic" }, } } }
Разовая покупка
Покупка
Контент доступен в течение неопределенного периода времени после покупки.
{ "actionAccessibilityRequirement": { "@type": "ActionAccessSpecification", "category": "purchase", "availabilityStarts": "2015-01-01T00:00Z", "availabilityEnds": "2015-12-31T00:00Z", "eligibleRegion": { "@type": "Country", "name": "US" }, "expectsAcceptanceOf": { "@type": "Offer", "price": 7.99, "priceCurrency": "USD", "seller": { "@type": "Organization", "name": "Example", "sameAs": "http://www.example.com/" } } } }
- Установить
category
дляpurchase
. - Включите
expectAcceptanceOf
вactionAccessibilityRequirement
, чтобы указать цену покупки.
Аренда
Контент доступен в течение ограниченного периода времени после покупки.
{ "actionAccessibilityRequirement": { "@type": "ActionAccessSpecification", "category": "rental", "availabilityStarts": "2015-01-01T00:00Z", "availabilityEnds": "2015-12-31T00:00Z", "eligibleRegion": { "@type": "Country", "name": "US" }, "expectsAcceptanceOf": { "@type": "Offer", "price": 7.99, "priceCurrency": "USD", "seller": { "@type": "Organization", "name": "Example", "sameAs": "http://www.example.com/" } } } }
- Установить
category
rental
. - Включите
expectAcceptanceOf
вactionAccessibilityRequirement
, чтобы указать стоимость аренды.
Прямой эфир
В ленте действий с медиа вы можете ограничить доступ к каналу или событию Live TV на основе следующих двух пользовательских условий:
- Местоположение устройства пользователя
Чтобы ограничить доступ к телеканалу, укажите зону, в которой пользователи имеют к нему доступ. Это условие обычно применяется к телеканалам местного вещания.
- Статус учетной записи пользователя
Если доступ к телеканалу зависит от настроек уровня учетной записи пользователя, используйте идентификаторы прав для обозначения ограничения.
Это условие обычно применяется к следующим вариантам использования:
- Пакет: Национальные каналы часто включены в пакеты, и пользователи сами выбирают, на какой пакет они хотят подписаться.
- Дополнение: для некоторых премиум-каналов пользователям необходимо выборочно добавлять дополнительные каналы в свою подписку.
- Региональная спортивная сеть (RSN): RSN обычно привязаны к «домашнему» местоположению пользователя. Пользователи могут смотреть контент RSN, даже находясь за пределами своего «домашнего» местоположения.
Сторонняя подписка
Сторонняя подписка
Контент доступен подписчикам другого сервиса.
{ "actionAccessibilityRequirement": { "@type": "ActionAccessSpecification", "category": "externalsubscription" "availabilityStarts": "2015-01-01T00:00Z", "availabilityEnds": "2015-12-31T00:00Z", "requiresSubscription":{ "@type": "MediaSubscription", "@id": "https://www.example.com/faq", "name": "Example", "sameAs": "https://www.example.com/faq", "authenticator": { "@type": "Organization", "name": "TVE" } }, "additionalProperty": { "@type": "PropertyValue", "name": "DisplaySubscriptionIdentifier", "value": "http://www.example.com/faq" }, "eligibleRegion": { "@type": "Country", "name": "US" } } }
- Добавьте
authenticator
, чтобы указать, что аутентификацию подписчиков осуществляет другой сервис. Например, для HBO GO требуется подписка от кабельного провайдера.
Пакеты общего уровня
Контент общего уровня доступен всем подписчикам независимо от их тарифного плана. Общий уровень применяется ко всему контенту, относящемуся к category
subscription
. Подробнее о свойствах category
см. в разделе «Тип платного доступа» .
Зачем нужен пакет общего уровня?
Несколько продуктов Google предлагают пользователям рекомендации телепередач и фильмов, включая Google Поиск, Android TV и Google Ассистент. Чтобы сформировать ожидания пользователей относительно стоимости, Google должен понимать, какой контент доступен всем подписчикам в рамках общего тарифного плана. Google также должен понимать, какой контент доступен подписчикам с определенными пакетами подписки.
Если вы не поддерживаете API для управления правами доступа, Google рекомендует использовать книги, доступные на общем уровне. API позволяет Google определить, к каким книгам, не относящимся к общему уровню, может получить доступ каждый конкретный пользователь.
Когда следует создавать пакет общего уровня?
Пакет общего уровня необходим, если ваш сервис предлагает контент, доступный всем подписчикам. Это касается как сервисов с одним пакетом, так и сервисов с несколькими пакетами или дополнениями.
Провайдерам, у которых нет контента, доступного всем подписчикам, не нужно создавать общий пакет. Примером могут служить поставщики услуг, предоставляющие взаимоисключающий контент во всех своих пакетах.
Примеры общего уровня
Ниже приведены примеры общего уровня.
Многоуровневая подписка
В многоуровневой модели подписки поставщик услуг предлагает несколько уровней подписки, например, «Золотой» , «Серебряный» и «Бронзовый ». Пользователи с подпиской более высокого уровня имеют доступ ко всему контенту нижних уровней. Пользователи с подпиской более низкого уровня не имеют доступа к контенту верхнего уровня. На следующем изображении представлен пример структуры пакета.

В следующем примере кода пакет bronze представляет собой общий уровень, поскольку все пользователи имеют доступ ко всему контенту на этом уровне.
"requiresSubscription": [ { "@type": "MediaSubscription", "@id": "https://www.example.com/package/bronze", "name": "Bronze", "sameAs": "https://www.example.com/package/bronze", "commonTier": true }, { "@type": "MediaSubscription", "@id": "https://www.example.com/package/silver", "name": "Silver", "sameAs": "https://www.example.com/package/silver", "identifier": "example.com:silver", "commonTier": false }, { "@type": "MediaSubscription", "@id": "https://www.example.com/package/gold", "name": "Gold", "sameAs": "https://www.example.com/package/gold", "identifier": "example.com:gold", "commonTier": false } ],
Дополнения
В модели подписки с дополнительными услугами поставщик услуг позволяет пользователям расширять свои права и добавлять каналы к базовой подписке. Пользователи могут добавлять любое количество каналов. На следующем изображении показан пример структуры пакета.

Если у вас есть канал, доступный всем пользователям, и за него нет платы, вы можете объединить пакет с пакетом общего уровня.
В следующем примере кода базовый пакет представляет собой общий уровень, поскольку все пользователи имеют доступ ко всему содержимому этого пакета.
"requiresSubscription": [ { "@type": "MediaSubscription", "@id": "https://www.example.com/package/basic", "name": "Basic", "sameAs": "https://www.example.com/package/basic", "commonTier": true }, { "@type": "MediaSubscription", "@id": "https://www.example.com/packages/basic/pro", "name": "PRO", "sameAs": "https://www.example.com/package/pro", "identifier": "example.com:pro", "commonTier": false }, { "@type": "MediaSubscription", "@id": "https://www.example.com/package/sportz", "name": "Sportz", "sameAs": "https://www.example.com/package/sports", "identifier": "example.com:sportz", "commonTier": false }, { "@type": "MediaSubscription", "@id": "https://www.example.com/package/moviemax", "name": "Moviemax", "sameAs": "https://www.example.com/package/moviemax", "identifier": "example.com:moviemax", "commonTier": false } ],
Пакеты с контентом, который пересекается
В модели контента, где пакеты содержат пересекающийся контент, поставщик услуг продаёт пакеты, включающие в себя контент из других пакетов. На следующем изображении показан пример структуры пакета.

В следующем примере кода поставщик предлагает три пакета, часть контента которых пересекается во всех пакетах. В этом случае требуется четвёртый пакет, представляющий общий уровень. Он должен включать весь контент, доступный во всех трёх пакетах.
"requiresSubscription": [ { "@type": "MediaSubscription", "@id": "https://www.example.com/package/1", "name": "Package 1", "sameAs": "https://www.example.com/package/1", "identifier": "example.com:package1", "commonTier": false }, { "@type": "MediaSubscription", "@id": "https://www.example.com/package/2", "name": "Package 2", "sameAs": "https://www.example.com/package/2", "identifier": "example.com:package2", "commonTier": false }, { "@type": "MediaSubscription", "@id": "https://www.example.com/package/3", "name": "Package 3", "sameAs": "https://www.example.com/package/3", "identifier": "example.com:package3", "commonTier": false }, { "@type": "MediaSubscription", "@id": "https://www.example.com/package/common", "name": "Common Tier Package", "sameAs": "https://www.example.com/package/common", "commonTier": true } ],
Пакеты без пересекающегося содержимого
В модели контента, где все пакеты контента не пересекаются, поставщик услуг продаёт пакеты, не включающие контент из других пакетов. На следующем изображении показан пример структуры пакета.

В следующем примере провайдер предлагает три пакета, контент которых не пересекается. Пакет общего уровня не требуется.
"requiresSubscription": [ { "@type": "MediaSubscription", "@id": "https://www.example.com/package/1", "name": "Package 1", "sameAs": "https://www.example.com/package/1", "identifier": "example.com:package1", "commonTier": false }, { "@type": "MediaSubscription", "@id": "https://www.example.com/package/2", "name": "Package 2", "sameAs": "https://www.example.com/package/2", "identifier": "example.com:package2", "commonTier": false }, { "@type": "MediaSubscription", "@id": "https://www.example.com/package/3", "name": "Package 3", "sameAs": "https://www.example.com/package/3", "identifier": "example.com:package3", "commonTier": false } ],
Конечная точка прав
Используйте информацию из этого раздела для размещения конечной точки HTTPS, которая возвращает права, связанные с пользователем.
Предпосылки
Прежде чем начать, убедитесь, что ваш сервис поддерживает протокол OAuth 2.0 с Google.
Запрос
Чтобы получить права пользователя, Google отправляет запрос, содержащий его токен OAuth. Ваша конечная точка должна идентифицировать пользователя на основе этого токена OAuth. См. следующий пример:
GET /resource HTTP/1.1
Host: server.example.com
Authorization: Bearer <OAuthToken>
Ответ
Ваша конечная точка должна возвращать ответ со следующими свойствами:
Свойство | |
---|---|
subscription | Необходимый Это поле внутри корневого ответа. |
subscription.type | Необходимый Это свойство может иметь следующие значения:
|
subscription.expiration_date | Необязательный Дата истечения срока действия данного разрешения в формате ISO 8601 , включая часовой пояс. Подробнее см. в разделе Сроки действия . |
entitlements | Необязательный Это корневое свойство содержит значения |
entitlements.entitlement | Требуется , если доступ к вашему каталогу потокового вещания зависит от типа подписки. Это свойство содержит |
entitlements.expiration_date | Необязательный Дата истечения срока действия подписки в формате ISO 8601 , включая часовой пояс. Подробнее см. в разделе Сроки действия . |
Сроки годности
В ответе конечной точки есть два свойства, которые относятся к датам истечения срока действия: subscription.expiration_date
и entitlements.expiration_date
. Вы можете включить одно из них или ни одного, но не оба одновременно. Выбор зависит от вашей модели подписки.
Модель подписки | |
---|---|
Доступ к вашему каталогу потокового вещания одинаков для всех подписчиков. | Поскольку вам не нужно указывать свойство entitlements , укажите subscription.expiration_date . |
Доступ к каталогу потокового вещания зависит от деталей подписки пользователя. | Если ваша модель подписки имеет несколько уровней или дополнений, срок действия которых истекает, выполните одно из следующих действий:
|
Примеры ответов
Ниже приведены примеры ответов для различных состояний подписки:
- Активная подписка
- Активная подписка с датой истечения срока действия
- Нет подписки
- Активные подписки на несколько уровней или дополнений
Активная подписка
Активная подписка
У пользователя есть активная подписка на example.com . В этом случае все подписчики имеют доступ ко всему каталогу вашего потокового контента независимо от типа подписки.
{ "subscription" : { "type": "ActiveSubscription", } }
Активная подписка с датой истечения срока действия
Активная подписка с датой истечения срока действия
У пользователя есть активная подписка на example.com , и у подписки есть срок действия. В этом случае все подписчики получают доступ ко всему каталогу вашего стриминга, независимо от типа подписки.
{ "subscription" : { "type": "ActiveSubscription", "expiration_date": "2019-11-10T10:00:00Z" } }
Нет подписки
Нет подписки
У пользователя нет подписки на example.com .
{ "subscription" : { "type": "InactiveSubscription" } }
Активные подписки на несколько уровней или дополнений
Активные подписки на несколько уровней или дополнений
У пользователя имеется подписка на example.com:premium
до определенной даты.
{ "subscription" : { "type": "ActiveSubscription", } "entitlements": [ { "entitlement": "example.com:premium", "expiration": "2019-11-10T10:00:00Z" } ] }
Ограничение скорости
Google обновляет информацию о правах пользователя каждые шесть часов. Чтобы сгладить максимальное количество запросов в секунду (QPS), Google равномерно распределяет запросы к вашей конечной точке. Таким образом, вы можете оценить ожидаемое среднее значение QPS для вашей конечной точки по следующей формуле:
Ожидаемое среднее значение QPS = <общее количество пользователей> / 21 600 секунд (6 часов x 60 минут x 60 секунд)
Если вы обслуживаете большое количество пользователей, Google может скорректировать 6-часовой интервал. При необходимости свяжитесь с Google, чтобы обсудить настройку.
Связаться с Google
Когда ваша конечная точка будет готова, свяжитесь с Google, чтобы сообщить URL-адрес конечной точки.
Свойства спецификации доступа к действию
Справочную информацию см. в разделе свойств спецификации доступа к действию .