2
0

(whatsapp) Improve WhatsApp preview management

Closes #800
This commit is contained in:
Baptiste Arnaud
2023-09-19 11:53:18 +02:00
parent 2ce63f5d06
commit f626c9867c
29 changed files with 830 additions and 681 deletions

View File

@@ -200,22 +200,54 @@ In order to be able to test your bot on WhatsApp from the Preview drawer, you ne
<details><summary><h4>Requirements</h4></summary>
<p>
1. Make sure you have [created a WhatsApp Business Account](https://developers.facebook.com/docs/whatsapp/cloud-api/get-started#set-up-developer-assets).
2. Go to your [System users page](https://business.facebook.com/settings/system-users) and create a new system user that has access to the related.
### Create a Facebook Business account
1. Head over to https://business.facebook.com and log in
2. Create a new business account on the left side bar
:::note
It is possible that Meta directly restricts your newly created Business account. In that case, make sure to verify your identity to proceed.
:::
### Create a Meta app
1. Head over to https://developers.facebook.com/apps
2. Click on Create App
3. Give it any name and select `Business` type
4. Select your newly created Business Account
5. On the app page, set up the `WhatsApp` product
### Get the System User token
1. Go to your [System users page](https://business.facebook.com/settings/system-users) and create a new system user that has access to the related.
- Token expiration: `Never`
- Available Permissions: `whatsapp_business_messaging`, `whatsapp_business_management`
3. The generated token will be used as `META_SYSTEM_USER_TOKEN` in your viewer configuration.
4. Click on `Add assets`. Under `Apps`, look for your app, select it and check `Manage app`
5. Go to your WhatsApp Dev Console
2. The generated token will be used as `META_SYSTEM_USER_TOKEN` in your viewer configuration.
3. Click on `Add assets`. Under `Apps`, look for your app, select it and check `Manage app`
### Get the phone number ID
1. Go to your WhatsApp Dev Console
<img src="/img/whatsapp/dev-console.png" alt="WhatsApp dev console" />
6. Add your phone number by clicking on the `Add phone number` button.
7. Select the newly created phone number in the `From` dropdown list. This will be used as `WHATSAPP_PREVIEW_FROM_PHONE_NUMBER_ID` in your viewer configuration.
8. Head over to `Quickstart > Configuration`. Edit the webhook URL to `$NEXT_PUBLIC_VIEWER_URL/api/v1/whatsapp/preview/webhook`. Set the Verify token to `$ENCRYPTION_SECRET` and click on `Verify and save`.
9. Add the `messages` webhook field.
2. Add your phone number by clicking on the `Add phone number` button.
3. Select the newly created phone number in the `From` dropdown list and you will see right below the associated `Phone number ID` This will be used as `WHATSAPP_PREVIEW_FROM_PHONE_NUMBER_ID` in your viewer configuration.
### Set up the webhook
1. Head over to `Quickstart > Configuration`. Edit the webhook URL to `$NEXTAUTH_URL/api/v1/whatsapp/preview/webhook`. Set the Verify token to `$ENCRYPTION_SECRET` and click on `Verify and save`.
2. Add the `messages` webhook field.
### Set up the message template
1. Head over to `Messaging > Message Templates` and click on `Create Template`
2. Select the `Utility` category
3. Give it a name that corresponds to your `WHATSAPP_PREVIEW_TEMPLATE_NAME` configuration.
4. Select the language that corresponds to your `WHATSAPP_PREVIEW_TEMPLATE_LANG` configuration.
5. You can format it as you'd like. The user will just have to send a message to start the preview.
</p></details>
@@ -223,6 +255,8 @@ In order to be able to test your bot on WhatsApp from the Preview drawer, you ne
| ------------------------------------- | ------- | ------------------------------------------------------- |
| META_SYSTEM_USER_TOKEN | | The system user token used to send WhatsApp messages |
| WHATSAPP_PREVIEW_FROM_PHONE_NUMBER_ID | | The phone number ID from which the message will be sent |
| WHATSAPP_PREVIEW_TEMPLATE_NAME | | The preview start template message name |
| WHATSAPP_PREVIEW_TEMPLATE_LANG | en | The preview start template message name |
## Others

View File

@@ -32433,63 +32433,6 @@
}
}
},
"delete": {
"operationId": "customDomains-deleteCustomDomain",
"summary": "Delete custom domain",
"tags": [
"Custom domains"
],
"security": [
{
"Authorization": []
}
],
"parameters": [
{
"name": "workspaceId",
"in": "query",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "name",
"in": "query",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Successful response",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"message": {
"type": "string",
"enum": [
"success"
]
}
},
"required": [
"message"
],
"additionalProperties": false
}
}
}
},
"default": {
"$ref": "#/components/responses/error"
}
}
},
"get": {
"operationId": "customDomains-listCustomDomains",
"summary": "List custom domains",
@@ -32554,6 +32497,205 @@
}
}
},
"/custom-domains/{name}": {
"delete": {
"operationId": "customDomains-deleteCustomDomain",
"summary": "Delete custom domain",
"tags": [
"Custom domains"
],
"security": [
{
"Authorization": []
}
],
"parameters": [
{
"name": "workspaceId",
"in": "query",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "name",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Successful response",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"message": {
"type": "string",
"enum": [
"success"
]
}
},
"required": [
"message"
],
"additionalProperties": false
}
}
}
},
"default": {
"$ref": "#/components/responses/error"
}
}
}
},
"/custom-domains/{name}/verify": {
"get": {
"operationId": "customDomains-verifyCustomDomain",
"summary": "Verify domain config",
"tags": [
"Custom domains"
],
"security": [
{
"Authorization": []
}
],
"parameters": [
{
"name": "workspaceId",
"in": "query",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "name",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Successful response",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"Valid Configuration",
"Invalid Configuration",
"Domain Not Found",
"Pending Verification",
"Unknown Error"
]
},
"domainJson": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"apexName": {
"type": "string"
},
"projectId": {
"type": "string"
},
"redirect": {
"type": "string",
"nullable": true
},
"redirectStatusCode": {
"type": "number",
"nullable": true
},
"gitBranch": {
"type": "string",
"nullable": true
},
"updatedAt": {
"type": "number",
"nullable": true
},
"createdAt": {
"type": "number",
"nullable": true
},
"verified": {
"type": "boolean"
},
"verification": {
"type": "array",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string"
},
"domain": {
"type": "string"
},
"value": {
"type": "string"
},
"reason": {
"type": "string"
}
},
"required": [
"type",
"domain",
"value",
"reason"
],
"additionalProperties": false
}
}
},
"required": [
"name",
"apexName",
"projectId",
"redirect",
"redirectStatusCode",
"gitBranch",
"updatedAt",
"createdAt",
"verified"
],
"additionalProperties": false
}
},
"required": [
"status",
"domainJson"
],
"additionalProperties": false
}
}
}
},
"default": {
"$ref": "#/components/responses/error"
}
}
}
},
"/whatsapp/phoneNumber": {
"get": {
"operationId": "whatsApp-getPhoneNumber",
@@ -32768,6 +32910,497 @@
}
}
},
"/typebots/{typebotId}/whatsapp/start-preview": {
"post": {
"operationId": "whatsApp-startWhatsAppPreview",
"summary": "Start preview",
"tags": [
"WhatsApp"
],
"security": [
{
"Authorization": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"to": {
"type": "string",
"minLength": 1
},
"startGroupId": {
"type": "string"
}
},
"required": [
"to"
],
"additionalProperties": false
}
}
}
},
"parameters": [
{
"name": "typebotId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Successful response",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
},
"required": [
"message"
],
"additionalProperties": false
}
}
}
},
"default": {
"$ref": "#/components/responses/error"
}
}
}
},
"/whatsapp/preview/webhook": {
"get": {
"operationId": "whatsApp-subscribePreviewWebhook",
"summary": "Subscribe webhook",
"tags": [
"WhatsApp"
],
"parameters": [
{
"name": "hub.challenge",
"in": "query",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "hub.verify_token",
"in": "query",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Successful response",
"content": {
"application/json": {
"schema": {
"type": "number"
}
}
}
},
"default": {
"$ref": "#/components/responses/error"
}
}
},
"post": {
"operationId": "whatsApp-receiveMessagePreview",
"summary": "Message webhook",
"tags": [
"WhatsApp"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"entry": {
"type": "array",
"items": {
"type": "object",
"properties": {
"changes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"value": {
"type": "object",
"properties": {
"contacts": {
"type": "array",
"items": {
"type": "object",
"properties": {
"profile": {
"type": "object",
"properties": {
"name": {
"type": "string"
}
},
"required": [
"name"
],
"additionalProperties": false
}
},
"required": [
"profile"
],
"additionalProperties": false
}
},
"messages": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"from": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"text"
]
},
"text": {
"type": "object",
"properties": {
"body": {
"type": "string"
}
},
"required": [
"body"
],
"additionalProperties": false
},
"timestamp": {
"type": "string"
}
},
"required": [
"from",
"type",
"text",
"timestamp"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"from": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"button"
]
},
"button": {
"type": "object",
"properties": {
"text": {
"type": "string"
},
"payload": {
"type": "string"
}
},
"required": [
"text",
"payload"
],
"additionalProperties": false
},
"timestamp": {
"type": "string"
}
},
"required": [
"from",
"type",
"button",
"timestamp"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"from": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"interactive"
]
},
"interactive": {
"type": "object",
"properties": {
"button_reply": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "string"
}
},
"required": [
"id",
"title"
],
"additionalProperties": false
}
},
"required": [
"button_reply"
],
"additionalProperties": false
},
"timestamp": {
"type": "string"
}
},
"required": [
"from",
"type",
"interactive",
"timestamp"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"from": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"image"
]
},
"image": {
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"timestamp": {
"type": "string"
}
},
"required": [
"from",
"type",
"image",
"timestamp"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"from": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"video"
]
},
"video": {
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"timestamp": {
"type": "string"
}
},
"required": [
"from",
"type",
"video",
"timestamp"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"from": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"audio"
]
},
"audio": {
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"timestamp": {
"type": "string"
}
},
"required": [
"from",
"type",
"audio",
"timestamp"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"from": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"document"
]
},
"document": {
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"timestamp": {
"type": "string"
}
},
"required": [
"from",
"type",
"document",
"timestamp"
],
"additionalProperties": false
}
]
}
}
},
"additionalProperties": false
}
},
"required": [
"value"
],
"additionalProperties": false
}
}
},
"required": [
"changes"
],
"additionalProperties": false
}
}
},
"required": [
"entry"
],
"additionalProperties": false
}
}
}
},
"parameters": [],
"responses": {
"200": {
"description": "Successful response",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
},
"required": [
"message"
],
"additionalProperties": false
}
}
}
},
"default": {
"$ref": "#/components/responses/error"
}
}
}
},
"/openai/models": {
"get": {
"operationId": "openAI-listModels",

View File

@@ -6496,435 +6496,6 @@
}
}
},
"/whatsapp/preview/webhook": {
"get": {
"operationId": "whatsAppRouter-subscribePreviewWebhook",
"summary": "WhatsApp",
"parameters": [
{
"name": "hub.challenge",
"in": "query",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "hub.verify_token",
"in": "query",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Successful response",
"content": {
"application/json": {
"schema": {
"type": "number"
}
}
}
},
"default": {
"$ref": "#/components/responses/error"
}
}
},
"post": {
"operationId": "whatsAppRouter-receiveMessagePreview",
"summary": "WhatsApp",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"entry": {
"type": "array",
"items": {
"type": "object",
"properties": {
"changes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"value": {
"type": "object",
"properties": {
"contacts": {
"type": "array",
"items": {
"type": "object",
"properties": {
"profile": {
"type": "object",
"properties": {
"name": {
"type": "string"
}
},
"required": [
"name"
],
"additionalProperties": false
}
},
"required": [
"profile"
],
"additionalProperties": false
}
},
"metadata": {
"type": "object",
"properties": {
"display_phone_number": {
"type": "string"
}
},
"required": [
"display_phone_number"
],
"additionalProperties": false
},
"messages": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"from": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"text"
]
},
"text": {
"type": "object",
"properties": {
"body": {
"type": "string"
}
},
"required": [
"body"
],
"additionalProperties": false
},
"timestamp": {
"type": "string"
}
},
"required": [
"from",
"type",
"text",
"timestamp"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"from": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"button"
]
},
"button": {
"type": "object",
"properties": {
"text": {
"type": "string"
},
"payload": {
"type": "string"
}
},
"required": [
"text",
"payload"
],
"additionalProperties": false
},
"timestamp": {
"type": "string"
}
},
"required": [
"from",
"type",
"button",
"timestamp"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"from": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"interactive"
]
},
"interactive": {
"type": "object",
"properties": {
"button_reply": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "string"
}
},
"required": [
"id",
"title"
],
"additionalProperties": false
}
},
"required": [
"button_reply"
],
"additionalProperties": false
},
"timestamp": {
"type": "string"
}
},
"required": [
"from",
"type",
"interactive",
"timestamp"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"from": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"image"
]
},
"image": {
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"timestamp": {
"type": "string"
}
},
"required": [
"from",
"type",
"image",
"timestamp"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"from": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"video"
]
},
"video": {
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"timestamp": {
"type": "string"
}
},
"required": [
"from",
"type",
"video",
"timestamp"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"from": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"audio"
]
},
"audio": {
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"timestamp": {
"type": "string"
}
},
"required": [
"from",
"type",
"audio",
"timestamp"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"from": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"document"
]
},
"document": {
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"timestamp": {
"type": "string"
}
},
"required": [
"from",
"type",
"document",
"timestamp"
],
"additionalProperties": false
}
]
}
}
},
"required": [
"metadata"
],
"additionalProperties": false
}
},
"required": [
"value"
],
"additionalProperties": false
}
}
},
"required": [
"changes"
],
"additionalProperties": false
}
}
},
"required": [
"entry"
],
"additionalProperties": false
}
}
}
},
"parameters": [],
"responses": {
"200": {
"description": "Successful response",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
},
"required": [
"message"
],
"additionalProperties": false
}
}
}
},
"default": {
"$ref": "#/components/responses/error"
}
}
}
},
"/workspaces/{workspaceId}/whatsapp/phoneNumbers/{phoneNumberId}/webhook": {
"get": {
"operationId": "whatsAppRouter-subscribeWebhook",
@@ -7031,18 +6602,6 @@
"additionalProperties": false
}
},
"metadata": {
"type": "object",
"properties": {
"display_phone_number": {
"type": "string"
}
},
"required": [
"display_phone_number"
],
"additionalProperties": false
},
"messages": {
"type": "array",
"items": {
@@ -7320,9 +6879,6 @@
}
}
},
"required": [
"metadata"
],
"additionalProperties": false
}
},
@@ -7391,74 +6947,6 @@
}
}
}
},
"/typebots/{typebotId}/whatsapp/start-preview": {
"post": {
"operationId": "whatsAppRouter-startWhatsAppPreview",
"summary": "Start WhatsApp Preview",
"security": [
{
"Authorization": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"to": {
"type": "string",
"minLength": 1
},
"startGroupId": {
"type": "string"
}
},
"required": [
"to"
],
"additionalProperties": false
}
}
}
},
"parameters": [
{
"name": "typebotId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Successful response",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
},
"required": [
"message"
],
"additionalProperties": false
}
}
}
},
"default": {
"$ref": "#/components/responses/error"
}
}
}
}
},
"components": {