

# 连接到 Facebook Ads
<a name="connecting-to-data-facebook-ads"></a>

Facebook Ads 是一个功能强大的数字广告平台，各种规模的企业都使用它来吸引目标受众，实现各种营销目标。该平台允许广告商制作量身定制的广告，这些广告可以在 Facebook 的一系列应用程序和服务（包括 Facebook 和 Messenger）中展示。凭借其先进的定位功能，Facebook Ads 使企业能够接触特定人口统计、兴趣、行为和地点的受众。

**Topics**
+ [AWS Glue 对 Facebook Ads 的支持](facebook-ads-support.md)
+ [包含创建和使用连接的 API 操作的策略](facebook-ads-configuring-iam-permissions.md)
+ [配置 Facebook Ads](facebook-ads-configuring.md)
+ [配置 Facebook Ads 连接](facebook-ads-configuring-connections.md)
+ [从 Facebook Ads 实体中读取](facebook-ads-reading-from-entities.md)
+ [Facebook Ads 连接选项](facebook-ads-connection-options.md)
+ [Facebook Ads 连接器的限制和说明](facebook-ads-connector-limitations.md)

# AWS Glue 对 Facebook Ads 的支持
<a name="facebook-ads-support"></a>

AWS Glue 对 Facebook Ads 的支持如下：

**是否支持作为来源？**  
是。您可以使用 AWS Glue ETL 作业查询 Facebook Ads 中的数据。

**是否支持作为目标？**  
否。

**支持的 Facebook Ads API 版本**  
支持以下 Facebook Ads API 版本：
+ v17.0
+ v18.0
+ v19.0
+ v20.0

# 包含创建和使用连接的 API 操作的策略
<a name="facebook-ads-configuring-iam-permissions"></a>

以下示例策略描述了创建和使用连接所需的 AWS IAM 权限。如果您要创建新角色，请创建包含以下内容的策略：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:ListConnectionTypes",
        "glue:DescribeConnectionType",
        "glue:RefreshOAuth2Tokens",
        "glue:ListEntities",
        "glue:DescribeEntity"
      ],
      "Resource": "*"
    }
  ]
}
```

------

如果您不想使用上述方法，也可以使用以下托管 IAM 策略：
+ [AWSGlueServiceRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole) – 授予对各种 AWS Glue 进程代表您运行所需的资源的访问权限。这些资源包括 AWS Glue、Amazon S3、IAM、CloudWatch Logs 和 Amazon EC2。如果您遵循此策略中指定的资源的命名约定，则 AWS Glue 进程具有所需的权限。此策略通常附加到在定义爬网程序、作业和开发终端节点时指定的角色。
+ [AWSGlueConsoleFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AWSGlueConsoleFullAccess)：当策略所附加到的身份使用 AWS 管理控制台时，授予对 AWS Glue 资源的完全访问权限。如果遵循此策略中指定的资源的命名约定，则用户具有完全控制台功能。此策略通常附加到 AWS Glue 控制台的用户。

# 配置 Facebook Ads
<a name="facebook-ads-configuring"></a>

您必须满足以下要求，才能使用 AWS Glue 从 Facebook Ads 传输数据：

## 最低要求
<a name="facebook-ads-configuring-min-requirements"></a>

以下是最低要求：
+ 可通过 Facebook 直接访问 Facebook 标准账户。
+ 需要进行用户身份验证才能生成访问令牌。
+ Facebook Ads SDK 连接器将实现*用户访问令牌 OAuth* 流程。
+ 我们使用 OAuth2.0 对 Facebook Ads 的 API 请求进行身份验证。这种基于 Web 的身份验证属于多重身份验证（MFA）架构，是 2FA 的超集。
+ 用户需要授予访问端点的权限。为了访问用户的数据，端点授权是通过[权限](https://developers.facebook.com/docs/permissions)和[功能](https://developers.facebook.com/docs/features-reference)来处理的。

## 获取 OAuth 2.0 凭证
<a name="facebook-ads-configuring-creating-facebook-ads-oauth2-credentials"></a>

要获取 API 凭证以便可对实例进行经过身份验证的调用，请参阅《Facebook Ads Developer Guide》中的 [REST API](https://developers.facebook-ads.com/rest-api/)。

# 配置 Facebook Ads 连接
<a name="facebook-ads-configuring-connections"></a>

Facebook Ads 支持 OAuth2 的 AUTHIZATION\$1CODE 授权类型。
+ 此授权类型被视为三足型 OAuth，因为它依赖于将用户重定向到第三方授权服务器来对用户进行身份验证。它用于通过 AWS Glue 控制台创建连接。
+ 用户仍然可以选择在 Facebook Ads 中创建自己的关联应用程序，并在通过 AWS Glue 控制台创建连接时提供自己的客户端 ID 和客户端密钥。在这种情况下，他们仍会重定向到 Facebook Ads，以便登录并授权 AWS Glue 访问其资源。
+ 此授权类型会生成访问令牌。即将到期的系统用户令牌自生成或刷新之日起 60 天内有效。为保持连续性，开发者应在 60 天内刷新访问令牌。否则访问令牌将失效，并且需要开发者获取新访问令牌才能重新获得 API 访问权限。请参阅 [Refresh Access Token](https://developers.facebook.com/docs/marketing-api/system-users/install-apps-and-generate-tokens/)。
+ 有关为授权码 OAuth 流程创建关联应用程序的信息，请参阅《Google for Developers guide》中的 [Using OAuth 2.0 to Access Google APIs](https://developers.google.com/identity/protocols/oauth2)。

配置 Facebook Ads 连接：

1. 在 AWS Glue Glue Studio 中，按照以下步骤在**数据连接**下创建连接：

   1. 选择**连接类型**时，请选择 Facebook Ads。

   1. 提供您想要连接到的 Facebook Ads 实例的 `INSTANCE_URL`。

   1. 选择 AWS Glue 可以代入并有权执行以下操作的 AWS IAM 角色：

------
#### [ JSON ]

****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "secretsmanager:DescribeSecret",
              "secretsmanager:GetSecretValue",
              "secretsmanager:PutSecretValue",
              "ec2:CreateNetworkInterface",
              "ec2:DescribeNetworkInterfaces",
              "ec2:DeleteNetworkInterface"
            ],
            "Resource": "*"
          }
        ]
      }
      ```

