@warriorteam/redai-zalo-sdk 1.18.0 → 1.20.0
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/CHANGELOG.md +156 -0
- package/README.md +33 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/services/broadcast.service.d.ts +90 -0
- package/dist/services/broadcast.service.d.ts.map +1 -0
- package/dist/services/broadcast.service.js +211 -0
- package/dist/services/broadcast.service.js.map +1 -0
- package/dist/services/group-message.service.d.ts +200 -0
- package/dist/services/group-message.service.d.ts.map +1 -1
- package/dist/services/group-message.service.js +331 -0
- package/dist/services/group-message.service.js.map +1 -1
- package/dist/types/broadcast.d.ts +244 -0
- package/dist/types/broadcast.d.ts.map +1 -0
- package/dist/types/broadcast.js +114 -0
- package/dist/types/broadcast.js.map +1 -0
- package/dist/zalo-sdk.d.ts +2 -0
- package/dist/zalo-sdk.d.ts.map +1 -1
- package/dist/zalo-sdk.js +2 -0
- package/dist/zalo-sdk.js.map +1 -1
- package/docs/API_REFERENCE.md +53 -0
- package/docs/BROADCAST_SERVICE.md +276 -0
- package/docs/group-message-list-api.md +332 -0
- package/examples/broadcast-example.ts +144 -0
- package/examples/group-message-list.ts +288 -0
- package/package.json +11 -3
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,162 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.20.0] - 2025-08-29
|
|
9
|
+
|
|
10
|
+
### 🚀 NEW FEATURES
|
|
11
|
+
|
|
12
|
+
#### Broadcast Service - Gửi Tin Truyền Thông Broadcast
|
|
13
|
+
- **ADDED**: `BroadcastService` - Service mới để gửi tin truyền thông broadcast đến nhiều người dùng
|
|
14
|
+
- **ADDED**: `sendBroadcastMessage()` - API gửi broadcast với targeting criteria
|
|
15
|
+
- **ADDED**: `createBroadcastTarget()` - Helper tạo targeting criteria dễ dàng
|
|
16
|
+
- **SUPPORT**: Targeting theo tuổi, giới tính, tỉnh thành, miền, platform
|
|
17
|
+
- **COMPLIANCE**: Tuân thủ 100% Zalo API specification
|
|
18
|
+
|
|
19
|
+
#### Advanced Targeting System
|
|
20
|
+
- **AGES**: 8 nhóm tuổi (0-12, 13-17, 18-24, 25-34, 35-44, 45-54, 55-64, 65+)
|
|
21
|
+
- **GENDER**: 3 lựa chọn (All, Male, Female)
|
|
22
|
+
- **CITIES**: 63 tỉnh thành Việt Nam với mapping chính xác
|
|
23
|
+
- **LOCATIONS**: 3 miền (North, Central, South)
|
|
24
|
+
- **PLATFORMS**: 3 hệ điều hành (iOS, Android, Windows Phone)
|
|
25
|
+
|
|
26
|
+
#### Helper Methods & Constants
|
|
27
|
+
- **ADDED**: `getCityCodes()` - Lấy mapping tỉnh thành
|
|
28
|
+
- **ADDED**: `getAgeGroupCodes()` - Lấy mã nhóm tuổi
|
|
29
|
+
- **ADDED**: `getGenderCodes()` - Lấy mã giới tính
|
|
30
|
+
- **ADDED**: `getLocationCodes()` - Lấy mã miền
|
|
31
|
+
- **ADDED**: `getPlatformCodes()` - Lấy mã platform
|
|
32
|
+
- **CONSTANTS**: Đầy đủ constants cho tất cả targeting criteria
|
|
33
|
+
|
|
34
|
+
### 📊 NEW INTERFACES
|
|
35
|
+
|
|
36
|
+
#### Broadcast Types
|
|
37
|
+
- **ADDED**: `BroadcastTarget` - Interface cho targeting criteria
|
|
38
|
+
- **ADDED**: `BroadcastRecipient` - Interface cho thông tin người nhận
|
|
39
|
+
- **ADDED**: `BroadcastMessage` - Interface cho tin nhắn broadcast
|
|
40
|
+
- **ADDED**: `BroadcastRequest` - Request payload structure
|
|
41
|
+
- **ADDED**: `BroadcastResponse` - Response structure với message_id
|
|
42
|
+
- **ADDED**: `BroadcastMessageElement` - Element structure cho article attachment
|
|
43
|
+
|
|
44
|
+
### 🛡️ VALIDATION & ERROR HANDLING
|
|
45
|
+
- **VALIDATION**: Kiểm tra targeting criteria hợp lệ
|
|
46
|
+
- **VALIDATION**: Kiểm tra attachment_id bắt buộc
|
|
47
|
+
- **ERROR**: Comprehensive error messages cho từng trường hợp
|
|
48
|
+
- **TYPE SAFETY**: Full TypeScript support với IntelliSense
|
|
49
|
+
|
|
50
|
+
### 📚 DOCUMENTATION & EXAMPLES
|
|
51
|
+
|
|
52
|
+
#### New Documentation
|
|
53
|
+
- **ADDED**: `docs/BROADCAST_SERVICE.md` - Hướng dẫn chi tiết BroadcastService
|
|
54
|
+
- **UPDATED**: `docs/API_REFERENCE.md` - Thêm BroadcastService methods
|
|
55
|
+
- **UPDATED**: `README.md` - Thêm Broadcast Service examples
|
|
56
|
+
|
|
57
|
+
#### New Examples
|
|
58
|
+
- **ADDED**: `examples/broadcast-example.ts` - Ví dụ sử dụng BroadcastService
|
|
59
|
+
- **EXAMPLES**: Targeting đơn giản và phức tạp
|
|
60
|
+
- **EXAMPLES**: Error handling và best practices
|
|
61
|
+
|
|
62
|
+
#### New Tests
|
|
63
|
+
- **ADDED**: `tests/broadcast.test.ts` - Unit tests cho BroadcastService
|
|
64
|
+
- **COVERAGE**: Test targeting criteria creation
|
|
65
|
+
- **COVERAGE**: Test broadcast message sending
|
|
66
|
+
- **COVERAGE**: Test validation logic
|
|
67
|
+
|
|
68
|
+
### 🔧 SDK INTEGRATION
|
|
69
|
+
- **INTEGRATION**: Tích hợp BroadcastService vào main ZaloSDK class
|
|
70
|
+
- **ACCESS**: Sử dụng qua `zalo.broadcast`
|
|
71
|
+
- **EXPORT**: Export tất cả types và service từ main index
|
|
72
|
+
|
|
73
|
+
### 📋 API SPECIFICATION COMPLIANCE
|
|
74
|
+
- **ENDPOINT**: `https://openapi.zalo.me/v2.0/oa/message` ✅
|
|
75
|
+
- **METHOD**: POST với JSON payload ✅
|
|
76
|
+
- **HEADERS**: access_token authentication ✅
|
|
77
|
+
- **TARGETING**: recipient.target với đầy đủ criteria ✅
|
|
78
|
+
- **MESSAGE**: Template type "media" với article attachment ✅
|
|
79
|
+
- **RESPONSE**: message_id, error, message structure ✅
|
|
80
|
+
|
|
81
|
+
## [1.19.0] - 2025-08-29
|
|
82
|
+
|
|
83
|
+
### 🚀 NEW FEATURES
|
|
84
|
+
|
|
85
|
+
#### Group Message List APIs - Gửi Danh Sách Tin Nhắn Group
|
|
86
|
+
- **ADDED**: `sendMessageListToGroup()` - Gửi danh sách tin nhắn tới 1 group với delay tùy chỉnh
|
|
87
|
+
- **ADDED**: `sendMessageListToMultipleGroups()` - Gửi danh sách tin nhắn tới nhiều groups cùng lúc
|
|
88
|
+
- **SUPPORT**: Hỗ trợ đầy đủ 5 loại tin nhắn group: text, image, file, sticker, mention
|
|
89
|
+
- **FLEXIBLE**: Delay riêng cho từng tin nhắn + delay giữa groups để tránh rate limit
|
|
90
|
+
- **SMART**: Tự động loại bỏ group IDs trùng lặp và validation đầy đủ
|
|
91
|
+
|
|
92
|
+
#### Real-time Progress Tracking cho Groups
|
|
93
|
+
- **CALLBACK**: `onProgress` callback để tracking real-time từng tin nhắn và group
|
|
94
|
+
- **DETAILED**: Thống kê chi tiết thành công/thất bại cho từng tin nhắn và group
|
|
95
|
+
- **ISOLATION**: Error của 1 tin nhắn/group không ảnh hưởng phần còn lại
|
|
96
|
+
- **METRICS**: Tracking thời gian thực hiện, success rate, và message statistics
|
|
97
|
+
|
|
98
|
+
#### Advanced Group Messaging Features
|
|
99
|
+
- **MENTION**: Hỗ trợ mention members với offset và length chính xác
|
|
100
|
+
- **CAPTION**: Image messages với caption tối đa 2000 ký tự
|
|
101
|
+
- **FILE**: File attachments với token từ upload API
|
|
102
|
+
- **SEQUENTIAL**: Gửi tuần tự để đảm bảo thứ tự và tránh rate limit
|
|
103
|
+
|
|
104
|
+
### 📊 NEW INTERFACES
|
|
105
|
+
|
|
106
|
+
#### Group Message List Types
|
|
107
|
+
- **ADDED**: `GroupMessageItem` - Interface cho từng tin nhắn trong danh sách
|
|
108
|
+
- **ADDED**: `SendMessageListToGroupRequest` - Request cho single group
|
|
109
|
+
- **ADDED**: `SendMessageListToGroupResponse` - Response với detailed results
|
|
110
|
+
- **ADDED**: `SendMessageListToMultipleGroupsRequest` - Request cho multiple groups
|
|
111
|
+
- **ADDED**: `SendMessageListToMultipleGroupsResponse` - Response với group statistics
|
|
112
|
+
- **ADDED**: `GroupMessageProgressInfo` - Interface cho message progress tracking
|
|
113
|
+
- **ADDED**: `MultipleGroupsProgressInfo` - Interface cho multiple groups progress tracking
|
|
114
|
+
|
|
115
|
+
### 📚 DOCUMENTATION & EXAMPLES
|
|
116
|
+
|
|
117
|
+
#### New Documentation
|
|
118
|
+
- **ADDED**: `docs/group-message-list-api.md` - Comprehensive guide cho Group Message List APIs
|
|
119
|
+
- **UPDATED**: Hướng dẫn chi tiết từng loại tin nhắn group và use cases
|
|
120
|
+
- **ADDED**: So sánh API cũ vs mới với feature comparison table
|
|
121
|
+
|
|
122
|
+
#### New Examples
|
|
123
|
+
- **ADDED**: `examples/group-message-list.ts` - Ví dụ gửi danh sách tin nhắn group
|
|
124
|
+
- **INCLUDED**: System notifications, marketing campaigns, meeting notifications examples
|
|
125
|
+
- **DEMO**: Mention messages, image captions, file attachments usage
|
|
126
|
+
|
|
127
|
+
### 🎯 USE CASES
|
|
128
|
+
|
|
129
|
+
#### System Administration
|
|
130
|
+
- **MAINTENANCE**: Thông báo bảo trì hệ thống tới tất cả groups
|
|
131
|
+
- **ALERTS**: Emergency alerts với hình ảnh và file đính kèm
|
|
132
|
+
- **UPDATES**: System updates với mention admins
|
|
133
|
+
|
|
134
|
+
#### Marketing & Business
|
|
135
|
+
- **CAMPAIGNS**: Flash sales, khuyến mãi tới customer groups
|
|
136
|
+
- **PROMOTIONS**: Product launches với hình ảnh và stickers
|
|
137
|
+
- **ANNOUNCEMENTS**: Company announcements với professional formatting
|
|
138
|
+
|
|
139
|
+
#### Team Communication
|
|
140
|
+
- **MEETINGS**: Meeting notifications với mention participants
|
|
141
|
+
- **PROJECTS**: Project updates tới multiple team groups
|
|
142
|
+
- **REPORTS**: Regular reports với file attachments
|
|
143
|
+
|
|
144
|
+
### 🔧 TECHNICAL IMPROVEMENTS
|
|
145
|
+
|
|
146
|
+
#### Enhanced Error Handling
|
|
147
|
+
- **ROBUST**: Comprehensive error handling cho từng tin nhắn và group
|
|
148
|
+
- **CONTINUE**: Tiếp tục gửi khi gặp lỗi thay vì dừng toàn bộ process
|
|
149
|
+
- **DETAILED**: Error messages chi tiết với context information
|
|
150
|
+
- **ISOLATION**: Error isolation giữa tin nhắn và giữa groups
|
|
151
|
+
|
|
152
|
+
#### Performance Optimizations
|
|
153
|
+
- **SEQUENTIAL**: Sequential processing để tránh overwhelming Zalo servers
|
|
154
|
+
- **MEMORY**: Optimized memory usage cho large group lists
|
|
155
|
+
- **RATE-LIMIT**: Built-in rate limiting protection với configurable delays
|
|
156
|
+
- **TIMEOUT**: Proper timeout handling và cleanup
|
|
157
|
+
|
|
158
|
+
#### Type Safety & Validation
|
|
159
|
+
- **TYPESCRIPT**: Full TypeScript support với strict typing
|
|
160
|
+
- **VALIDATION**: Runtime validation cho tất cả input parameters
|
|
161
|
+
- **INTELLISENSE**: Complete IDE support với detailed JSDoc comments
|
|
162
|
+
- **CONSTRAINTS**: Proper validation cho message constraints (text length, etc.)
|
|
163
|
+
|
|
8
164
|
## [1.18.0] - 2025-08-29
|
|
9
165
|
|
|
10
166
|
### 🚀 NEW FEATURES
|
package/README.md
CHANGED
|
@@ -4,6 +4,7 @@ A comprehensive TypeScript/JavaScript SDK for Zalo APIs, providing easy-to-use i
|
|
|
4
4
|
|
|
5
5
|
- **Official Account (OA) API** - Manage your Zalo Official Account
|
|
6
6
|
- **Consultation Service** - Send customer support messages within 48-hour window
|
|
7
|
+
- **Broadcast Service** - Send mass communication messages with targeting criteria
|
|
7
8
|
- **Zalo Notification Service (ZNS)** - Send template-based notification messages
|
|
8
9
|
- **Social API** - Access user social information and authentication
|
|
9
10
|
- **Group Message Framework (GMF)** - Send messages to Zalo groups
|
|
@@ -377,6 +378,38 @@ For support and questions:
|
|
|
377
378
|
- Create an issue on GitHub
|
|
378
379
|
- Contact RedAI team
|
|
379
380
|
|
|
381
|
+
### Broadcast Service (Mass Communication)
|
|
382
|
+
|
|
383
|
+
```typescript
|
|
384
|
+
// Create targeting criteria
|
|
385
|
+
const target = zalo.broadcast.createBroadcastTarget({
|
|
386
|
+
gender: "FEMALE", // Target female users
|
|
387
|
+
ages: ["18-24", "25-34"], // Age 18-34
|
|
388
|
+
cities: ["Hồ Chí Minh", "Hà Nội"], // Ho Chi Minh City and Hanoi
|
|
389
|
+
platforms: ["ANDROID", "IOS"] // Android and iOS users
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
// Send broadcast message
|
|
393
|
+
const result = await zalo.broadcast.sendBroadcastMessage(
|
|
394
|
+
accessToken,
|
|
395
|
+
{ target },
|
|
396
|
+
"article-attachment-id"
|
|
397
|
+
);
|
|
398
|
+
|
|
399
|
+
console.log("Broadcast sent:", result.data.message_id);
|
|
400
|
+
|
|
401
|
+
// Simple city targeting
|
|
402
|
+
const hcmTarget = zalo.broadcast.createBroadcastTarget({
|
|
403
|
+
cities: ["Hồ Chí Minh"]
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
await zalo.broadcast.sendBroadcastMessage(
|
|
407
|
+
accessToken,
|
|
408
|
+
{ target: hcmTarget },
|
|
409
|
+
"article-id"
|
|
410
|
+
);
|
|
411
|
+
```
|
|
412
|
+
|
|
380
413
|
### Consultation Service (Customer Support)
|
|
381
414
|
|
|
382
415
|
```typescript
|
package/dist/index.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export * from "./types/oa";
|
|
|
14
14
|
export * from "./types/user";
|
|
15
15
|
export * from "./types/zns";
|
|
16
16
|
export * from "./types/article";
|
|
17
|
+
export * from "./types/broadcast";
|
|
17
18
|
export * from "./constants/zns.constants";
|
|
18
19
|
export type { BaseMessage, TextMessage, ImageMessage, FileMessage, StickerMessage, TemplateMessage as MessageTemplateMessage, ReactionMessage as MessageReactionMessage, Message, MessageRecipient, SendMessageRequest, SendMessageResponse, UploadFileResponse, MessageStatus, MessageEvent, ConsultationTextMessage, ConsultationImageMessage, ConsultationFileMessage, ConsultationStickerMessage, ConsultationQuoteMessage, ConsultationRequestInfoMessage, TransactionMessage, PromotionMessage, AnonymousTextMessage, AnonymousImageMessage, AnonymousFileMessage, AnonymousStickerMessage, MiniAppMessage, ExtendedMessage, } from "./types/message";
|
|
19
20
|
export * from "./types/webhook";
|
|
@@ -36,6 +37,7 @@ export { TransactionService } from "./services/transaction.service";
|
|
|
36
37
|
export { PromotionService } from "./services/promotion.service";
|
|
37
38
|
export { GeneralMessageService } from "./services/general-message.service";
|
|
38
39
|
export { MessageManagementService, UploadFileResult, UploadImageResult, MessageQuotaInfo, ConversationMessage, Conversation, MessagePagination } from "./services/message-management.service";
|
|
40
|
+
export { BroadcastService } from "./services/broadcast.service";
|
|
39
41
|
export { ZaloSDK } from "./zalo-sdk";
|
|
40
42
|
export { ZaloSDK as default } from "./zalo-sdk";
|
|
41
43
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -24,7 +24,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
24
24
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
25
25
|
};
|
|
26
26
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
-
exports.default = exports.ZaloSDK = exports.MessageManagementService = exports.GeneralMessageService = exports.PromotionService = exports.TransactionService = exports.ConsultationService = exports.VideoUploadService = exports.ArticleService = exports.GroupManagementService = exports.GroupMessageService = exports.ZNSService = exports.UserService = exports.OAService = exports.AuthService = exports.ZaloClient = exports.BaseClient = exports.getMessageDirection = exports.isOAToGroupMessageEvent = exports.isOAToUserMessageEvent = exports.isGroupMessageEvent = exports.isUserMessageEvent = exports.isFromPersonal = exports.isFromGroup = exports.isOASendGroupGifEvent = exports.isOASendGroupStickerEvent = exports.isOASendGroupFileEvent = exports.isOASendGroupImageEvent = exports.isOASendGroupTextEvent = exports.isOASendGifEvent = exports.isOASendStickerEvent = exports.isOASendFileEvent = exports.isOASendImageEvent = exports.isOASendTextEvent = exports.isUserGroupMessageEvent = exports.isUserSendGroupFileEvent = exports.isUserSendGroupAudioEvent = exports.isUserSendGroupVideoEvent = exports.isUserSendGroupImageEvent = exports.isUserSendGroupTextEvent = void 0;
|
|
27
|
+
exports.default = exports.ZaloSDK = exports.BroadcastService = exports.MessageManagementService = exports.GeneralMessageService = exports.PromotionService = exports.TransactionService = exports.ConsultationService = exports.VideoUploadService = exports.ArticleService = exports.GroupManagementService = exports.GroupMessageService = exports.ZNSService = exports.UserService = exports.OAService = exports.AuthService = exports.ZaloClient = exports.BaseClient = exports.getMessageDirection = exports.isOAToGroupMessageEvent = exports.isOAToUserMessageEvent = exports.isGroupMessageEvent = exports.isUserMessageEvent = exports.isFromPersonal = exports.isFromGroup = exports.isOASendGroupGifEvent = exports.isOASendGroupStickerEvent = exports.isOASendGroupFileEvent = exports.isOASendGroupImageEvent = exports.isOASendGroupTextEvent = exports.isOASendGifEvent = exports.isOASendStickerEvent = exports.isOASendFileEvent = exports.isOASendImageEvent = exports.isOASendTextEvent = exports.isUserGroupMessageEvent = exports.isUserSendGroupFileEvent = exports.isUserSendGroupAudioEvent = exports.isUserSendGroupVideoEvent = exports.isUserSendGroupImageEvent = exports.isUserSendGroupTextEvent = void 0;
|
|
28
28
|
// Export types
|
|
29
29
|
__exportStar(require("./types/common"), exports);
|
|
30
30
|
__exportStar(require("./types/auth"), exports);
|
|
@@ -32,6 +32,7 @@ __exportStar(require("./types/oa"), exports);
|
|
|
32
32
|
__exportStar(require("./types/user"), exports);
|
|
33
33
|
__exportStar(require("./types/zns"), exports);
|
|
34
34
|
__exportStar(require("./types/article"), exports);
|
|
35
|
+
__exportStar(require("./types/broadcast"), exports);
|
|
35
36
|
// Export ZNS constants and helpers
|
|
36
37
|
__exportStar(require("./constants/zns.constants"), exports);
|
|
37
38
|
// Export webhook types (avoiding conflicts with message and group types)
|
|
@@ -98,6 +99,8 @@ var general_message_service_1 = require("./services/general-message.service");
|
|
|
98
99
|
Object.defineProperty(exports, "GeneralMessageService", { enumerable: true, get: function () { return general_message_service_1.GeneralMessageService; } });
|
|
99
100
|
var message_management_service_1 = require("./services/message-management.service");
|
|
100
101
|
Object.defineProperty(exports, "MessageManagementService", { enumerable: true, get: function () { return message_management_service_1.MessageManagementService; } });
|
|
102
|
+
var broadcast_service_1 = require("./services/broadcast.service");
|
|
103
|
+
Object.defineProperty(exports, "BroadcastService", { enumerable: true, get: function () { return broadcast_service_1.BroadcastService; } });
|
|
101
104
|
// Export main SDK class
|
|
102
105
|
var zalo_sdk_1 = require("./zalo-sdk");
|
|
103
106
|
Object.defineProperty(exports, "ZaloSDK", { enumerable: true, get: function () { return zalo_sdk_1.ZaloSDK; } });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;;;;;;;;;;;;;;;AAEH,eAAe;AACf,iDAA+B;AAC/B,+CAA6B;AAC7B,6CAA2B;AAC3B,+CAA6B;AAC7B,8CAA4B;AAC5B,kDAAgC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;;;;;;;;;;;;;;;AAEH,eAAe;AACf,iDAA+B;AAC/B,+CAA6B;AAC7B,6CAA2B;AAC3B,+CAA6B;AAC7B,8CAA4B;AAC5B,kDAAgC;AAChC,oDAAkC;AAElC,mCAAmC;AACnC,4DAA0C;AAkC1C,yEAAyE;AACzE,kDAAgC;AAEhC,yEAAyE;AACzE,mDAoB6B;AAlB3B,uHAAA,wBAAwB,OAAA;AACxB,wHAAA,yBAAyB,OAAA;AACzB,wHAAA,yBAAyB,OAAA;AACzB,wHAAA,yBAAyB,OAAA;AACzB,uHAAA,wBAAwB,OAAA;AACxB,sHAAA,uBAAuB,OAAA;AACvB,gHAAA,iBAAiB,OAAA;AACjB,iHAAA,kBAAkB,OAAA;AAClB,gHAAA,iBAAiB,OAAA;AACjB,mHAAA,oBAAoB,OAAA;AACpB,+GAAA,gBAAgB,OAAA;AAChB,qHAAA,sBAAsB,OAAA;AACtB,sHAAA,uBAAuB,OAAA;AACvB,qHAAA,sBAAsB,OAAA;AACtB,wHAAA,yBAAyB,OAAA;AACzB,oHAAA,qBAAqB,OAAA;AACrB,0GAAA,WAAW,OAAA;AACX,6GAAA,cAAc,OAAA;AAEhB,kCAAkC;AAClC,2CAMyB;AALvB,6GAAA,kBAAkB,OAAA;AAClB,8GAAA,mBAAmB,OAAA;AACnB,iHAAA,sBAAsB,OAAA;AACtB,kHAAA,uBAAuB,OAAA;AACvB,8GAAA,mBAAmB,OAAA;AAoFrB,iBAAiB;AACjB,qDAAmD;AAA1C,yGAAA,UAAU,OAAA;AACnB,qDAAmD;AAA1C,yGAAA,UAAU,OAAA;AAEnB,kBAAkB;AAClB,wDAAsD;AAA7C,2GAAA,WAAW,OAAA;AACpB,oDAAkD;AAAzC,uGAAA,SAAS,OAAA;AAClB,2GAA2G;AAC3G,wDAAsD;AAA7C,2GAAA,WAAW,OAAA;AACpB,+DAA+D;AAC/D,sDAAoD;AAA3C,yGAAA,UAAU,OAAA;AACnB,0EAAuE;AAA9D,4HAAA,mBAAmB,OAAA;AAC5B,gFAA6E;AAApE,kIAAA,sBAAsB,OAAA;AAC/B,8DAA4D;AAAnD,iHAAA,cAAc,OAAA;AACvB,wEAAqE;AAA5D,0HAAA,kBAAkB,OAAA;AAE3B,iDAAiD;AACjD,wEAAsE;AAA7D,2HAAA,mBAAmB,OAAA;AAC5B,sEAAoE;AAA3D,yHAAA,kBAAkB,OAAA;AAC3B,kEAAgE;AAAvD,qHAAA,gBAAgB,OAAA;AACzB,8EAA2E;AAAlE,gIAAA,qBAAqB,OAAA;AAC9B,oFAQ+C;AAP7C,sIAAA,wBAAwB,OAAA;AAQ1B,kEAAgE;AAAvD,qHAAA,gBAAgB,OAAA;AAEzB,wBAAwB;AACxB,uCAAqC;AAA5B,mGAAA,OAAO,OAAA;AAEhB,iBAAiB;AACjB,uCAAgD;AAAvC,mGAAA,OAAO,OAAW"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Broadcast Service for Zalo Official Account
|
|
3
|
+
*
|
|
4
|
+
* Gửi tin Truyền thông Broadcast đến nhiều người dùng dựa trên tiêu chí targeting
|
|
5
|
+
* API: https://openapi.zalo.me/v2.0/oa/message
|
|
6
|
+
*
|
|
7
|
+
* TÍNH NĂNG:
|
|
8
|
+
* 1. GỬI TIN BROADCAST:
|
|
9
|
+
* - Gửi tin nhắn đến nhiều người dùng cùng lúc
|
|
10
|
+
* - Targeting theo tuổi, giới tính, địa điểm, platform
|
|
11
|
+
* - Chỉ hỗ trợ template type "media" với article attachment
|
|
12
|
+
*
|
|
13
|
+
* 2. TARGETING CRITERIA:
|
|
14
|
+
* - Ages: Nhóm tuổi (0-12, 13-17, 18-24, 25-34, 35-44, 45-54, 55-64, 65+)
|
|
15
|
+
* - Gender: Giới tính (All, Male, Female)
|
|
16
|
+
* - Cities: Tỉnh thành cụ thể (63 tỉnh thành Việt Nam)
|
|
17
|
+
* - Locations: Miền (Bắc, Trung, Nam)
|
|
18
|
+
* - Platform: Hệ điều hành (iOS, Android, Windows Phone)
|
|
19
|
+
*
|
|
20
|
+
* 3. GIỚI HẠN:
|
|
21
|
+
* - Chỉ gửi được article attachment
|
|
22
|
+
* - Cần có quyền broadcast từ Zalo
|
|
23
|
+
* - Tuân thủ chính sách spam và nội dung
|
|
24
|
+
*
|
|
25
|
+
* LỖI THƯỜNG GẶP:
|
|
26
|
+
* - 3001: Không có quyền gửi broadcast
|
|
27
|
+
* - 3002: Article attachment không tồn tại
|
|
28
|
+
* - 3003: Targeting criteria không hợp lệ
|
|
29
|
+
* - 3004: Vượt quá giới hạn broadcast
|
|
30
|
+
* - 3005: Nội dung vi phạm chính sách
|
|
31
|
+
*/
|
|
32
|
+
import { ZaloClient } from '../clients/zalo-client';
|
|
33
|
+
import { BroadcastResponse, BroadcastTarget, BroadcastRecipient, BROADCAST_CITY_CODES, BROADCAST_AGE_CODES, BROADCAST_GENDER_CODES, BROADCAST_LOCATION_CODES, BROADCAST_PLATFORM_CODES } from '../types/broadcast';
|
|
34
|
+
export declare class BroadcastService {
|
|
35
|
+
private readonly client;
|
|
36
|
+
private readonly broadcastApiUrl;
|
|
37
|
+
constructor(client: ZaloClient);
|
|
38
|
+
/**
|
|
39
|
+
* Gửi tin nhắn broadcast đến nhiều người dùng
|
|
40
|
+
* @param accessToken Access token của Official Account
|
|
41
|
+
* @param recipient Thông tin targeting người nhận
|
|
42
|
+
* @param attachmentId ID của article attachment
|
|
43
|
+
* @returns Thông tin tin nhắn broadcast đã gửi
|
|
44
|
+
*/
|
|
45
|
+
sendBroadcastMessage(accessToken: string, recipient: BroadcastRecipient, attachmentId: string): Promise<BroadcastResponse>;
|
|
46
|
+
/**
|
|
47
|
+
* Tạo broadcast target với các tiêu chí targeting
|
|
48
|
+
* @param criteria Các tiêu chí targeting
|
|
49
|
+
* @returns BroadcastTarget object
|
|
50
|
+
*/
|
|
51
|
+
createBroadcastTarget(criteria: {
|
|
52
|
+
ages?: string[];
|
|
53
|
+
gender?: "ALL" | "MALE" | "FEMALE";
|
|
54
|
+
cities?: string[];
|
|
55
|
+
locations?: ("NORTH" | "CENTRAL" | "SOUTH")[];
|
|
56
|
+
platforms?: ("IOS" | "ANDROID" | "WINDOWS_PHONE")[];
|
|
57
|
+
}): BroadcastTarget;
|
|
58
|
+
/**
|
|
59
|
+
* Validate broadcast request parameters
|
|
60
|
+
* @param recipient Broadcast recipient
|
|
61
|
+
* @param attachmentId Article attachment ID
|
|
62
|
+
*/
|
|
63
|
+
private validateBroadcastRequest;
|
|
64
|
+
/**
|
|
65
|
+
* Get available city codes for targeting
|
|
66
|
+
* @returns Object mapping city names to codes
|
|
67
|
+
*/
|
|
68
|
+
getCityCodes(): typeof BROADCAST_CITY_CODES;
|
|
69
|
+
/**
|
|
70
|
+
* Get available age group codes for targeting
|
|
71
|
+
* @returns Object mapping age groups to codes
|
|
72
|
+
*/
|
|
73
|
+
getAgeGroupCodes(): typeof BROADCAST_AGE_CODES;
|
|
74
|
+
/**
|
|
75
|
+
* Get available gender codes for targeting
|
|
76
|
+
* @returns Object mapping genders to codes
|
|
77
|
+
*/
|
|
78
|
+
getGenderCodes(): typeof BROADCAST_GENDER_CODES;
|
|
79
|
+
/**
|
|
80
|
+
* Get available location codes for targeting
|
|
81
|
+
* @returns Object mapping locations to codes
|
|
82
|
+
*/
|
|
83
|
+
getLocationCodes(): typeof BROADCAST_LOCATION_CODES;
|
|
84
|
+
/**
|
|
85
|
+
* Get available platform codes for targeting
|
|
86
|
+
* @returns Object mapping platforms to codes
|
|
87
|
+
*/
|
|
88
|
+
getPlatformCodes(): typeof BROADCAST_PLATFORM_CODES;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=broadcast.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcast.service.d.ts","sourceRoot":"","sources":["../../src/services/broadcast.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAEL,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAGlB,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,EACzB,MAAM,oBAAoB,CAAC;AAE5B,qBAAa,gBAAgB;IAIf,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA6C;gBAEhD,MAAM,EAAE,UAAU;IAE/C;;;;;;OAMG;IACU,oBAAoB,CAC/B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,kBAAkB,EAC7B,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,iBAAiB,CAAC;IA2D7B;;;;OAIG;IACI,qBAAqB,CAAC,QAAQ,EAAE;QACrC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;QACnC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,SAAS,CAAC,EAAE,CAAC,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;QAC9C,SAAS,CAAC,EAAE,CAAC,KAAK,GAAG,SAAS,GAAG,eAAe,CAAC,EAAE,CAAC;KACrD,GAAG,eAAe;IA+DnB;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IA2BhC;;;OAGG;IACI,YAAY,IAAI,OAAO,oBAAoB;IAIlD;;;OAGG;IACI,gBAAgB,IAAI,OAAO,mBAAmB;IAIrD;;;OAGG;IACI,cAAc,IAAI,OAAO,sBAAsB;IAItD;;;OAGG;IACI,gBAAgB,IAAI,OAAO,wBAAwB;IAI1D;;;OAGG;IACI,gBAAgB,IAAI,OAAO,wBAAwB;CAG3D"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Broadcast Service for Zalo Official Account
|
|
4
|
+
*
|
|
5
|
+
* Gửi tin Truyền thông Broadcast đến nhiều người dùng dựa trên tiêu chí targeting
|
|
6
|
+
* API: https://openapi.zalo.me/v2.0/oa/message
|
|
7
|
+
*
|
|
8
|
+
* TÍNH NĂNG:
|
|
9
|
+
* 1. GỬI TIN BROADCAST:
|
|
10
|
+
* - Gửi tin nhắn đến nhiều người dùng cùng lúc
|
|
11
|
+
* - Targeting theo tuổi, giới tính, địa điểm, platform
|
|
12
|
+
* - Chỉ hỗ trợ template type "media" với article attachment
|
|
13
|
+
*
|
|
14
|
+
* 2. TARGETING CRITERIA:
|
|
15
|
+
* - Ages: Nhóm tuổi (0-12, 13-17, 18-24, 25-34, 35-44, 45-54, 55-64, 65+)
|
|
16
|
+
* - Gender: Giới tính (All, Male, Female)
|
|
17
|
+
* - Cities: Tỉnh thành cụ thể (63 tỉnh thành Việt Nam)
|
|
18
|
+
* - Locations: Miền (Bắc, Trung, Nam)
|
|
19
|
+
* - Platform: Hệ điều hành (iOS, Android, Windows Phone)
|
|
20
|
+
*
|
|
21
|
+
* 3. GIỚI HẠN:
|
|
22
|
+
* - Chỉ gửi được article attachment
|
|
23
|
+
* - Cần có quyền broadcast từ Zalo
|
|
24
|
+
* - Tuân thủ chính sách spam và nội dung
|
|
25
|
+
*
|
|
26
|
+
* LỖI THƯỜNG GẶP:
|
|
27
|
+
* - 3001: Không có quyền gửi broadcast
|
|
28
|
+
* - 3002: Article attachment không tồn tại
|
|
29
|
+
* - 3003: Targeting criteria không hợp lệ
|
|
30
|
+
* - 3004: Vượt quá giới hạn broadcast
|
|
31
|
+
* - 3005: Nội dung vi phạm chính sách
|
|
32
|
+
*/
|
|
33
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
|
+
exports.BroadcastService = void 0;
|
|
35
|
+
const common_1 = require("../types/common");
|
|
36
|
+
const broadcast_1 = require("../types/broadcast");
|
|
37
|
+
class BroadcastService {
|
|
38
|
+
constructor(client) {
|
|
39
|
+
this.client = client;
|
|
40
|
+
// Zalo API endpoint for broadcast messages
|
|
41
|
+
this.broadcastApiUrl = "https://openapi.zalo.me/v2.0/oa/message";
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Gửi tin nhắn broadcast đến nhiều người dùng
|
|
45
|
+
* @param accessToken Access token của Official Account
|
|
46
|
+
* @param recipient Thông tin targeting người nhận
|
|
47
|
+
* @param attachmentId ID của article attachment
|
|
48
|
+
* @returns Thông tin tin nhắn broadcast đã gửi
|
|
49
|
+
*/
|
|
50
|
+
async sendBroadcastMessage(accessToken, recipient, attachmentId) {
|
|
51
|
+
try {
|
|
52
|
+
// Validate input parameters
|
|
53
|
+
this.validateBroadcastRequest(recipient, attachmentId);
|
|
54
|
+
// Build broadcast message
|
|
55
|
+
const message = {
|
|
56
|
+
attachment: {
|
|
57
|
+
type: "template",
|
|
58
|
+
payload: {
|
|
59
|
+
template_type: "media",
|
|
60
|
+
elements: [
|
|
61
|
+
{
|
|
62
|
+
media_type: "article",
|
|
63
|
+
attachment_id: attachmentId
|
|
64
|
+
}
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
// Build request
|
|
70
|
+
const request = {
|
|
71
|
+
recipient,
|
|
72
|
+
message
|
|
73
|
+
};
|
|
74
|
+
// Send broadcast request
|
|
75
|
+
const result = await this.client.apiPost(this.broadcastApiUrl, accessToken, request);
|
|
76
|
+
if (result.error !== 0) {
|
|
77
|
+
throw new common_1.ZaloSDKError(result.message || "Failed to send broadcast message", result.error, result);
|
|
78
|
+
}
|
|
79
|
+
if (!result.data) {
|
|
80
|
+
throw new common_1.ZaloSDKError("No broadcast response data received", -1);
|
|
81
|
+
}
|
|
82
|
+
return result.data;
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
if (error instanceof common_1.ZaloSDKError) {
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
throw new common_1.ZaloSDKError(`Failed to send broadcast message: ${error.message}`, -1, error);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Tạo broadcast target với các tiêu chí targeting
|
|
93
|
+
* @param criteria Các tiêu chí targeting
|
|
94
|
+
* @returns BroadcastTarget object
|
|
95
|
+
*/
|
|
96
|
+
createBroadcastTarget(criteria) {
|
|
97
|
+
const target = {};
|
|
98
|
+
// Convert ages to comma-separated string
|
|
99
|
+
if (criteria.ages && criteria.ages.length > 0) {
|
|
100
|
+
const ageCodes = criteria.ages.map(age => {
|
|
101
|
+
const code = broadcast_1.BROADCAST_AGE_CODES[age];
|
|
102
|
+
if (!code) {
|
|
103
|
+
throw new common_1.ZaloSDKError(`Invalid age group: ${age}`, -1);
|
|
104
|
+
}
|
|
105
|
+
return code;
|
|
106
|
+
});
|
|
107
|
+
target.ages = ageCodes.join(",");
|
|
108
|
+
}
|
|
109
|
+
// Convert gender
|
|
110
|
+
if (criteria.gender) {
|
|
111
|
+
const genderCode = broadcast_1.BROADCAST_GENDER_CODES[criteria.gender];
|
|
112
|
+
if (!genderCode) {
|
|
113
|
+
throw new common_1.ZaloSDKError(`Invalid gender: ${criteria.gender}`, -1);
|
|
114
|
+
}
|
|
115
|
+
target.gender = genderCode;
|
|
116
|
+
}
|
|
117
|
+
// Convert cities to comma-separated string
|
|
118
|
+
if (criteria.cities && criteria.cities.length > 0) {
|
|
119
|
+
const cityCodes = criteria.cities.map(city => {
|
|
120
|
+
const code = broadcast_1.BROADCAST_CITY_CODES[city];
|
|
121
|
+
if (!code) {
|
|
122
|
+
throw new common_1.ZaloSDKError(`Invalid city: ${city}`, -1);
|
|
123
|
+
}
|
|
124
|
+
return code;
|
|
125
|
+
});
|
|
126
|
+
target.cities = cityCodes.join(",");
|
|
127
|
+
}
|
|
128
|
+
// Convert locations to comma-separated string
|
|
129
|
+
if (criteria.locations && criteria.locations.length > 0) {
|
|
130
|
+
const locationCodes = criteria.locations.map(location => {
|
|
131
|
+
const code = broadcast_1.BROADCAST_LOCATION_CODES[location];
|
|
132
|
+
if (!code) {
|
|
133
|
+
throw new common_1.ZaloSDKError(`Invalid location: ${location}`, -1);
|
|
134
|
+
}
|
|
135
|
+
return code;
|
|
136
|
+
});
|
|
137
|
+
target.locations = locationCodes.join(",");
|
|
138
|
+
}
|
|
139
|
+
// Convert platforms to comma-separated string
|
|
140
|
+
if (criteria.platforms && criteria.platforms.length > 0) {
|
|
141
|
+
const platformCodes = criteria.platforms.map(platform => {
|
|
142
|
+
const code = broadcast_1.BROADCAST_PLATFORM_CODES[platform];
|
|
143
|
+
if (!code) {
|
|
144
|
+
throw new common_1.ZaloSDKError(`Invalid platform: ${platform}`, -1);
|
|
145
|
+
}
|
|
146
|
+
return code;
|
|
147
|
+
});
|
|
148
|
+
target.platform = platformCodes.join(",");
|
|
149
|
+
}
|
|
150
|
+
return target;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Validate broadcast request parameters
|
|
154
|
+
* @param recipient Broadcast recipient
|
|
155
|
+
* @param attachmentId Article attachment ID
|
|
156
|
+
*/
|
|
157
|
+
validateBroadcastRequest(recipient, attachmentId) {
|
|
158
|
+
// Validate recipient
|
|
159
|
+
if (!recipient || !recipient.target) {
|
|
160
|
+
throw new common_1.ZaloSDKError("Recipient target is required for broadcast", -1);
|
|
161
|
+
}
|
|
162
|
+
// Validate attachment ID
|
|
163
|
+
if (!attachmentId || attachmentId.trim().length === 0) {
|
|
164
|
+
throw new common_1.ZaloSDKError("Article attachment ID is required", -1);
|
|
165
|
+
}
|
|
166
|
+
// Validate target has at least one criteria
|
|
167
|
+
const target = recipient.target;
|
|
168
|
+
const hasTargeting = target.ages || target.gender || target.cities ||
|
|
169
|
+
target.locations || target.platform;
|
|
170
|
+
if (!hasTargeting) {
|
|
171
|
+
throw new common_1.ZaloSDKError("At least one targeting criteria is required (ages, gender, cities, locations, or platform)", -1);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Get available city codes for targeting
|
|
176
|
+
* @returns Object mapping city names to codes
|
|
177
|
+
*/
|
|
178
|
+
getCityCodes() {
|
|
179
|
+
return broadcast_1.BROADCAST_CITY_CODES;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get available age group codes for targeting
|
|
183
|
+
* @returns Object mapping age groups to codes
|
|
184
|
+
*/
|
|
185
|
+
getAgeGroupCodes() {
|
|
186
|
+
return broadcast_1.BROADCAST_AGE_CODES;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Get available gender codes for targeting
|
|
190
|
+
* @returns Object mapping genders to codes
|
|
191
|
+
*/
|
|
192
|
+
getGenderCodes() {
|
|
193
|
+
return broadcast_1.BROADCAST_GENDER_CODES;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Get available location codes for targeting
|
|
197
|
+
* @returns Object mapping locations to codes
|
|
198
|
+
*/
|
|
199
|
+
getLocationCodes() {
|
|
200
|
+
return broadcast_1.BROADCAST_LOCATION_CODES;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Get available platform codes for targeting
|
|
204
|
+
* @returns Object mapping platforms to codes
|
|
205
|
+
*/
|
|
206
|
+
getPlatformCodes() {
|
|
207
|
+
return broadcast_1.BROADCAST_PLATFORM_CODES;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
exports.BroadcastService = BroadcastService;
|
|
211
|
+
//# sourceMappingURL=broadcast.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcast.service.js","sourceRoot":"","sources":["../../src/services/broadcast.service.ts"],"names":[],"mappings":"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"}
|