@oficialapi/sdk 9.0.2 → 9.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +386 -109
- package/dist/index.d.mts +129 -32
- package/dist/index.d.ts +129 -32
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -20,9 +20,9 @@ import { OficialAPISDK } from '@oficialapi/sdk';
|
|
|
20
20
|
const sdk = new OficialAPISDK({
|
|
21
21
|
clientId: 'seu-client-id',
|
|
22
22
|
clientSecret: 'seu-client-secret',
|
|
23
|
-
timeout: 30000,
|
|
24
|
-
maxRetries: 3,
|
|
25
|
-
retryDelay: 1000,
|
|
23
|
+
timeout: 30000,
|
|
24
|
+
maxRetries: 3,
|
|
25
|
+
retryDelay: 1000,
|
|
26
26
|
});
|
|
27
27
|
```
|
|
28
28
|
|
|
@@ -53,7 +53,7 @@ console.log(result.data.messageId);
|
|
|
53
53
|
#### Enviar Mídia
|
|
54
54
|
|
|
55
55
|
```typescript
|
|
56
|
-
|
|
56
|
+
|
|
57
57
|
await sdk.whatsapp.sendMedia({
|
|
58
58
|
token: 'sk_live_...',
|
|
59
59
|
sender: '5511999999999',
|
|
@@ -62,14 +62,14 @@ await sdk.whatsapp.sendMedia({
|
|
|
62
62
|
caption: 'Veja esta imagem!'
|
|
63
63
|
}, accessToken);
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
|
|
66
66
|
await sdk.whatsapp.sendMedia({
|
|
67
67
|
token: 'sk_live_...',
|
|
68
68
|
sender: '5511999999999',
|
|
69
69
|
fileUrl: 'https://example.com/documento.pdf',
|
|
70
70
|
type: 'document',
|
|
71
71
|
caption: 'Confira este documento',
|
|
72
|
-
fileName: 'meu_documento.pdf'
|
|
72
|
+
fileName: 'meu_documento.pdf'
|
|
73
73
|
}, accessToken);
|
|
74
74
|
```
|
|
75
75
|
|
|
@@ -620,23 +620,23 @@ await sdk.whatsapp.sendOrderStatus({
|
|
|
620
620
|
token: 'sk_live_...',
|
|
621
621
|
sender: '5511999999999',
|
|
622
622
|
bodyText: 'Seu pedido foi enviado!',
|
|
623
|
-
footerText: 'Obrigado!',
|
|
624
|
-
reference_id: 'pedido_12345_1704067200',
|
|
625
|
-
order_status: 'shipped',
|
|
626
|
-
status_description: 'Sua encomenda foi despachada pelos Correios',
|
|
627
|
-
payment_status: 'captured',
|
|
628
|
-
payment_timestamp: 1722445231
|
|
623
|
+
footerText: 'Obrigado!',
|
|
624
|
+
reference_id: 'pedido_12345_1704067200',
|
|
625
|
+
order_status: 'shipped',
|
|
626
|
+
status_description: 'Sua encomenda foi despachada pelos Correios',
|
|
627
|
+
payment_status: 'captured',
|
|
628
|
+
payment_timestamp: 1722445231
|
|
629
629
|
}, accessToken);
|
|
630
630
|
```
|
|
631
631
|
|
|
632
632
|
#### Enviar Sticker
|
|
633
633
|
|
|
634
634
|
```typescript
|
|
635
|
-
|
|
635
|
+
|
|
636
636
|
await sdk.whatsapp.sendSticker({
|
|
637
637
|
token: 'sk_live_...',
|
|
638
638
|
sender: '5511999999999',
|
|
639
|
-
mediaId: '798882015472548'
|
|
639
|
+
mediaId: '798882015472548'
|
|
640
640
|
}, accessToken);
|
|
641
641
|
```
|
|
642
642
|
|
|
@@ -647,8 +647,8 @@ await sdk.whatsapp.sendLocationRequest({
|
|
|
647
647
|
token: 'sk_live_...',
|
|
648
648
|
sender: '5511999999999',
|
|
649
649
|
bodyText: 'Por favor, compartilhe sua localização para entregarmos seu pedido.',
|
|
650
|
-
headerText: 'Confirme sua entrega',
|
|
651
|
-
footerText: 'Sua privacidade é importante'
|
|
650
|
+
headerText: 'Confirme sua entrega',
|
|
651
|
+
footerText: 'Sua privacidade é importante'
|
|
652
652
|
}, accessToken);
|
|
653
653
|
```
|
|
654
654
|
|
|
@@ -659,14 +659,14 @@ await sdk.whatsapp.sendCtaUrl({
|
|
|
659
659
|
token: 'sk_live_...',
|
|
660
660
|
sender: '5511999999999',
|
|
661
661
|
bodyText: 'Confira nosso site!',
|
|
662
|
-
buttonText: 'Acessar',
|
|
662
|
+
buttonText: 'Acessar',
|
|
663
663
|
url: 'https://example.com',
|
|
664
|
-
header: {
|
|
665
|
-
type: 'image',
|
|
666
|
-
link: 'https://example.com/banner.jpg'
|
|
667
|
-
|
|
664
|
+
header: {
|
|
665
|
+
type: 'image',
|
|
666
|
+
link: 'https://example.com/banner.jpg'
|
|
667
|
+
|
|
668
668
|
},
|
|
669
|
-
footerText: 'Ofertas válidas até 30/11'
|
|
669
|
+
footerText: 'Ofertas válidas até 30/11'
|
|
670
670
|
}, accessToken);
|
|
671
671
|
```
|
|
672
672
|
|
|
@@ -676,14 +676,14 @@ await sdk.whatsapp.sendCtaUrl({
|
|
|
676
676
|
await sdk.whatsapp.sendMediaCarousel({
|
|
677
677
|
token: 'sk_live_...',
|
|
678
678
|
sender: '5511999999999',
|
|
679
|
-
bodyText: 'Confira nossas ofertas da semana!',
|
|
680
|
-
cards: [
|
|
679
|
+
bodyText: 'Confira nossas ofertas da semana!',
|
|
680
|
+
cards: [
|
|
681
681
|
{
|
|
682
682
|
cardIndex: 0,
|
|
683
|
-
headerType: 'image',
|
|
683
|
+
headerType: 'image',
|
|
684
684
|
headerLink: 'https://example.com/image1.jpg',
|
|
685
|
-
bodyText: 'Oferta especial!',
|
|
686
|
-
buttonText: 'Comprar agora',
|
|
685
|
+
bodyText: 'Oferta especial!',
|
|
686
|
+
buttonText: 'Comprar agora',
|
|
687
687
|
url: 'https://example.com/product1'
|
|
688
688
|
},
|
|
689
689
|
{
|
|
@@ -706,11 +706,11 @@ const media = await sdk.whatsapp.downloadMedia({
|
|
|
706
706
|
url: 'https://lookaside.fbsbx.com/whatsapp_business/attachment/?mid=...'
|
|
707
707
|
}, accessToken);
|
|
708
708
|
|
|
709
|
-
|
|
710
|
-
console.log(media.data.buffer);
|
|
711
|
-
console.log(media.data.mimeType);
|
|
712
|
-
console.log(media.data.filename);
|
|
713
|
-
console.log(media.data.size);
|
|
709
|
+
|
|
710
|
+
console.log(media.data.buffer);
|
|
711
|
+
console.log(media.data.mimeType);
|
|
712
|
+
console.log(media.data.filename);
|
|
713
|
+
console.log(media.data.size);
|
|
714
714
|
```
|
|
715
715
|
|
|
716
716
|
#### Responder Mensagem
|
|
@@ -718,10 +718,10 @@ console.log(media.data.size); // Tamanho em bytes
|
|
|
718
718
|
```typescript
|
|
719
719
|
await sdk.whatsapp.replyMessage({
|
|
720
720
|
token: 'sk_live_...',
|
|
721
|
-
sender: '5511999999999',
|
|
721
|
+
sender: '5511999999999',
|
|
722
722
|
messageText: 'Esta é uma resposta!',
|
|
723
|
-
replyMessageId: 'wamid.xxx',
|
|
724
|
-
preview_url: false
|
|
723
|
+
replyMessageId: 'wamid.xxx',
|
|
724
|
+
preview_url: false
|
|
725
725
|
}, accessToken);
|
|
726
726
|
```
|
|
727
727
|
|
|
@@ -730,22 +730,22 @@ await sdk.whatsapp.replyMessage({
|
|
|
730
730
|
```typescript
|
|
731
731
|
await sdk.whatsapp.reactMessage({
|
|
732
732
|
token: 'sk_live_...',
|
|
733
|
-
sender: '5511999999999',
|
|
734
|
-
emoji: '👍',
|
|
735
|
-
message_id: 'wamid.xxx'
|
|
733
|
+
sender: '5511999999999',
|
|
734
|
+
emoji: '👍',
|
|
735
|
+
message_id: 'wamid.xxx'
|
|
736
736
|
}, accessToken);
|
|
737
737
|
```
|
|
738
738
|
|
|
739
739
|
#### Gerenciar Templates
|
|
740
740
|
|
|
741
741
|
```typescript
|
|
742
|
-
|
|
742
|
+
|
|
743
743
|
const templates = await sdk.whatsapp.listTemplates('sk_live_...', accessToken);
|
|
744
744
|
|
|
745
|
-
|
|
745
|
+
|
|
746
746
|
const template = await sdk.whatsapp.getTemplate('sk_live_...', 'template_id', accessToken);
|
|
747
747
|
|
|
748
|
-
|
|
748
|
+
|
|
749
749
|
await sdk.whatsapp.createTemplate({
|
|
750
750
|
token: 'sk_live_...',
|
|
751
751
|
name: 'welcome_message',
|
|
@@ -760,8 +760,7 @@ await sdk.whatsapp.createTemplate({
|
|
|
760
760
|
}, accessToken);
|
|
761
761
|
|
|
762
762
|
#### Upload de Mídia
|
|
763
|
-
|
|
764
|
-
O método `uploadMedia` é usado para fazer upload de arquivos (imagens, vídeos, áudios, documentos) que serão usados em templates ou enviados via `sendAudio`, `sendVideo`, `sendDocument` ou `sendSticker`.
|
|
763
|
+
|
|
765
764
|
|
|
766
765
|
**Exemplo 1: Upload de imagem sem filename (opcional)**
|
|
767
766
|
|
|
@@ -774,7 +773,7 @@ const uploadResult = await sdk.whatsapp.uploadMedia({
|
|
|
774
773
|
token: 'sk_live_...',
|
|
775
774
|
file: fileBuffer,
|
|
776
775
|
mediaType: 'image'
|
|
777
|
-
|
|
776
|
+
|
|
778
777
|
}, accessToken);
|
|
779
778
|
|
|
780
779
|
const mediaId = uploadResult.data.handle; // "4::aW1hZ2UtMTIzNDU2Nzg5MGCE..."
|
|
@@ -810,7 +809,7 @@ const uploadResult = await sdk.whatsapp.uploadMedia({
|
|
|
810
809
|
filename: 'meu_video.mp4'
|
|
811
810
|
}, accessToken);
|
|
812
811
|
|
|
813
|
-
|
|
812
|
+
|
|
814
813
|
await sdk.whatsapp.sendVideo({
|
|
815
814
|
token: 'sk_live_...',
|
|
816
815
|
sender: '5511999999999',
|
|
@@ -846,11 +845,11 @@ const stickerBuffer = fs.readFileSync('./sticker.webp');
|
|
|
846
845
|
const uploadResult = await sdk.whatsapp.uploadMedia({
|
|
847
846
|
token: 'sk_live_...',
|
|
848
847
|
file: stickerBuffer,
|
|
849
|
-
mediaType: 'image',
|
|
848
|
+
mediaType: 'image',
|
|
850
849
|
filename: 'sticker.webp'
|
|
851
850
|
}, accessToken);
|
|
852
851
|
|
|
853
|
-
|
|
852
|
+
|
|
854
853
|
await sdk.whatsapp.sendSticker({
|
|
855
854
|
token: 'sk_live_...',
|
|
856
855
|
sender: '5511999999999',
|
|
@@ -861,11 +860,11 @@ await sdk.whatsapp.sendSticker({
|
|
|
861
860
|
**Exemplo 7: Upload em ambiente Browser (Frontend)**
|
|
862
861
|
|
|
863
862
|
```typescript
|
|
864
|
-
|
|
863
|
+
|
|
865
864
|
const fileInput = document.querySelector('input[type="file"]');
|
|
866
865
|
const file = fileInput.files[0];
|
|
867
866
|
|
|
868
|
-
|
|
867
|
+
|
|
869
868
|
const getMediaType = (file: File): 'image' | 'video' | 'document' => {
|
|
870
869
|
if (file.type.startsWith('image/')) return 'image';
|
|
871
870
|
if (file.type.startsWith('video/')) return 'video';
|
|
@@ -876,7 +875,7 @@ const uploadResult = await sdk.whatsapp.uploadMedia({
|
|
|
876
875
|
token: 'sk_live_...',
|
|
877
876
|
file: file,
|
|
878
877
|
mediaType: getMediaType(file),
|
|
879
|
-
filename: file.name
|
|
878
|
+
filename: file.name
|
|
880
879
|
}, accessToken);
|
|
881
880
|
|
|
882
881
|
const mediaId = uploadResult.data.handle;
|
|
@@ -885,7 +884,7 @@ const mediaId = uploadResult.data.handle;
|
|
|
885
884
|
**Exemplo 8: Upload usando Blob (Browser)**
|
|
886
885
|
|
|
887
886
|
```typescript
|
|
888
|
-
|
|
887
|
+
|
|
889
888
|
const blob = new Blob(['conteúdo do arquivo'], { type: 'text/plain' });
|
|
890
889
|
|
|
891
890
|
const uploadResult = await sdk.whatsapp.uploadMedia({
|
|
@@ -909,10 +908,10 @@ const uploadResult = await sdk.whatsapp.uploadMedia({
|
|
|
909
908
|
token: 'sk_live_...',
|
|
910
909
|
file: imageBuffer,
|
|
911
910
|
mediaType: 'image'
|
|
912
|
-
|
|
911
|
+
|
|
913
912
|
}, accessToken);
|
|
914
913
|
|
|
915
|
-
|
|
914
|
+
|
|
916
915
|
await sdk.whatsapp.createTemplate({
|
|
917
916
|
token: 'sk_live_...',
|
|
918
917
|
name: 'product_launch',
|
|
@@ -923,7 +922,7 @@ await sdk.whatsapp.createTemplate({
|
|
|
923
922
|
type: 'HEADER',
|
|
924
923
|
format: 'IMAGE',
|
|
925
924
|
example: {
|
|
926
|
-
header_handle: [uploadResult.data.handle]
|
|
925
|
+
header_handle: [uploadResult.data.handle]
|
|
927
926
|
}
|
|
928
927
|
},
|
|
929
928
|
{
|
|
@@ -1447,22 +1446,25 @@ const media = await sdk.telegram.downloadMedia({
|
|
|
1447
1446
|
fileId: 'AgACAgEAAxkBAAItNmlmklyYNCEtvaFphVfSSO7CrEOjAALUC2sbh9owR9hT7MhQnTGfAQADAgADcwADOAQ'
|
|
1448
1447
|
}, accessToken);
|
|
1449
1448
|
|
|
1450
|
-
|
|
1451
|
-
console.log(media.data.buffer);
|
|
1452
|
-
console.log(media.data.mimeType);
|
|
1453
|
-
console.log(media.data.filename);
|
|
1454
|
-
console.log(media.data.size);
|
|
1449
|
+
|
|
1450
|
+
console.log(media.data.buffer);
|
|
1451
|
+
console.log(media.data.mimeType);
|
|
1452
|
+
console.log(media.data.filename);
|
|
1453
|
+
console.log(media.data.size);
|
|
1455
1454
|
```
|
|
1456
1455
|
|
|
1457
1456
|
### WebChat
|
|
1457
|
+
|
|
1458
1458
|
|
|
1459
1459
|
#### Enviar Mensagem de Texto
|
|
1460
1460
|
|
|
1461
1461
|
```typescript
|
|
1462
1462
|
await sdk.webchat.sendText({
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
messageText: 'Olá!'
|
|
1463
|
+
channelToken: 'sk_live_...',
|
|
1464
|
+
chatId: 'chat_123456789',
|
|
1465
|
+
messageText: 'Olá!',
|
|
1466
|
+
typing: true, // Opcional: mostrar indicador de digitação
|
|
1467
|
+
typingTime: 2000 // Opcional: tempo de digitação em ms
|
|
1466
1468
|
}, accessToken);
|
|
1467
1469
|
```
|
|
1468
1470
|
|
|
@@ -1470,18 +1472,22 @@ await sdk.webchat.sendText({
|
|
|
1470
1472
|
|
|
1471
1473
|
```typescript
|
|
1472
1474
|
await sdk.webchat.sendCard({
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
+
channelToken: 'sk_live_...',
|
|
1476
|
+
chatId: 'chat_123456789',
|
|
1475
1477
|
title: 'Produto',
|
|
1476
1478
|
description: 'Descrição do produto',
|
|
1477
1479
|
imageUrl: 'https://example.com/image.jpg',
|
|
1478
1480
|
buttons: [
|
|
1479
1481
|
{
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
+
id: 'btn_1', // Opcional: ID único do botão
|
|
1483
|
+
text: 'Ver Mais',
|
|
1484
|
+
type: 'url', // 'text' | 'url' | 'phone' | 'postback'
|
|
1485
|
+
url: 'https://example.com/product',
|
|
1482
1486
|
value: 'https://example.com/product'
|
|
1483
1487
|
}
|
|
1484
|
-
]
|
|
1488
|
+
],
|
|
1489
|
+
typing: true,
|
|
1490
|
+
typingTime: 3000
|
|
1485
1491
|
}, accessToken);
|
|
1486
1492
|
```
|
|
1487
1493
|
|
|
@@ -1489,11 +1495,13 @@ await sdk.webchat.sendCard({
|
|
|
1489
1495
|
|
|
1490
1496
|
```typescript
|
|
1491
1497
|
await sdk.webchat.sendMedia({
|
|
1492
|
-
|
|
1493
|
-
|
|
1498
|
+
channelToken: 'sk_live_...',
|
|
1499
|
+
chatId: 'chat_123456789',
|
|
1494
1500
|
fileUrl: 'https://example.com/image.jpg',
|
|
1495
|
-
type: 'image',
|
|
1496
|
-
caption: 'Veja esta imagem!'
|
|
1501
|
+
type: 'image', // 'image' | 'video' | 'audio' | 'file'
|
|
1502
|
+
caption: 'Veja esta imagem!',
|
|
1503
|
+
typing: true,
|
|
1504
|
+
typingTime: 2500
|
|
1497
1505
|
}, accessToken);
|
|
1498
1506
|
```
|
|
1499
1507
|
|
|
@@ -1501,26 +1509,39 @@ await sdk.webchat.sendMedia({
|
|
|
1501
1509
|
|
|
1502
1510
|
```typescript
|
|
1503
1511
|
await sdk.webchat.sendCarousel({
|
|
1504
|
-
|
|
1505
|
-
|
|
1512
|
+
channelToken: 'sk_live_...',
|
|
1513
|
+
chatId: 'chat_123456789',
|
|
1506
1514
|
cards: [
|
|
1507
1515
|
{
|
|
1508
1516
|
title: 'Produto 1',
|
|
1509
|
-
|
|
1517
|
+
subtitle: 'Descrição do produto 1',
|
|
1510
1518
|
imageUrl: 'https://example.com/product1.jpg',
|
|
1511
1519
|
buttons: [
|
|
1512
|
-
{
|
|
1520
|
+
{
|
|
1521
|
+
id: 'btn_1',
|
|
1522
|
+
text: 'Ver Mais',
|
|
1523
|
+
type: 'url',
|
|
1524
|
+
url: 'https://example.com/product1',
|
|
1525
|
+
value: 'https://example.com/product1'
|
|
1526
|
+
}
|
|
1513
1527
|
]
|
|
1514
1528
|
},
|
|
1515
1529
|
{
|
|
1516
1530
|
title: 'Produto 2',
|
|
1517
|
-
|
|
1531
|
+
subtitle: 'Descrição do produto 2',
|
|
1518
1532
|
imageUrl: 'https://example.com/product2.jpg',
|
|
1519
1533
|
buttons: [
|
|
1520
|
-
{
|
|
1534
|
+
{
|
|
1535
|
+
id: 'btn_2',
|
|
1536
|
+
text: 'Comprar',
|
|
1537
|
+
type: 'postback',
|
|
1538
|
+
value: 'BUY_PRODUCT_2'
|
|
1539
|
+
}
|
|
1521
1540
|
]
|
|
1522
1541
|
}
|
|
1523
|
-
]
|
|
1542
|
+
],
|
|
1543
|
+
typing: true,
|
|
1544
|
+
typingTime: 4000
|
|
1524
1545
|
}, accessToken);
|
|
1525
1546
|
```
|
|
1526
1547
|
|
|
@@ -1528,24 +1549,40 @@ await sdk.webchat.sendCarousel({
|
|
|
1528
1549
|
|
|
1529
1550
|
```typescript
|
|
1530
1551
|
await sdk.webchat.sendForm({
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1552
|
+
channelToken: 'sk_live_...',
|
|
1553
|
+
chatId: 'chat_123456789',
|
|
1554
|
+
id: 'form_contact', // Opcional: ID único do formulário
|
|
1555
|
+
title: 'Formulário de Contato', // Opcional
|
|
1534
1556
|
fields: [
|
|
1535
1557
|
{
|
|
1536
|
-
|
|
1537
|
-
name: 'name',
|
|
1558
|
+
id: 'name', // Opcional: se não fornecido, usa 'name'
|
|
1559
|
+
name: 'name', // Opcional: mantido para compatibilidade
|
|
1560
|
+
type: 'text', // 'text' | 'email' | 'number' | 'tel' | 'date' | 'select'
|
|
1538
1561
|
label: 'Nome',
|
|
1562
|
+
placeholder: 'Digite seu nome',
|
|
1539
1563
|
required: true
|
|
1540
1564
|
},
|
|
1541
1565
|
{
|
|
1566
|
+
id: 'email',
|
|
1542
1567
|
type: 'email',
|
|
1543
|
-
name: 'email',
|
|
1544
1568
|
label: 'E-mail',
|
|
1569
|
+
placeholder: 'Digite seu e-mail',
|
|
1545
1570
|
required: true
|
|
1571
|
+
},
|
|
1572
|
+
{
|
|
1573
|
+
id: 'subject',
|
|
1574
|
+
type: 'select',
|
|
1575
|
+
label: 'Assunto',
|
|
1576
|
+
required: true,
|
|
1577
|
+
options: [
|
|
1578
|
+
{ value: 'support', label: 'Suporte' },
|
|
1579
|
+
{ value: 'sales', label: 'Vendas' }
|
|
1580
|
+
]
|
|
1546
1581
|
}
|
|
1547
1582
|
],
|
|
1548
|
-
submitButtonText: 'Enviar'
|
|
1583
|
+
submitButtonText: 'Enviar', // Opcional
|
|
1584
|
+
typing: true,
|
|
1585
|
+
typingTime: 3000
|
|
1549
1586
|
}, accessToken);
|
|
1550
1587
|
```
|
|
1551
1588
|
|
|
@@ -1553,14 +1590,23 @@ await sdk.webchat.sendForm({
|
|
|
1553
1590
|
|
|
1554
1591
|
```typescript
|
|
1555
1592
|
await sdk.webchat.sendQuickReplies({
|
|
1556
|
-
|
|
1557
|
-
|
|
1593
|
+
channelToken: 'sk_live_...',
|
|
1594
|
+
chatId: 'chat_123456789',
|
|
1558
1595
|
messageText: 'Como podemos ajudar?',
|
|
1559
1596
|
quickReplies: [
|
|
1560
|
-
{
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1597
|
+
{
|
|
1598
|
+
id: 'qr_1', // Opcional: ID único
|
|
1599
|
+
text: 'Suporte',
|
|
1600
|
+
value: 'SUPPORT' // Opcional: valor para identificar a resposta
|
|
1601
|
+
},
|
|
1602
|
+
{
|
|
1603
|
+
id: 'qr_2',
|
|
1604
|
+
text: 'Vendas',
|
|
1605
|
+
value: 'SALES'
|
|
1606
|
+
}
|
|
1607
|
+
],
|
|
1608
|
+
typing: true,
|
|
1609
|
+
typingTime: 2000
|
|
1564
1610
|
}, accessToken);
|
|
1565
1611
|
```
|
|
1566
1612
|
|
|
@@ -1568,13 +1614,26 @@ await sdk.webchat.sendQuickReplies({
|
|
|
1568
1614
|
|
|
1569
1615
|
```typescript
|
|
1570
1616
|
await sdk.webchat.sendButtons({
|
|
1571
|
-
|
|
1572
|
-
|
|
1617
|
+
channelToken: 'sk_live_...',
|
|
1618
|
+
chatId: 'chat_123456789',
|
|
1573
1619
|
messageText: 'Escolha uma opção:',
|
|
1574
1620
|
buttons: [
|
|
1575
|
-
{
|
|
1576
|
-
|
|
1577
|
-
|
|
1621
|
+
{
|
|
1622
|
+
id: 'btn_1',
|
|
1623
|
+
text: 'Visitar Site',
|
|
1624
|
+
type: 'url',
|
|
1625
|
+
url: 'https://example.com',
|
|
1626
|
+
value: 'https://example.com'
|
|
1627
|
+
},
|
|
1628
|
+
{
|
|
1629
|
+
id: 'btn_2',
|
|
1630
|
+
text: 'Falar com Atendente',
|
|
1631
|
+
type: 'postback',
|
|
1632
|
+
value: 'HUMAN_AGENT'
|
|
1633
|
+
}
|
|
1634
|
+
],
|
|
1635
|
+
typing: true,
|
|
1636
|
+
typingTime: 2500
|
|
1578
1637
|
}, accessToken);
|
|
1579
1638
|
```
|
|
1580
1639
|
|
|
@@ -1734,11 +1793,11 @@ const media = await sdk.facebook.downloadMedia({
|
|
|
1734
1793
|
url: 'https://lookaside.fbsbx.com/ig_messaging_cdn/...'
|
|
1735
1794
|
}, accessToken);
|
|
1736
1795
|
|
|
1737
|
-
|
|
1738
|
-
console.log(media.data.buffer);
|
|
1739
|
-
console.log(media.data.mimeType);
|
|
1740
|
-
console.log(media.data.filename);
|
|
1741
|
-
console.log(media.data.size);
|
|
1796
|
+
|
|
1797
|
+
console.log(media.data.buffer);
|
|
1798
|
+
console.log(media.data.mimeType);
|
|
1799
|
+
console.log(media.data.filename);
|
|
1800
|
+
console.log(media.data.size);
|
|
1742
1801
|
```
|
|
1743
1802
|
|
|
1744
1803
|
### Instagram
|
|
@@ -1879,21 +1938,21 @@ await sdk.instagram.sendButtonTemplate({
|
|
|
1879
1938
|
#### Enviar Ação do Remetente (Typing, Seen)
|
|
1880
1939
|
|
|
1881
1940
|
```typescript
|
|
1882
|
-
|
|
1941
|
+
|
|
1883
1942
|
await sdk.instagram.sendSenderAction({
|
|
1884
1943
|
token: 'sk_live_...',
|
|
1885
1944
|
recipientId: 'user_id',
|
|
1886
1945
|
action: 'typing_on'
|
|
1887
1946
|
}, accessToken);
|
|
1888
1947
|
|
|
1889
|
-
|
|
1948
|
+
|
|
1890
1949
|
await sdk.instagram.sendSenderAction({
|
|
1891
1950
|
token: 'sk_live_...',
|
|
1892
1951
|
recipientId: 'user_id',
|
|
1893
1952
|
action: 'typing_off'
|
|
1894
1953
|
}, accessToken);
|
|
1895
1954
|
|
|
1896
|
-
|
|
1955
|
+
|
|
1897
1956
|
await sdk.instagram.sendSenderAction({
|
|
1898
1957
|
token: 'sk_live_...',
|
|
1899
1958
|
recipientId: 'user_id',
|
|
@@ -1939,11 +1998,229 @@ const media = await sdk.instagram.downloadMedia({
|
|
|
1939
1998
|
url: 'https://lookaside.fbsbx.com/ig_messaging_cdn/...'
|
|
1940
1999
|
}, accessToken);
|
|
1941
2000
|
|
|
1942
|
-
|
|
1943
|
-
console.log(media.data.buffer);
|
|
1944
|
-
console.log(media.data.mimeType);
|
|
1945
|
-
console.log(media.data.filename);
|
|
1946
|
-
console.log(media.data.size);
|
|
2001
|
+
|
|
2002
|
+
console.log(media.data.buffer);
|
|
2003
|
+
console.log(media.data.mimeType);
|
|
2004
|
+
console.log(media.data.filename);
|
|
2005
|
+
console.log(media.data.size);
|
|
2006
|
+
```
|
|
2007
|
+
|
|
2008
|
+
#### Publicar Conteúdo no Instagram
|
|
2009
|
+
|
|
2010
|
+
|
|
2011
|
+
|
|
2012
|
+
**1. Criar Contêiner de Mídia**
|
|
2013
|
+
|
|
2014
|
+
```typescript
|
|
2015
|
+
// Publicar imagem
|
|
2016
|
+
const container = await sdk.instagram.createMediaContainer({
|
|
2017
|
+
token: 'sk_live_...',
|
|
2018
|
+
image_url: 'https://example.com/image.jpg',
|
|
2019
|
+
media_type: 'IMAGE',
|
|
2020
|
+
caption: 'Nossa nova coleção chegou! #moda #verao',
|
|
2021
|
+
alt_text: 'Foto de um produto de moda' // Opcional: texto alternativo
|
|
2022
|
+
}, accessToken);
|
|
2023
|
+
|
|
2024
|
+
const creationId = container.data.data.id; // ID do contêiner criado
|
|
2025
|
+
```
|
|
2026
|
+
|
|
2027
|
+
```typescript
|
|
2028
|
+
// Publicar vídeo
|
|
2029
|
+
const container = await sdk.instagram.createMediaContainer({
|
|
2030
|
+
token: 'sk_live_...',
|
|
2031
|
+
video_url: 'https://example.com/video.mp4',
|
|
2032
|
+
media_type: 'VIDEO',
|
|
2033
|
+
caption: 'Vídeo especial para nossos seguidores'
|
|
2034
|
+
}, accessToken);
|
|
2035
|
+
```
|
|
2036
|
+
|
|
2037
|
+
```typescript
|
|
2038
|
+
// Publicar Reel
|
|
2039
|
+
const container = await sdk.instagram.createMediaContainer({
|
|
2040
|
+
token: 'sk_live_...',
|
|
2041
|
+
video_url: 'https://example.com/reel.mp4',
|
|
2042
|
+
media_type: 'REELS',
|
|
2043
|
+
caption: 'Confira nosso novo Reel!',
|
|
2044
|
+
trial_params: { // Opcional: para reels de teste
|
|
2045
|
+
graduation_strategy: 'MANUAL'
|
|
2046
|
+
}
|
|
2047
|
+
}, accessToken);
|
|
2048
|
+
```
|
|
2049
|
+
|
|
2050
|
+
```typescript
|
|
2051
|
+
// Publicar Story
|
|
2052
|
+
const container = await sdk.instagram.createMediaContainer({
|
|
2053
|
+
token: 'sk_live_...',
|
|
2054
|
+
video_url: 'https://example.com/story.mp4',
|
|
2055
|
+
media_type: 'STORIES'
|
|
2056
|
+
}, accessToken);
|
|
2057
|
+
```
|
|
2058
|
+
|
|
2059
|
+
```typescript
|
|
2060
|
+
// Criar carrossel (até 10 itens)
|
|
2061
|
+
// Primeiro, criar os contêineres filhos
|
|
2062
|
+
const child1 = await sdk.instagram.createMediaContainer({
|
|
2063
|
+
token: 'sk_live_...',
|
|
2064
|
+
image_url: 'https://example.com/image1.jpg',
|
|
2065
|
+
media_type: 'IMAGE',
|
|
2066
|
+
is_carousel_item: true
|
|
2067
|
+
}, accessToken);
|
|
2068
|
+
|
|
2069
|
+
const child2 = await sdk.instagram.createMediaContainer({
|
|
2070
|
+
token: 'sk_live_...',
|
|
2071
|
+
image_url: 'https://example.com/image2.jpg',
|
|
2072
|
+
media_type: 'IMAGE',
|
|
2073
|
+
is_carousel_item: true
|
|
2074
|
+
}, accessToken);
|
|
2075
|
+
|
|
2076
|
+
// Depois, criar o contêiner pai do carrossel
|
|
2077
|
+
const carousel = await sdk.instagram.createMediaContainer({
|
|
2078
|
+
token: 'sk_live_...',
|
|
2079
|
+
media_type: 'CAROUSEL',
|
|
2080
|
+
caption: 'Balas de frutas',
|
|
2081
|
+
children: [
|
|
2082
|
+
child1.data.data.id,
|
|
2083
|
+
child2.data.data.id
|
|
2084
|
+
]
|
|
2085
|
+
}, accessToken);
|
|
2086
|
+
```
|
|
2087
|
+
|
|
2088
|
+
**2. Verificar Status do Contêiner** (para vídeos grandes)
|
|
2089
|
+
|
|
2090
|
+
```typescript
|
|
2091
|
+
const status = await sdk.instagram.getContainerStatus({
|
|
2092
|
+
token: 'sk_live_...',
|
|
2093
|
+
container_id: '17841465415913137'
|
|
2094
|
+
}, accessToken);
|
|
2095
|
+
|
|
2096
|
+
// Status possíveis: EXPIRED, ERROR, FINISHED, IN_PROGRESS, PUBLISHED
|
|
2097
|
+
console.log(status.data.data.status_code);
|
|
2098
|
+
|
|
2099
|
+
// Para vídeos grandes, aguarde até o status ser 'FINISHED' antes de publicar
|
|
2100
|
+
if (status.data.data.status_code === 'FINISHED') {
|
|
2101
|
+
// Pronto para publicar
|
|
2102
|
+
}
|
|
2103
|
+
```
|
|
2104
|
+
|
|
2105
|
+
**3. Publicar Mídia**
|
|
2106
|
+
|
|
2107
|
+
```typescript
|
|
2108
|
+
const published = await sdk.instagram.publishMedia({
|
|
2109
|
+
token: 'sk_live_...',
|
|
2110
|
+
creation_id: '17841465415913137' // ID retornado ao criar o contêiner
|
|
2111
|
+
}, accessToken);
|
|
2112
|
+
|
|
2113
|
+
console.log(published.data.data.id); // ID da publicação criada
|
|
2114
|
+
```
|
|
2115
|
+
|
|
2116
|
+
**4. Verificar Limite de Publicação**
|
|
2117
|
+
|
|
2118
|
+
```typescript
|
|
2119
|
+
const limit = await sdk.instagram.getPublishingLimit({
|
|
2120
|
+
token: 'sk_live_...'
|
|
2121
|
+
}, accessToken);
|
|
2122
|
+
|
|
2123
|
+
console.log(`Usado: ${limit.data.data.quota_used} de ${limit.data.data.quota_total}`);
|
|
2124
|
+
console.log(`Período: ${limit.data.data.quota_duration} segundos (24 horas)`);
|
|
2125
|
+
```
|
|
2126
|
+
|
|
2127
|
+
**5. Upload de Vídeo Grande (Sessão Retomável)**
|
|
2128
|
+
|
|
2129
|
+
Para vídeos grandes que podem ter interrupções de rede:
|
|
2130
|
+
|
|
2131
|
+
```typescript
|
|
2132
|
+
// 1. Criar contêiner com upload_type=resumable
|
|
2133
|
+
const container = await sdk.instagram.createMediaContainer({
|
|
2134
|
+
token: 'sk_live_...',
|
|
2135
|
+
video_url: 'https://example.com/large-video.mp4',
|
|
2136
|
+
media_type: 'VIDEO',
|
|
2137
|
+
upload_type: 'resumable',
|
|
2138
|
+
caption: 'Vídeo grande com upload retomável'
|
|
2139
|
+
}, accessToken);
|
|
2140
|
+
|
|
2141
|
+
// 2. Fazer upload do vídeo
|
|
2142
|
+
const upload = await sdk.instagram.uploadVideo({
|
|
2143
|
+
token: 'sk_live_...',
|
|
2144
|
+
container_id: container.data.data.id,
|
|
2145
|
+
file_url: 'https://example.com/large-video.mp4',
|
|
2146
|
+
file_size: 10485760, // Tamanho em bytes (opcional se file_url fornecido)
|
|
2147
|
+
offset: 0 // Opcional: para retomar upload (padrão: 0)
|
|
2148
|
+
}, accessToken);
|
|
2149
|
+
|
|
2150
|
+
// 3. Verificar status periodicamente até ser 'FINISHED'
|
|
2151
|
+
// 4. Publicar quando status for 'FINISHED'
|
|
2152
|
+
```
|
|
2153
|
+
|
|
2154
|
+
**Exemplo Completo: Publicar Imagem**
|
|
2155
|
+
|
|
2156
|
+
```typescript
|
|
2157
|
+
// 1. Criar contêiner
|
|
2158
|
+
const container = await sdk.instagram.createMediaContainer({
|
|
2159
|
+
token: 'sk_live_...',
|
|
2160
|
+
image_url: 'https://example.com/image.jpg',
|
|
2161
|
+
media_type: 'IMAGE',
|
|
2162
|
+
caption: 'Nossa nova coleção chegou! #moda #verao',
|
|
2163
|
+
alt_text: 'Foto de um produto de moda',
|
|
2164
|
+
location_id: '123456789', // Opcional: ID da localização
|
|
2165
|
+
user_tags: [ // Opcional: marcar usuários
|
|
2166
|
+
{ username: 'usuario1', x: 0.5, y: 0.5 }
|
|
2167
|
+
]
|
|
2168
|
+
}, accessToken);
|
|
2169
|
+
|
|
2170
|
+
const creationId = container.data.data.id;
|
|
2171
|
+
|
|
2172
|
+
// 2. Publicar imediatamente (imagens são processadas rapidamente)
|
|
2173
|
+
const published = await sdk.instagram.publishMedia({
|
|
2174
|
+
token: 'sk_live_...',
|
|
2175
|
+
creation_id: creationId
|
|
2176
|
+
}, accessToken);
|
|
2177
|
+
|
|
2178
|
+
console.log(`Publicação criada com ID: ${published.data.data.id}`);
|
|
2179
|
+
```
|
|
2180
|
+
|
|
2181
|
+
**Exemplo Completo: Publicar Vídeo com Verificação de Status**
|
|
2182
|
+
|
|
2183
|
+
```typescript
|
|
2184
|
+
// 1. Criar contêiner de vídeo
|
|
2185
|
+
const container = await sdk.instagram.createMediaContainer({
|
|
2186
|
+
token: 'sk_live_...',
|
|
2187
|
+
video_url: 'https://example.com/video.mp4',
|
|
2188
|
+
media_type: 'VIDEO',
|
|
2189
|
+
caption: 'Vídeo especial para nossos seguidores'
|
|
2190
|
+
}, accessToken);
|
|
2191
|
+
|
|
2192
|
+
const containerId = container.data.data.id;
|
|
2193
|
+
|
|
2194
|
+
// 2. Verificar status periodicamente (vídeos podem demorar)
|
|
2195
|
+
let status = 'IN_PROGRESS';
|
|
2196
|
+
let attempts = 0;
|
|
2197
|
+
const maxAttempts = 10;
|
|
2198
|
+
|
|
2199
|
+
while (status === 'IN_PROGRESS' && attempts < maxAttempts) {
|
|
2200
|
+
await new Promise(resolve => setTimeout(resolve, 5000)); // Aguardar 5 segundos
|
|
2201
|
+
|
|
2202
|
+
const statusCheck = await sdk.instagram.getContainerStatus({
|
|
2203
|
+
token: 'sk_live_...',
|
|
2204
|
+
container_id: containerId
|
|
2205
|
+
}, accessToken);
|
|
2206
|
+
|
|
2207
|
+
status = statusCheck.data.data.status_code;
|
|
2208
|
+
attempts++;
|
|
2209
|
+
|
|
2210
|
+
console.log(`Status: ${status} (tentativa ${attempts})`);
|
|
2211
|
+
}
|
|
2212
|
+
|
|
2213
|
+
// 3. Publicar quando status for 'FINISHED'
|
|
2214
|
+
if (status === 'FINISHED') {
|
|
2215
|
+
const published = await sdk.instagram.publishMedia({
|
|
2216
|
+
token: 'sk_live_...',
|
|
2217
|
+
creation_id: containerId
|
|
2218
|
+
}, accessToken);
|
|
2219
|
+
|
|
2220
|
+
console.log(`Vídeo publicado com ID: ${published.data.data.id}`);
|
|
2221
|
+
} else {
|
|
2222
|
+
console.error(`Erro: Status final é ${status}`);
|
|
2223
|
+
}
|
|
1947
2224
|
```
|
|
1948
2225
|
|
|
1949
2226
|
### Canais
|