# Facebook Lead Ads インポート統合 CLI

Facebook Lead Ads Connector を Facebook ページまたは広告アカウントに接続して、リードデータを Treasure Data にインポートできます。

## 前提条件

- [TD Toolbelt](https://toolbelt.treasuredata.com/) を含む Treasure Data の基本知識
- リード取得権限を持つ Facebook ページ/広告アカウント
- 認証された Treasure アカウントアクセス


## コマンドラインを使用して接続を作成する

### 'td' コマンドのインストール

最新の [TD Toolbelt](https://toolbelt.treasuredata.com/) をインストールします。

### シード設定ファイル (seed.yml) の作成

enable_guess_schema 有効:


```yaml
in:
  type: facebook_leads
  app_secret: app_secret
  access_token: long-lived-access_token
  id: 33056800448180
  time_created: '2020-01-28T15:46:25+0000'
  incremental: false
  enable_guess_schema: true
out:
  mode: append
```

enable_guess_schema 無効:


```yaml
in:
  type: facebook_leads
  app_secret: app_secret
  access_token: long-lived-access_token
  id: 33056800448180
  time_created: '2020-01-28T15:46:25+0000'
  incremental: false
  enable_guess_schema: false
  form_fields:
	- {name: ocupation, type: string}
	- {name: last_name, type: string}
	- {name: cell_Phone, type: string}
	- {name: email, type: string}
	- {name: name, type: string}
	- {name: opt_in_marketing, type: boolean}

out:
  mode: append
```

設定キーと説明は以下の通りです:

| **設定キー** | **タイプ** | **必須** | **説明** |
|  --- | --- | --- | --- |
| type | string | yes | コネクタータイプ "facebook_leads" |
| app_secret | string | no | Facebook App Secret |
| access_token | string | yes | Facebook の長期有効アクセストークン。手順は[こちら](/ja/int/facebook-ads-insights-import-integration#h2__2004725160)を参照 |
| ad_account_id | string | no | Facebook 広告アカウント ID |
| id | string | yes | リードデータは広告 ID またはフォーム ID でインポートできます。広告 ID とフォーム ID の取得方法の詳細については、[付録](/ja/int/facebook-lead-ads-import-integration-cli#h1__1835053169)を参照してください |
| time_created | string | no | この時刻から現在時刻までに送信されたリードデータをインポートします。このフィールドは ISO 8601 日時形式を受け付けます。例: 2020-01-01T00:00:00+0700 |
| incremental | boolean | no | 毎回新しいデータのみをインポートします。[インクリメンタルの仕組み](/int/facebook-lead-ads-import-integration)を参照 |
| form_fields | array | no | enable_guess_schema=false の場合に必須。Facebook リードフォームのフィールド名とそのデータタイプ |
| - name | string | yes | フォームフィールド名。[リードのフォームフィールドの見つけ方](https://tddocs.atlassian.net/wiki/spaces/CW/pages/826835011/Facebook+Lead+Ads+Import+Integration#How-to-get-the-Lead-Form%E2%80%99s-Field-Name)については付録を参照 |
| - type | string | yes | フィールドのデータタイプ |
| - format | string | no | タイムスタンプ形式。例: %Y-%m-%dT%H:%M:%S%z |
| - skip_invalid_records | boolean | no | 無効なリードデータをスキップして、他のデータのインポートを続行します。選択しない場合、無効なデータが検出されるとジョブが失敗します |


利用可能な `out` モードの詳細については、[付録](/ja/int/facebook-lead-ads-import-integration-cli#h1__1835053169)を参照してください。

### フィールドの推測 (load.yml の生成)

`connector:guess` を使用します。このコマンドは、ターゲットデータを自動的に読み取り、データ形式をインテリジェントに推測します。


```bash
$ td connector:guess seed.yml -o load.yml
```

`load.yml` ファイルを開くと、列名、データタイプ、形式を含む推測されたファイル形式定義が表示されます。


```yaml
---
in:
  type: facebook_leads
  app_secret: app_secret
  access_token: long-lived-access_token
  id: 514618966066498
  time_created: '2019-12-01T15:46:25+0000'
  incremental: false
  columns:
  - {name: id, type: long}
  - {name: created_time, type: timestamp, format: "%Y-%m-%dT%H:%M:%S%z"}
  - {name: ad_id, type: string}
  - {name: ad_name, type: string}
  - {name: adset_id, type: string}
  - {name: adset_name, type: string}
  - {name: campaign_id, type: string}
  - {name: campaign_name, type: string}
  - {name: form_id, type: long}
  - {name: platform, type: string}
  - {name: is_organic, type: boolean}
  - {name: name, type: string}
  - {name: surname, type: string}
  - {name: email, type: string}
out: {mode: append}
exec: {}
filters:
- from_value: {mode: upload_time}
  to_column: {name: time}
  type: add_time
```

その後、`preview` コマンドを使用してデータをプレビューできます。


```
td connector:preview load.yml
```

システムが列タイプを予期せず検出した場合は、`load.yml` を直接変更して再度プレビューしてください。

データコネクタは、"boolean"、"long"、"double"、"string"、"timestamp" タイプの解析をサポートしています。

### ロードジョブの実行

ロードジョブを送信します。データサイズに応じて数時間かかる場合があります。ユーザーは、データが保存されるデータベースとテーブルを指定する必要があります。


```bash
td connector:issue load.yml --database td_sample_db --table td_sample_table
```

上記のコマンドは、すでに *database(td_sample_db)* と *table(td_sample_table)* を作成していることを前提としています。データベースまたはテーブルが TD に存在しない場合、このコマンドは成功しないため、[手動で](https://docs.treasuredata.com/smart/project-product-documentation/data-management)データベースとテーブルを作成するか、次を使用してください:

- `-auto-create-table`


`td connector:issue` コマンドでこのオプションを使用すると、データベースとテーブルが自動的に作成されます:


```bash
td connector:issue load.yml --database td_sample_db --table td_sample_table --time-column created_at --auto-create-table
```

"--time-column" オプションで、時刻形式列を「パーティショニングキー」に割り当てることができます。

### スケジュール実行

定期的なリードインポートのために、定期的なデータコネクタの実行をスケジュールできます。高可用性を確保するためにスケジューラーを慎重に設定しています。この機能を使用することで、ローカルデータセンターで `cron` デーモンを実行する必要がなくなります。

#### スケジュールの作成

`td connector:create` コマンドを使用して新しいスケジュールを作成できます。スケジュール名、cron 形式のスケジュール、データが保存されるデータベースとテーブル、およびデータコネクタ設定ファイルが必要です。


```
$ td connector:create \
    daily_leads_import \
    "10 0 * * *" \
    td_sample_db \
    td_sample_table \
    load.yml
```

`cron` パラメータは、`@hourly`、`@daily`、`@monthly` の 3 つの特殊オプションも受け付けます。

### インクリメンタルスケジューリング

`incremental` オプションを true に設定することで、レコードを増分的にロードできます。


```
in:
 type: facebook_leads
 app_secret: app_secret
 access_token: long-lived-access_token
 id: 33056800448180
 time_created: '2020-01-28T15:46:25+0000'
 incremental: true
out:
 mode: append
```

[スケジュール実行](/int/facebook-lead-ads-import-integration)を使用している場合、コネクタは最後のインポート時刻 `time_created` 値を自動的に保存し、内部で保持します。その後、次のスケジュール実行時に使用されます。


```
in:
  type: facebook_leads
  ...
out:
  ...

Config Diff
---
in:
  time_created: '2020-02-02T15:46:25Z'
```

### スケジュールの一覧表示

`td connector:list` でスケジュールされたエントリーのリストを確認できます。


```
td connector:list
```

## Facebook Lead Ads からのインポートに関する FAQ

**このコネクタにはどの Facebook アプリのスコープまたは権限が必要ですか？**

- 以下の権限が必要です:
  - email
  - public_profile
  - leads_retrieval
  - pages_manage_ads、pages_manage_metadata、pages_read_engagement、pages_read_user_content (フォーム ID でインポートする場合)
  - ads_management (広告 ID でインポートする場合)


### インクリメンタルロードの仕組み

`incremental: true` が設定されている場合、このコネクタは **time_created** が設定されている場合は **time_created** 以降に作成されたすべてのレコードをロードし、**time_created** が設定されていない場合は現在時刻まで利用可能なすべてのデータをインポートします。次のジョブ実行では、最後のジョブ実行以降に作成されたレコードのみがインポートされます。このモードは、前回のスケジュール実行以降に作成されたリードのみを取得したい場合に便利です。

たとえば、最初のジョブ実行で次のように設定を指定したとします:


```
in:
 ...
 time_created: '2020-01-28T15:46:25+0000'
 incremental: true
```

バルクデータロードが正常に完了すると、**time_created**: パラメータが出力されます。例: '2020-02-02T15:46:25+0000' が config-diff として出力され、次回の実行で使用されます。
次の実行時に、**time_created**: も設定されている場合、このプラグインは config-diff からの **time_created** を使用し、元の値を無視します。新しいジョブ設定は次のように実行されます:


```
in:
 ...
 time_created: '2020-02-02T15:46:25+0000'
 incremental: true
```

このようにして、ジョブが実行されるたびに、新しいレコードのみがインポートされます。

広告アカウントレベルのリードインポート (ad_account_id を設定することによる) の場合、リード広告 ID のリストとその最新の **time_created** が、次のジョブ実行のために config-diff として保存されます。例:


```
in:
  ...
  incremental: true
  list_time_created: {
	'23845900031': '2020-11-01T02:46:45Z',
	'23845899651': '2020-11-02T21:25:33Z',
	'23846121121': '2020-11-30T05:21:03Z',
	'23845899651': '2020-11-01T12:39:53Z',
	'23845900031': '2020-11-02T04:13:19Z',
	'23845899651': '2020-11-04T01:39:58Z'
}
```