

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Post-ads 回应
<a name="monetization-functions-hooks-post-ads"></a>

## 当它着火的时候
<a name="monetization-functions-hooks-post-ads-when"></a>

MediaTailor 在接收和解析来自 ADS 的响应（包括 VAST 包装器重定向的解析）`POST_ADS_RESPONSE`后，运行映射到的函数。该函数会在 MediaTailor 选择要插入的广告之前查看已解析的广告，因此此处所做的更改会影响哪些广告填充广告间隔。

该挂钩适用于所有直播协议（HLS 和 DASH）和所有播放模式（直播、VOD 和前置播放）。它通常在每个广告插播时段触发一次。对于同时涵盖多个广告时段的 ADS 响应（例如 VMAP 响应）和预取的广告响应，在 MediaTailor 处理响应且`avail`输入命名空间不存在时会触发挂钩。用于`$exists(avail)`在访问可用字段之前进行检查。

## Input
<a name="monetization-functions-hooks-post-ads-input"></a>

`event.*`、`session.*``adsRequest.*`、和`adsResponse.*`，`avail.*`当响应适用于单个广告插播时段时，再加上。有关所有可用字段，请参阅[输入字段参考](monetization-functions-hooks.md#monetization-functions-hooks-input-ref)。

## 允许输出命名空间
<a name="monetization-functions-hooks-post-ads-output"></a>


| 命名空间 | 可接受的类型 | 如何使用输出 | 
| --- | --- | --- | 
| adsResponse.ads | 广告对象数组 | 替换此响应的已解析广告列表。 MediaTailor 将每个返回的广告与原始广告进行匹配，adId并使用返回的列表继续选择广告。 | 
| temp.\* | Any | 用于在执行器中的步骤之间传递值的临时数据。没有坚持下去。 | 

将修改后的广告清单写回`adsResponse.ads`。你可以：
+ **过滤器 ** — 返回原始广告的子集。您省略的广告不被考虑插入，它们占用的时长可供其他广告填充。
+ **重新排序 ** — 按不同的顺序返回广告。顺序会影响哪些广告首先填充广告间隔。
+ **修改 ** — 在广告`trackingEvents`上更改`durationSeconds``adSystem``adTitle``mediaFiles`、、、或。不变返回的广告保留其所有原始 VAST 元数据。
+ **注入 ** — 添加不在原始回复中的广告。新条目必须包含`adId``durationSeconds`、和`mediaFiles`。在同一个挂钩调用中使用`VAST_REQUEST`函数获取的广告是个例外：在它`adId`旁边附加这样的广告就足够了，因为可以 MediaTailor 恢复广告的完整解析后的 VAST 数据。有关更多信息，请参阅 [VAST 请求](monetization-functions-types-vast-request.md)。

**重要**  
过滤时请务必使用 JSonata 数组构造函数或数组强制。当一个广告恰好匹配时，过滤器表达式（例如）`adsResponse.ads[adSystem != 'BLOCKED']`会生成单个对象。当零个广告匹配时，它根本不会产生任何价值。在这种情况下，输出键被省略，过滤器不起作用。将表达式括在方括号中或附加：`[]`  

```
{
    "Output": {
        "adsResponse.ads": "{%adsResponse.ads[adSystem != 'BLOCKED'][]%}"
    }
}
```

以下规则适用于返回的广告列表：
+ 如果两个参赛作品共享 `adId` a，则第一次出现的获胜。
+ 无效的参赛作品将被逐一拒绝。同一输出中的有效条目仍然适用。
+ 如果注入的条目与 AD `adId` S 响应中的广告发生冲突，则将使用原始广告作为基础，并在其上方应用您的字段更改。

## 这个钩子看不到什么
<a name="monetization-functions-hooks-post-ads-scope"></a>

该挂钩在广告选择之前运行，因此它不会看到其他 MediaTailor功能所贡献的广告，也无法确定最终将插入哪些广告，因为转码状态和填充决策是在之后做出的。对于预取的广告，当 MediaTailor 处理预取响应本身时，挂钩就会触发。在稍后的广告插播中，之前预先提取的广告将在此挂钩运行后合并，因此挂钩无法在那里看到它们。要对最终的广告集采取行动，请使用`PRE_MANIFEST_INSERTION`。

## 典型用例
<a name="monetization-functions-hooks-post-ads-use-cases"></a>
+ 按元数据筛选广告，例如从竞争广告系统中移除广告，使其不会出现在同一个广告时段中（竞争分离）。
+ 当主要响应较短时，使用`VAST_REQUEST`函数从辅助广告服务器获取更多广告，并将其附加到广告列表中。
+ 重新排序广告，使首选广告首先填满广告间隔。
+ 在插入之前修改跟踪事件或广告元数据。

## 失败行为
<a name="monetization-functions-hooks-post-ads-failure"></a>

如果附加到的函数由于任何原因（例如超时、表达式错误或无效输出）而`POST_ADS_RESPONSE`失败，则 MediaTailor 丢弃该函数的输出。请求继续执行原始 ADS 响应，就好像没有附加任何功能一样。如果序列化输入超过输入大小限制，则完全 MediaTailor 跳过挂钩调用。有关适用的限制，请参阅[限制](monetization-functions-limits.md)。