------

   1. 在 AWS Glue 中选择您要用于此连接的 `secretName`，然后放置令牌。

   1. 如果要使用网络，请选择网络选项。

1. 向与您的 AWS Glue 作业关联的 IAM 角色授予读取 `secretName` 的权限。

# 从 Facebook Ads 实体中读取
<a name="facebook-ads-reading-from-entities"></a>

**先决条件**

您要从中读取内容的 Facebook Ads 对象。您将需要对象名称。下表显示支持的实体。

**源支持的实体**：


| 实体 | 可以筛选 | 支持限制 | 支持排序依据 | 支持 Select \$1 | 支持分区 | 
| --- | --- | --- | --- | --- | --- | 
| 活动 | 支持 | 是 | 否 | 是 | 是 | 
| 广告集 | 支持 | 是 | 否 | 是 | 是 | 
| 广告 | 支持 | 是 | 否 | 是 | 是 | 
| 广告创意 | 否 | 是 | 否 | 是 | 否 | 
| 洞察 – 账户 | 否 | 是 | 否 | 是 | 否 | 
| 广告账户 | 支持 | 是 | 否 | 是 | 否 | 
| 洞察 – 广告 | 支持 | 是 | 否 | 是 | 是 | 
| 洞察 – 广告组 | 支持 | 是 | 否 | 是 | 是 | 
| 洞察 – 活动 | 支持 | 是 | 否 | 是 | 是 | 

**示例：**

```
FacebookAds_read = glueContext.create_dynamic_frame.from_options(
    connection_type="FacebookAds",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "API_VERSION": "v20.0"
    }
```

## Facebook Ads 实体和字段详细信息
<a name="facebook-ads-reading-entity-and-field-details"></a>

有关实体和字段详细信息的更多信息，请参阅：
+ [广告账户](https://developers.facebook.com/docs/marketing-api/reference/ad-account)
+ [活动](https://developers.facebook.com/docs/marketing-api/reference/ad-campaign-group)
+ [广告集](https://developers.facebook.com/docs/marketing-api/reference/ad-campaign)
+ [广告](https://developers.facebook.com/docs/marketing-api/reference/adgroup)
+ [广告创意](https://developers.facebook.com/docs/marketing-api/reference/ad-creative)
+ [洞察广告账户](https://developers.facebook.com/docs/marketing-api/reference/ad-account/insights)
+ [洞察广告](https://developers.facebook.com/docs/marketing-api/reference/adgroup/insights/)
+ [洞察广告组](https://developers.facebook.com/docs/marketing-api/reference/ad-campaign/insights)
+ [洞察活动](https://developers.facebook.com/docs/marketing-api/reference/ad-campaign-group/insights)

有关更多信息，请参阅 [Marketing API](https://developers.facebook.com/docs/marketing-api/reference/v21.0)。

**注意**  
在连接器的响应中，结构和列表数据类型将转换为字符串数据类型。

## 对查询进行分区
<a name="facebook-ads-reading-partitioning-queries"></a>

如果您想在 Spark 中利用并发，可以提供其他 Spark 选项：`PARTITION_FIELD`、`LOWER_BOUND`、`UPPER_BOUND` 和 `NUM_PARTITIONS`。使用这些参数，原始查询将被拆分为 `NUM_PARTITIONS` 个子查询，这些子查询可以由 Spark 任务同时执行。
+ `PARTITION_FIELD`：用于对查询进行分区的字段的名称。
+ `LOWER_BOUND`：所选分区字段的**包含**下限值。

  对于日期时间字段，我们接受 Spark SQL 查询中使用的 Spark 时间戳格式。

  有效值示例：

  ```
  "2022-01-01"
  ```
+ `UPPER_BOUND`：所选分区字段的**排除**上限值。
+ `NUM_PARTITIONS`：分区的数量。

示例：

```
FacebookADs_read = glueContext.create_dynamic_frame.from_options(
    connection_type="FacebookAds",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "API_VERSION": "v20.0",
        "PARTITION_FIELD": "created_time"
        "LOWER_BOUND": "2022-01-01"
        "UPPER_BOUND": "2024-01-02"
        "NUM_PARTITIONS": "10"
    }
```

# Facebook Ads 连接选项
<a name="facebook-ads-connection-options"></a>

以下是 Facebook Ads 的连接选项：
+ `ENTITY_NAME`（字符串）：（必填）用于读取。Facebook Ads 中对象的名称。
+ `API_VERSION`（字符串）：（必填）用于读取。您想要使用的 Facebook Ads Rest API 版本。例如：v1。
+ `SELECTED_FIELDS`（列表<字符串>）–默认：empty(SELECT \$1)。用于读取。您想要为对象选择的列。
+ `FILTER_PREDICATE`（字符串）– 默认：空。用于读取。应采用 Spark SQL 格式。
+ `QUERY`（字符串）– 默认：空。用于读取。完整的 Spark SQL 查询。
+ `PARTITION_FIELD`（字符串）：用于读取。用于分区查询的字段。
+ `LOWER_BOUND`（字符串）：用于读取。所选分区字段的包含下限值。
+ `UPPER_BOUND`（字符串）：用于读取。所选分区字段的排除上限值。
+ `NUM_PARTITIONS`（整数）– 默认：1。用于读取。要读取的分区数。
+ `TRANSFER_MODE`（字符串）：默认值：SYNC。用于异步读取。

# Facebook Ads 连接器的限制和说明
<a name="facebook-ads-connector-limitations"></a>

以下是 Facebook Ads 连接器的限制或说明：
+ 由于 Facebook Ads 支持动态元数据，因此所有字段均可查询。所有字段都支持筛选，如果数据可用，则会提取记录，否则 Facebook 会返回错误请求（400）响应并显示相应的错误消息。
+ 应用程序的调用次数是用户在滚动的一小时窗口内可以调用次数 200 乘以用户数。有关速率限制的详细信息，请参阅 [Rate Limits](https://developers.facebook.com/docs/graph-api/overview/rate-limiting/) 和 [Business Use Case Rate Limits](https://developers.facebook.com/docs/graph-api/overview/rate-limiting/#buc-rate-limits)。