@redonvn/zalo-ads-sdk 0.2.7 → 0.2.13
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/dist/index.d.mts +238 -15
- package/dist/index.d.ts +238 -15
- package/dist/index.js +590 -114
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +577 -114
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -618,7 +618,10 @@ var ZaloAuthManager = class {
|
|
|
618
618
|
let adsProfile;
|
|
619
619
|
let formProfile;
|
|
620
620
|
if (domain === "ads.zalo.me") {
|
|
621
|
-
|
|
621
|
+
const explicitPlaySession = this.extraCookies?.PLAY_SESSION || cookies["PLAY_SESSION"];
|
|
622
|
+
if (!explicitPlaySession) {
|
|
623
|
+
await this.followOAuthRedirects("https://ads.zalo.me/api/login", cookies, true);
|
|
624
|
+
}
|
|
622
625
|
const whoamiRes = await this.fetchImpl("https://ads.zalo.me/api/whoami", {
|
|
623
626
|
method: "GET",
|
|
624
627
|
headers: {
|
|
@@ -628,12 +631,17 @@ var ZaloAuthManager = class {
|
|
|
628
631
|
}
|
|
629
632
|
});
|
|
630
633
|
this.mergeSetCookies(whoamiRes, cookies);
|
|
634
|
+
if (explicitPlaySession) {
|
|
635
|
+
cookies["PLAY_SESSION"] = explicitPlaySession;
|
|
636
|
+
}
|
|
631
637
|
const whoamiJson = await whoamiRes.json().catch(() => null);
|
|
632
638
|
if (whoamiJson?.data) {
|
|
633
639
|
adsProfile = whoamiJson.data;
|
|
634
640
|
if (adsProfile.id) {
|
|
635
641
|
cookies["ads_user_id"] = String(adsProfile.id);
|
|
636
642
|
}
|
|
643
|
+
} else if (this.extraCookies?.ads_user_id) {
|
|
644
|
+
cookies["ads_user_id"] = this.extraCookies.ads_user_id;
|
|
637
645
|
}
|
|
638
646
|
} else if (domain === "page.ads.zalo.me") {
|
|
639
647
|
await this.followOAuthRedirects("https://page.ads.zalo.me/api/login", cookies, false);
|
|
@@ -1038,6 +1046,469 @@ async function resolveCookies(auth, context) {
|
|
|
1038
1046
|
return { ...auth?.cookies ?? {}, ...await auth?.getCookies?.(context) ?? {} };
|
|
1039
1047
|
}
|
|
1040
1048
|
|
|
1049
|
+
// src/dtos/ads.dto.ts
|
|
1050
|
+
var ZaloAdsFlowChildMessageDto = class {
|
|
1051
|
+
/** Mẫu Zalo đã xác minh dùng 8 cho tin nhắn văn bản trong nhánh. */
|
|
1052
|
+
type;
|
|
1053
|
+
/** Nội dung phản hồi trong nhánh. */
|
|
1054
|
+
text;
|
|
1055
|
+
};
|
|
1056
|
+
var ZaloAdsFlowButtonDto = class {
|
|
1057
|
+
/** 3 = Gửi tin nhắn vào nhánh hội thoại; 10 = Mở website; 12 = Thực hiện cuộc gọi. */
|
|
1058
|
+
type;
|
|
1059
|
+
/** Nhãn nút hiển thị cho người dùng. */
|
|
1060
|
+
text;
|
|
1061
|
+
/** URL website; bắt buộc với type 10. */
|
|
1062
|
+
url;
|
|
1063
|
+
/** Cờ của nút website; dùng true với type 10. */
|
|
1064
|
+
editable;
|
|
1065
|
+
/** Số hotline, bắt buộc khi type là 12. */
|
|
1066
|
+
phone;
|
|
1067
|
+
/** Nhánh tin nhắn, bắt buộc khi type là 3. Với type 10 hoặc 12, để null hoặc bỏ qua. */
|
|
1068
|
+
messages;
|
|
1069
|
+
};
|
|
1070
|
+
var ZaloAdsFlowMessageDto = class {
|
|
1071
|
+
/** 1 = Tin nhắn văn bản; 2 = Tin nhắn kèm hình ảnh. */
|
|
1072
|
+
type;
|
|
1073
|
+
/** Nội dung tin nhắn, tối đa 1961 ký tự. Hỗ trợ biến: {{user_name}}, {{page_name}}, {{user_gender}}, {{user_id}}, {{page_id}}, {{date}}, {{datetime}}. */
|
|
1074
|
+
text;
|
|
1075
|
+
/** URL media hoặc null với tin nhắn văn bản thuần. Bắt buộc và không được null khi type = 2. */
|
|
1076
|
+
url;
|
|
1077
|
+
/** Các nút đi kèm tin nhắn. */
|
|
1078
|
+
buttons;
|
|
1079
|
+
};
|
|
1080
|
+
var ZaloAdsCreateFlowRequest = class {
|
|
1081
|
+
/** ID Official Account sở hữu kịch bản. */
|
|
1082
|
+
oaId;
|
|
1083
|
+
/** Luôn null khi tạo kịch bản mới. */
|
|
1084
|
+
id;
|
|
1085
|
+
/** Tên kịch bản, tối đa 33 ký tự theo giao diện Zalo Ads. */
|
|
1086
|
+
name;
|
|
1087
|
+
/** Các tin nhắn được gửi theo thứ tự trong kịch bản. */
|
|
1088
|
+
messages;
|
|
1089
|
+
};
|
|
1090
|
+
var ZaloAdsCreateFlowResponse = class {
|
|
1091
|
+
/** 0 khi tạo thành công; 1 khi lỗi (ví dụ: đã tới hạn mức 20 kịch bản). */
|
|
1092
|
+
code;
|
|
1093
|
+
/** Thông báo lỗi từ Zalo Ads khi code khác 0. */
|
|
1094
|
+
msg;
|
|
1095
|
+
/** ID kịch bản mới, truyền vào data.ZaloFlowId khi cập nhật quảng cáo Tin nhắn. */
|
|
1096
|
+
data;
|
|
1097
|
+
};
|
|
1098
|
+
var ZaloAdsActionType = {
|
|
1099
|
+
DAT_NGAY: 1,
|
|
1100
|
+
MUA_NGAY: 2,
|
|
1101
|
+
THU_NGAY: 3,
|
|
1102
|
+
TAI_NGAY: 4,
|
|
1103
|
+
XEM_THEM: 5,
|
|
1104
|
+
QUAN_TAM_OA: 6,
|
|
1105
|
+
NGHE_NGAY: 7,
|
|
1106
|
+
CHOI_NGAY: 8,
|
|
1107
|
+
DANG_KY: 9,
|
|
1108
|
+
GOI_DIEN: 10
|
|
1109
|
+
};
|
|
1110
|
+
var ZaloAdsAgeRangeId = {
|
|
1111
|
+
UNDER_18: 10282,
|
|
1112
|
+
FROM_18_TO_24: 10283,
|
|
1113
|
+
FROM_25_TO_34: 10284,
|
|
1114
|
+
FROM_35_TO_44: 10285,
|
|
1115
|
+
FROM_45_TO_54: 10286,
|
|
1116
|
+
FROM_55_TO_64: 10287,
|
|
1117
|
+
OVER_64: 10288
|
|
1118
|
+
};
|
|
1119
|
+
var ZaloAdsOsId = {
|
|
1120
|
+
ANDROID: 0,
|
|
1121
|
+
IOS: 1,
|
|
1122
|
+
PC: 3
|
|
1123
|
+
};
|
|
1124
|
+
var ZaloAdsDeliveryType = {
|
|
1125
|
+
STANDARD: 1,
|
|
1126
|
+
ACCELERATED: 2
|
|
1127
|
+
};
|
|
1128
|
+
var ZaloAdsUpdateVideoAdRequest = class {
|
|
1129
|
+
data;
|
|
1130
|
+
est;
|
|
1131
|
+
isBoostAd;
|
|
1132
|
+
stt;
|
|
1133
|
+
};
|
|
1134
|
+
var ZaloAdsUpdateVideoAdResponse = class {
|
|
1135
|
+
code;
|
|
1136
|
+
msg;
|
|
1137
|
+
data;
|
|
1138
|
+
};
|
|
1139
|
+
var ZaloAdsCreatePostCampaignRequest = class {
|
|
1140
|
+
/** Cấu hình chiến dịch Bài viết (object hoặc chuỗi JSON). */
|
|
1141
|
+
data;
|
|
1142
|
+
};
|
|
1143
|
+
var ZaloAdsCreatePostCampaignResponse = class {
|
|
1144
|
+
code;
|
|
1145
|
+
/** Chuỗi ID quảng cáo mới trong response Zalo Ads. */
|
|
1146
|
+
msg;
|
|
1147
|
+
data;
|
|
1148
|
+
};
|
|
1149
|
+
var ZaloAdsMessageAdUpdateDataDto = class {
|
|
1150
|
+
AdId;
|
|
1151
|
+
CampaignId;
|
|
1152
|
+
MemberId;
|
|
1153
|
+
/** Phiên bản lạc quan lấy từ bản quảng cáo hiện tại. */
|
|
1154
|
+
RowVersion;
|
|
1155
|
+
AdName;
|
|
1156
|
+
/** 20 (hoặc 19) là quảng cáo Tin nhắn. */
|
|
1157
|
+
Type;
|
|
1158
|
+
Settings;
|
|
1159
|
+
Status;
|
|
1160
|
+
StartDate;
|
|
1161
|
+
EndDate;
|
|
1162
|
+
/** ID kịch bản, lấy từ createFlow hoặc listFlowsByOfficialAccount. */
|
|
1163
|
+
ZaloFlowId;
|
|
1164
|
+
ZaloPageId;
|
|
1165
|
+
ZaloFormId;
|
|
1166
|
+
ConversionId;
|
|
1167
|
+
Report;
|
|
1168
|
+
};
|
|
1169
|
+
var ZaloAdsUpdateMessageAdRequest = class {
|
|
1170
|
+
/** Payload quảng cáo đầy đủ (object hoặc chuỗi JSON); service tự tuần tự hóa thành field form data. */
|
|
1171
|
+
data;
|
|
1172
|
+
/** Tham số UI phụ trợ; capture Zalo Ads có giá trị literal "undefined". */
|
|
1173
|
+
est;
|
|
1174
|
+
/** 0 là quảng cáo thông thường, 1 là boost ad. */
|
|
1175
|
+
isBoostAd;
|
|
1176
|
+
/** Trạng thái thao tác của giao diện; mẫu đã ghi nhận 0. */
|
|
1177
|
+
stt;
|
|
1178
|
+
};
|
|
1179
|
+
var ZaloAdsUpdateMessageAdResponse = class {
|
|
1180
|
+
msg;
|
|
1181
|
+
code;
|
|
1182
|
+
data;
|
|
1183
|
+
};
|
|
1184
|
+
|
|
1185
|
+
// src/validators/campaigns.validator.ts
|
|
1186
|
+
var VALID_CAMPAIGN_TYPES = {
|
|
1187
|
+
WEBSITE: 6,
|
|
1188
|
+
FORM: 17,
|
|
1189
|
+
MESSAGE: 18,
|
|
1190
|
+
OA: 3,
|
|
1191
|
+
VIDEO: 14,
|
|
1192
|
+
COMMERCE: 22,
|
|
1193
|
+
ARTICLE: 4,
|
|
1194
|
+
DISPLAY: 20
|
|
1195
|
+
};
|
|
1196
|
+
var VALID_AD_TYPES = {
|
|
1197
|
+
WEBSITE: 5,
|
|
1198
|
+
FORM: 18,
|
|
1199
|
+
MESSAGE: 30,
|
|
1200
|
+
OA: 2,
|
|
1201
|
+
VIDEO: 11,
|
|
1202
|
+
COMMERCE: 28,
|
|
1203
|
+
// Server trả về 28 (không phải 23)
|
|
1204
|
+
ARTICLE: 3,
|
|
1205
|
+
DISPLAY: 21
|
|
1206
|
+
};
|
|
1207
|
+
var ALLOWED_CTAS_PER_AD_TYPE = {
|
|
1208
|
+
// Website (Type 5): 9 CTAs
|
|
1209
|
+
[VALID_AD_TYPES.WEBSITE]: [
|
|
1210
|
+
ZaloAdsActionType.DAT_NGAY,
|
|
1211
|
+
ZaloAdsActionType.MUA_NGAY,
|
|
1212
|
+
ZaloAdsActionType.THU_NGAY,
|
|
1213
|
+
ZaloAdsActionType.TAI_NGAY,
|
|
1214
|
+
ZaloAdsActionType.XEM_THEM,
|
|
1215
|
+
ZaloAdsActionType.NGHE_NGAY,
|
|
1216
|
+
ZaloAdsActionType.CHOI_NGAY,
|
|
1217
|
+
ZaloAdsActionType.DANG_KY,
|
|
1218
|
+
ZaloAdsActionType.GOI_DIEN
|
|
1219
|
+
],
|
|
1220
|
+
// Video (Type 11): 8 CTAs
|
|
1221
|
+
[VALID_AD_TYPES.VIDEO]: [
|
|
1222
|
+
ZaloAdsActionType.DAT_NGAY,
|
|
1223
|
+
ZaloAdsActionType.MUA_NGAY,
|
|
1224
|
+
ZaloAdsActionType.THU_NGAY,
|
|
1225
|
+
ZaloAdsActionType.TAI_NGAY,
|
|
1226
|
+
ZaloAdsActionType.XEM_THEM,
|
|
1227
|
+
ZaloAdsActionType.NGHE_NGAY,
|
|
1228
|
+
ZaloAdsActionType.CHOI_NGAY,
|
|
1229
|
+
ZaloAdsActionType.DANG_KY
|
|
1230
|
+
],
|
|
1231
|
+
// Article (Type 3): 7 CTAs
|
|
1232
|
+
[VALID_AD_TYPES.ARTICLE]: [
|
|
1233
|
+
ZaloAdsActionType.DAT_NGAY,
|
|
1234
|
+
ZaloAdsActionType.MUA_NGAY,
|
|
1235
|
+
ZaloAdsActionType.THU_NGAY,
|
|
1236
|
+
ZaloAdsActionType.TAI_NGAY,
|
|
1237
|
+
ZaloAdsActionType.XEM_THEM,
|
|
1238
|
+
ZaloAdsActionType.CHOI_NGAY,
|
|
1239
|
+
ZaloAdsActionType.DANG_KY
|
|
1240
|
+
],
|
|
1241
|
+
// Form (Type 18): 5 CTAs
|
|
1242
|
+
[VALID_AD_TYPES.FORM]: [
|
|
1243
|
+
ZaloAdsActionType.DAT_NGAY,
|
|
1244
|
+
ZaloAdsActionType.MUA_NGAY,
|
|
1245
|
+
ZaloAdsActionType.THU_NGAY,
|
|
1246
|
+
ZaloAdsActionType.XEM_THEM,
|
|
1247
|
+
ZaloAdsActionType.DANG_KY
|
|
1248
|
+
],
|
|
1249
|
+
// Commerce (Type 28): 3 CTAs
|
|
1250
|
+
[VALID_AD_TYPES.COMMERCE]: [
|
|
1251
|
+
ZaloAdsActionType.DAT_NGAY,
|
|
1252
|
+
ZaloAdsActionType.MUA_NGAY,
|
|
1253
|
+
ZaloAdsActionType.XEM_THEM
|
|
1254
|
+
],
|
|
1255
|
+
// OA (Type 2): Cố định Quan tâm OA (6)
|
|
1256
|
+
[VALID_AD_TYPES.OA]: [ZaloAdsActionType.QUAN_TAM_OA]
|
|
1257
|
+
};
|
|
1258
|
+
function validateCreateCampaignPayload(payload, options = {}) {
|
|
1259
|
+
const errors = [];
|
|
1260
|
+
const warnings = [];
|
|
1261
|
+
if (!payload.name || typeof payload.name !== "string" || !payload.name.trim()) {
|
|
1262
|
+
errors.push("name l\xE0 b\u1EAFt bu\u1ED9c v\xE0 kh\xF4ng \u0111\u01B0\u1EE3c \u0111\u1EC3 tr\u1ED1ng.");
|
|
1263
|
+
} else if (payload.name.length > 255) {
|
|
1264
|
+
errors.push("name kh\xF4ng \u0111\u01B0\u1EE3c v\u01B0\u1EE3t qu\xE1 255 k\xFD t\u1EF1.");
|
|
1265
|
+
}
|
|
1266
|
+
const validTypes = Object.values(VALID_CAMPAIGN_TYPES);
|
|
1267
|
+
if (payload.campaignType === void 0 || payload.campaignType === null) {
|
|
1268
|
+
errors.push("campaignType l\xE0 b\u1EAFt bu\u1ED9c.");
|
|
1269
|
+
} else if (!validTypes.includes(payload.campaignType)) {
|
|
1270
|
+
errors.push(
|
|
1271
|
+
`campaignType: ${payload.campaignType} kh\xF4ng h\u1EE3p l\u1EC7. C\xE1c lo\u1EA1i h\u1ED7 tr\u1EE3: 6 (Website), 17 (Form), 18 (Message), 3 (OA), 14 (Video), 22 (Commerce), 4 (Article), 20 (Display).`
|
|
1272
|
+
);
|
|
1273
|
+
}
|
|
1274
|
+
if (payload.campaignType !== VALID_CAMPAIGN_TYPES.DISPLAY) {
|
|
1275
|
+
if (!payload.pageId || payload.pageId <= 0) {
|
|
1276
|
+
errors.push("pageId c\u1EE7a Official Account l\xE0 b\u1EAFt bu\u1ED9c \u0111\u1ED1i v\u1EDBi lo\u1EA1i chi\u1EBFn d\u1ECBch n\xE0y (ph\u1EA3i > 0).");
|
|
1277
|
+
}
|
|
1278
|
+
} else {
|
|
1279
|
+
if (payload.pageId !== -1 && payload.pageId !== 0 && !payload.pageId) {
|
|
1280
|
+
warnings.push("Qu\u1EA3ng c\xE1o Display th\u01B0\u1EDDng s\u1EED d\u1EE5ng pageId = -1.");
|
|
1281
|
+
}
|
|
1282
|
+
}
|
|
1283
|
+
switch (payload.campaignType) {
|
|
1284
|
+
case VALID_CAMPAIGN_TYPES.WEBSITE:
|
|
1285
|
+
if (!payload.targetUrl || typeof payload.targetUrl !== "string" || !payload.targetUrl.trim()) {
|
|
1286
|
+
errors.push("targetUrl l\xE0 b\u1EAFt bu\u1ED9c \u0111\u1ED1i v\u1EDBi Qu\u1EA3ng c\xE1o Website.");
|
|
1287
|
+
} else if (!/^https?:\/\/.+/i.test(payload.targetUrl)) {
|
|
1288
|
+
errors.push("targetUrl ph\u1EA3i l\xE0 m\u1ED9t \u0111\u01B0\u1EDDng link h\u1EE3p l\u1EC7 b\u1EAFt \u0111\u1EA7u b\u1EB1ng http:// ho\u1EB7c https://.");
|
|
1289
|
+
}
|
|
1290
|
+
break;
|
|
1291
|
+
case VALID_CAMPAIGN_TYPES.ARTICLE:
|
|
1292
|
+
if (!payload.articleId || payload.articleId <= 0) {
|
|
1293
|
+
errors.push("articleId l\xE0 b\u1EAFt bu\u1ED9c \u0111\u1ED1i v\u1EDBi Qu\u1EA3ng c\xE1o B\xE0i Vi\u1EBFt (ph\u1EA3i > 0, l\u1EA5y t\u1EEB getOwnedArticles).");
|
|
1294
|
+
}
|
|
1295
|
+
break;
|
|
1296
|
+
case VALID_CAMPAIGN_TYPES.COMMERCE:
|
|
1297
|
+
if (payload.productId === void 0 || payload.productId === null) {
|
|
1298
|
+
warnings.push("Qu\u1EA3ng c\xE1o Commerce n\xEAn ch\u1EC9 \u0111\u1ECBnh productId (ho\u1EB7c -1/0 khi d\xF9ng Instant Page s\u1EA3n ph\u1EA9m).");
|
|
1299
|
+
}
|
|
1300
|
+
break;
|
|
1301
|
+
case VALID_CAMPAIGN_TYPES.FORM:
|
|
1302
|
+
case VALID_CAMPAIGN_TYPES.MESSAGE:
|
|
1303
|
+
break;
|
|
1304
|
+
}
|
|
1305
|
+
if (payload.budgetType !== void 0 && payload.budgetlimit !== void 0) {
|
|
1306
|
+
if (payload.budgetType === 2) {
|
|
1307
|
+
if (payload.budgetlimit > 0 && payload.budgetlimit < 6e5) {
|
|
1308
|
+
errors.push("Ng\xE2n s\xE1ch cho To\xE0n l\u1ECBch ch\u1EA1y t\u1ED1i thi\u1EC3u l\xE0 600,000 VN\u0110.");
|
|
1309
|
+
}
|
|
1310
|
+
} else if (payload.budgetType === 1) {
|
|
1311
|
+
if (payload.budgetlimit > 0 && payload.budgetlimit < 50) {
|
|
1312
|
+
warnings.push("S\u1ED1 l\u01B0\u1EE3ng t\u01B0\u01A1ng t\xE1c m\u1ED7i ng\xE0y t\u1ED1i thi\u1EC3u \u0111\u01B0\u1EE3c khuy\u1EBFn ngh\u1ECB t\u1EEB 50 l\u01B0\u1EE3t.");
|
|
1313
|
+
}
|
|
1314
|
+
}
|
|
1315
|
+
}
|
|
1316
|
+
if (payload.campaignId && payload.campaignId > 0) {
|
|
1317
|
+
if (payload.adId !== 0) {
|
|
1318
|
+
warnings.push("Khi th\xEAm Ad m\u1EDBi v\xE0o chi\u1EBFn d\u1ECBch hi\u1EC7n c\xF3 (Multi-Ad), adId n\xEAn \u0111\u1EC3 b\u1EB1ng 0.");
|
|
1319
|
+
}
|
|
1320
|
+
}
|
|
1321
|
+
return {
|
|
1322
|
+
isValid: errors.length === 0,
|
|
1323
|
+
errors,
|
|
1324
|
+
warnings
|
|
1325
|
+
};
|
|
1326
|
+
}
|
|
1327
|
+
function validateUpdateAdPayload(payload, options = {}) {
|
|
1328
|
+
const errors = [];
|
|
1329
|
+
const warnings = [];
|
|
1330
|
+
if (!payload.AdId || payload.AdId <= 0) {
|
|
1331
|
+
errors.push("AdId l\xE0 b\u1EAFt bu\u1ED9c (ph\u1EA3i > 0).");
|
|
1332
|
+
}
|
|
1333
|
+
if (!payload.CampaignId || payload.CampaignId <= 0) {
|
|
1334
|
+
errors.push("CampaignId l\xE0 b\u1EAFt bu\u1ED9c (ph\u1EA3i > 0).");
|
|
1335
|
+
}
|
|
1336
|
+
if (!payload.AdName || !payload.AdName.trim()) {
|
|
1337
|
+
errors.push("AdName l\xE0 b\u1EAFt bu\u1ED9c v\xE0 kh\xF4ng \u0111\u01B0\u1EE3c \u0111\u1EC3 tr\u1ED1ng.");
|
|
1338
|
+
} else if (payload.AdName.length > 255) {
|
|
1339
|
+
errors.push(`AdName qu\xE1 d\xE0i (${payload.AdName.length}/255 k\xFD t\u1EF1).`);
|
|
1340
|
+
}
|
|
1341
|
+
const adInfo = payload.Settings?.AdInfo;
|
|
1342
|
+
if (!adInfo) {
|
|
1343
|
+
errors.push("Settings.AdInfo l\xE0 b\u1EAFt bu\u1ED9c.");
|
|
1344
|
+
} else {
|
|
1345
|
+
if (!adInfo.Caption || !adInfo.Caption.trim()) {
|
|
1346
|
+
errors.push("Settings.AdInfo.Caption l\xE0 b\u1EAFt bu\u1ED9c.");
|
|
1347
|
+
} else {
|
|
1348
|
+
const captionLen = adInfo.Caption.trim().length;
|
|
1349
|
+
if (captionLen < 35) {
|
|
1350
|
+
errors.push(`Settings.AdInfo.Caption qu\xE1 ng\u1EAFn (${captionLen}/35 k\xFD t\u1EF1 t\u1ED1i thi\u1EC3u).`);
|
|
1351
|
+
} else if (captionLen > 90) {
|
|
1352
|
+
errors.push(`Settings.AdInfo.Caption qu\xE1 d\xE0i (${captionLen}/90 k\xFD t\u1EF1 t\u1ED1i \u0111a).`);
|
|
1353
|
+
}
|
|
1354
|
+
}
|
|
1355
|
+
if (adInfo.MoreInfo && adInfo.MoreInfo.trim()) {
|
|
1356
|
+
const moreInfoLen = adInfo.MoreInfo.trim().length;
|
|
1357
|
+
if (moreInfoLen < 90) {
|
|
1358
|
+
warnings.push(`Ch\xFA th\xEDch m\u1EDF r\u1ED9ng n\xEAn \u0111\u1EA1t t\u1ED1i thi\u1EC3u 90 k\xFD t\u1EF1 (hi\u1EC7n t\u1EA1i: ${moreInfoLen}).`);
|
|
1359
|
+
} else if (moreInfoLen > 2e3) {
|
|
1360
|
+
errors.push(`Ch\xFA th\xEDch m\u1EDF r\u1ED9ng v\u01B0\u1EE3t qu\xE1 gi\u1EDBi h\u1EA1n t\u1ED1i \u0111a 2000 k\xFD t\u1EF1 (hi\u1EC7n t\u1EA1i: ${moreInfoLen}).`);
|
|
1361
|
+
}
|
|
1362
|
+
}
|
|
1363
|
+
if (adInfo.Action !== void 0 && payload.Type) {
|
|
1364
|
+
const allowedCtas = ALLOWED_CTAS_PER_AD_TYPE[payload.Type];
|
|
1365
|
+
if (allowedCtas && !allowedCtas.includes(adInfo.Action)) {
|
|
1366
|
+
warnings.push(
|
|
1367
|
+
`M\xE3 h\xE0nh \u0111\u1ED9ng Action: ${adInfo.Action} c\xF3 th\u1EC3 kh\xF4ng n\u1EB1m trong danh m\u1EE5c n\xFAt CTA h\u1ED7 tr\u1EE3 cho Ad Type ${payload.Type}.`
|
|
1368
|
+
);
|
|
1369
|
+
}
|
|
1370
|
+
}
|
|
1371
|
+
}
|
|
1372
|
+
const price = payload.Settings?.Price;
|
|
1373
|
+
if (!price) {
|
|
1374
|
+
errors.push("Settings.Price l\xE0 b\u1EAFt bu\u1ED9c.");
|
|
1375
|
+
} else {
|
|
1376
|
+
if (payload.Type === VALID_AD_TYPES.WEBSITE) {
|
|
1377
|
+
if (price.Type !== 1) {
|
|
1378
|
+
errors.push(
|
|
1379
|
+
"\u0110\u1ED1i v\u1EDBi Qu\u1EA3ng c\xE1o Website (Type 5), Price.Type b\u1EAFt bu\u1ED9c ph\u1EA3i b\u1EB1ng 1 (CPC). N\u1EBFu truy\u1EC1n 2 s\u1EBD b\u1ECB m\xE1y ch\u1EE7 l\u1ED7i."
|
|
1380
|
+
);
|
|
1381
|
+
}
|
|
1382
|
+
if (price.LimitType === 1) {
|
|
1383
|
+
errors.push(
|
|
1384
|
+
"Qu\u1EA3ng c\xE1o Website kh\xF4ng h\u1ED7 tr\u1EE3 LimitType: 1 (t\u1ED5ng ng\xE2n s\xE1ch). B\u1EAFt bu\u1ED9c ph\u1EA3i d\xF9ng LimitType: 0 (ng\xE2n s\xE1ch ng\xE0y)."
|
|
1385
|
+
);
|
|
1386
|
+
}
|
|
1387
|
+
} else if (payload.Type === VALID_AD_TYPES.COMMERCE || payload.Type === VALID_AD_TYPES.OA || payload.Type === VALID_AD_TYPES.ARTICLE || payload.Type === VALID_AD_TYPES.VIDEO || payload.Type === VALID_AD_TYPES.FORM || payload.Type === VALID_AD_TYPES.MESSAGE) {
|
|
1388
|
+
if (price.Type !== 2) {
|
|
1389
|
+
errors.push(
|
|
1390
|
+
`\u0110\u1ED1i v\u1EDBi Ad Type ${payload.Type}, Price.Type b\u1EAFt bu\u1ED9c ph\u1EA3i b\u1EB1ng 2. N\u1EBFu truy\u1EC1n 1, Zalo Ads s\u1EBD b\xE1o l\u1ED7i code 14 (\u0110\u1EB7t gi\xE1 theo L\u01B0\u1EE3t hi\u1EC3n th\u1ECB kh\xF4ng h\u1ED7 tr\u1EE3).`
|
|
1391
|
+
);
|
|
1392
|
+
}
|
|
1393
|
+
}
|
|
1394
|
+
if (price.Limit !== void 0 && price.Limit > 0 && price.Limit < 50) {
|
|
1395
|
+
warnings.push("S\u1ED1 l\u01B0\u1EE3ng l\u01B0\u1EE3t t\u01B0\u01A1ng t\xE1c \u0111\u1EB7t m\u1ED7i ng\xE0y t\u1ED1i thi\u1EC3u l\xE0 50 l\u01B0\u1EE3t.");
|
|
1396
|
+
}
|
|
1397
|
+
}
|
|
1398
|
+
const targeting = payload.Settings?.Targeting;
|
|
1399
|
+
if (targeting) {
|
|
1400
|
+
if (targeting.AgeRanges && targeting.AgeRanges.length > 0) {
|
|
1401
|
+
const validAges = Object.values(ZaloAdsAgeRangeId);
|
|
1402
|
+
const invalidAges = targeting.AgeRanges.filter((a) => !validAges.includes(a));
|
|
1403
|
+
if (invalidAges.length > 0) {
|
|
1404
|
+
errors.push(`M\xE3 kho\u1EA3ng tu\u1ED5i kh\xF4ng h\u1EE3p l\u1EC7: ${invalidAges.join(", ")}. H\u1EE3p l\u1EC7: ${validAges.join(", ")}.`);
|
|
1405
|
+
}
|
|
1406
|
+
}
|
|
1407
|
+
if (targeting.OsTypes && targeting.OsTypes.length > 0) {
|
|
1408
|
+
const validOs = Object.values(ZaloAdsOsId);
|
|
1409
|
+
const invalidOs = targeting.OsTypes.filter((os) => !validOs.includes(os));
|
|
1410
|
+
if (invalidOs.length > 0) {
|
|
1411
|
+
errors.push(`M\xE3 h\u1EC7 \u0111i\u1EC1u h\xE0nh kh\xF4ng h\u1EE3p l\u1EC7: ${invalidOs.join(", ")}. H\u1EE3p l\u1EC7: 0 (Android), 1 (iOS), 3 (PC).`);
|
|
1412
|
+
}
|
|
1413
|
+
}
|
|
1414
|
+
const deliveryType = payload.Settings?.DeliveryType;
|
|
1415
|
+
if (deliveryType !== void 0 && deliveryType !== 1 && deliveryType !== 2) {
|
|
1416
|
+
warnings.push("DeliveryType n\xEAn l\xE0 1 (Ti\xEAu chu\u1EA9n) ho\u1EB7c 2 (T\u0103ng t\u1ED1c).");
|
|
1417
|
+
}
|
|
1418
|
+
}
|
|
1419
|
+
if (payload.Type === VALID_AD_TYPES.FORM) {
|
|
1420
|
+
if (!payload.ZaloFormId || !payload.ZaloFormId.trim()) {
|
|
1421
|
+
errors.push("ZaloFormId l\xE0 b\u1EAFt bu\u1ED9c \u0111\u1ED1i v\u1EDBi Qu\u1EA3ng c\xE1o Form (Ad Type 18).");
|
|
1422
|
+
}
|
|
1423
|
+
} else if (payload.Type === VALID_AD_TYPES.MESSAGE) {
|
|
1424
|
+
if (!payload.Settings?.Image?.LogoUrl) {
|
|
1425
|
+
errors.push("Settings.Image.LogoUrl l\xE0 b\u1EAFt bu\u1ED9c \u0111\u1ED1i v\u1EDBi Qu\u1EA3ng c\xE1o Tin Nh\u1EAFn (Ad Type 30).");
|
|
1426
|
+
}
|
|
1427
|
+
if (!payload.ZaloFlowId && !payload.MiniPageId) {
|
|
1428
|
+
warnings.push("Qu\u1EA3ng c\xE1o Tin Nh\u1EAFn n\xEAn g\u1EAFn ZaloFlowId ho\u1EB7c MiniPageId (Template 4 k\u1ECBch b\u1EA3n tin nh\u1EAFn).");
|
|
1429
|
+
}
|
|
1430
|
+
} else if (payload.Type === VALID_AD_TYPES.COMMERCE) {
|
|
1431
|
+
if (!payload.MiniPageId || payload.MiniPageId <= 0) {
|
|
1432
|
+
errors.push("MiniPageId l\xE0 b\u1EAFt bu\u1ED9c \u0111\u1ED1i v\u1EDBi Qu\u1EA3ng c\xE1o Commerce (Ad Type 28, Template 1/2/3).");
|
|
1433
|
+
}
|
|
1434
|
+
} else if (payload.Type === VALID_AD_TYPES.VIDEO) {
|
|
1435
|
+
if (!payload.ZaloVideoId && !payload.Settings?.Image?.VideoUrl) {
|
|
1436
|
+
errors.push("ZaloVideoId ho\u1EB7c Settings.Image.VideoUrl l\xE0 b\u1EAFt bu\u1ED9c \u0111\u1ED1i v\u1EDBi Qu\u1EA3ng c\xE1o Video (Ad Type 11).");
|
|
1437
|
+
}
|
|
1438
|
+
if (payload.Settings?.Image?.VideoUrl && !payload.Settings.Image.VideoUrl.includes("zascdn.me")) {
|
|
1439
|
+
warnings.push("VideoUrl n\xEAn l\xE0 \u0111\u01B0\u1EDDng d\u1EABn CDN ch\xEDnh th\u1EE9c c\u1EE7a Zalo Ads (*.zascdn.me).");
|
|
1440
|
+
}
|
|
1441
|
+
} else if (payload.Type === VALID_AD_TYPES.ARTICLE) {
|
|
1442
|
+
if (!payload.ZaloFeedId && !payload.articleId) {
|
|
1443
|
+
errors.push("ZaloFeedId ho\u1EB7c articleId l\xE0 b\u1EAFt bu\u1ED9c \u0111\u1ED1i v\u1EDBi Qu\u1EA3ng c\xE1o B\xE0i Vi\u1EBFt (Ad Type 3).");
|
|
1444
|
+
}
|
|
1445
|
+
}
|
|
1446
|
+
return {
|
|
1447
|
+
isValid: errors.length === 0,
|
|
1448
|
+
errors,
|
|
1449
|
+
warnings
|
|
1450
|
+
};
|
|
1451
|
+
}
|
|
1452
|
+
function validateRenameCampaignParams(params) {
|
|
1453
|
+
const errors = [];
|
|
1454
|
+
const warnings = [];
|
|
1455
|
+
const id = params.campid || params.campaignId;
|
|
1456
|
+
const name = params.newname || params.newName || params.name;
|
|
1457
|
+
if (!id || id <= 0) {
|
|
1458
|
+
errors.push("ID chi\u1EBFn d\u1ECBch (campid/campaignId) l\xE0 b\u1EAFt bu\u1ED9c v\xE0 ph\u1EA3i > 0.");
|
|
1459
|
+
}
|
|
1460
|
+
if (!name || !name.trim()) {
|
|
1461
|
+
errors.push("T\xEAn m\u1EDBi c\u1EE7a chi\u1EBFn d\u1ECBch (newname/name) l\xE0 b\u1EAFt bu\u1ED9c v\xE0 kh\xF4ng \u0111\u01B0\u1EE3c \u0111\u1EC3 tr\u1ED1ng.");
|
|
1462
|
+
} else if (name.length > 255) {
|
|
1463
|
+
errors.push(`T\xEAn chi\u1EBFn d\u1ECBch qu\xE1 d\xE0i (${name.length}/255 k\xFD t\u1EF1).`);
|
|
1464
|
+
}
|
|
1465
|
+
return {
|
|
1466
|
+
isValid: errors.length === 0,
|
|
1467
|
+
errors,
|
|
1468
|
+
warnings
|
|
1469
|
+
};
|
|
1470
|
+
}
|
|
1471
|
+
function validateChangeCampaignStatusParams(params) {
|
|
1472
|
+
const errors = [];
|
|
1473
|
+
const warnings = [];
|
|
1474
|
+
if (!params.campaignId || params.campaignId <= 0) {
|
|
1475
|
+
errors.push("campaignId l\xE0 b\u1EAFt bu\u1ED9c v\xE0 ph\u1EA3i > 0.");
|
|
1476
|
+
}
|
|
1477
|
+
if (![1, 2, -2].includes(params.status)) {
|
|
1478
|
+
errors.push(`status: ${params.status} kh\xF4ng h\u1EE3p l\u1EC7. C\xE1c tr\u1EA1ng th\xE1i h\u1EE3p l\u1EC7: 1 (B\u1EADt), 2 (T\u1EA1m d\u1EEBng), -2 (X\xF3a).`);
|
|
1479
|
+
}
|
|
1480
|
+
if (params.status === 2 && params.isDraft) {
|
|
1481
|
+
warnings.push(
|
|
1482
|
+
"Chi\u1EBFn d\u1ECBch nh\xE1p ch\u01B0a c\xF3 qu\u1EA3ng c\xE1o ho\u1EA1t \u0111\u1ED9ng khi g\u1ECDi status: 2 (T\u1EA1m d\u1EEBng) s\u1EBD b\u1ECB m\xE1y ch\u1EE7 n\xE9m l\u1ED7i HTTP 500 Internal Server Error. \u0110\u1EC3 d\u1ECDn d\u1EB9p h\xE3y d\xF9ng status: -2 (X\xF3a)."
|
|
1483
|
+
);
|
|
1484
|
+
}
|
|
1485
|
+
return {
|
|
1486
|
+
isValid: errors.length === 0,
|
|
1487
|
+
errors,
|
|
1488
|
+
warnings
|
|
1489
|
+
};
|
|
1490
|
+
}
|
|
1491
|
+
function validateDuplicateAdParams(params) {
|
|
1492
|
+
const errors = [];
|
|
1493
|
+
const warnings = [];
|
|
1494
|
+
const id = params.adid || params.adId;
|
|
1495
|
+
if (!id || id <= 0) {
|
|
1496
|
+
errors.push("ID m\u1EABu qu\u1EA3ng c\xE1o g\u1ED1c c\u1EA7n nh\xE2n b\u1EA3n (adid/adId) l\xE0 b\u1EAFt bu\u1ED9c v\xE0 ph\u1EA3i > 0.");
|
|
1497
|
+
}
|
|
1498
|
+
return {
|
|
1499
|
+
isValid: errors.length === 0,
|
|
1500
|
+
errors,
|
|
1501
|
+
warnings
|
|
1502
|
+
};
|
|
1503
|
+
}
|
|
1504
|
+
var ZaloCampaignsValidator = {
|
|
1505
|
+
createCampaign: validateCreateCampaignPayload,
|
|
1506
|
+
updateAd: validateUpdateAdPayload,
|
|
1507
|
+
renameCampaign: validateRenameCampaignParams,
|
|
1508
|
+
changeStatus: validateChangeCampaignStatusParams,
|
|
1509
|
+
duplicateAd: validateDuplicateAdParams
|
|
1510
|
+
};
|
|
1511
|
+
|
|
1041
1512
|
// src/services/campaigns.service.ts
|
|
1042
1513
|
var OP_ZaloAdsUpdateVideoAd = {
|
|
1043
1514
|
operationId: "ZaloAds_updateVideoAd",
|
|
@@ -1158,7 +1629,9 @@ var OP_ZaloAdsGetAdById = {
|
|
|
1158
1629
|
"binaryFields": [],
|
|
1159
1630
|
"pathFields": [],
|
|
1160
1631
|
"queryFields": [
|
|
1161
|
-
"adId"
|
|
1632
|
+
"adId",
|
|
1633
|
+
"v",
|
|
1634
|
+
"newWard"
|
|
1162
1635
|
],
|
|
1163
1636
|
"headerFields": [],
|
|
1164
1637
|
"cookieFields": [],
|
|
@@ -1230,7 +1703,9 @@ var OP_ZaloAdsGetZaapiGetadsfromcampaignid = {
|
|
|
1230
1703
|
"pathFields": [],
|
|
1231
1704
|
"queryFields": [
|
|
1232
1705
|
"campaignId",
|
|
1233
|
-
"campId"
|
|
1706
|
+
"campId",
|
|
1707
|
+
"dataType",
|
|
1708
|
+
"v"
|
|
1234
1709
|
],
|
|
1235
1710
|
"headerFields": [],
|
|
1236
1711
|
"cookieFields": [],
|
|
@@ -1531,6 +2006,18 @@ var OP_ZaloAdsDeleteCampaign = {
|
|
|
1531
2006
|
"status"
|
|
1532
2007
|
]
|
|
1533
2008
|
};
|
|
2009
|
+
var OP_ZaloAdsDuplicateAd = {
|
|
2010
|
+
operationId: "zalo_ads_duplicate_ad",
|
|
2011
|
+
method: "POST",
|
|
2012
|
+
endpoint: "/zaapi/DuplicateAd",
|
|
2013
|
+
baseUrl: "https://ads.zalo.me",
|
|
2014
|
+
binaryFields: [],
|
|
2015
|
+
pathFields: [],
|
|
2016
|
+
queryFields: [],
|
|
2017
|
+
headerFields: [],
|
|
2018
|
+
cookieFields: [],
|
|
2019
|
+
bodyFields: ["adid"]
|
|
2020
|
+
};
|
|
1534
2021
|
var OP_ZaloAdsCreateSpellCheckV3Job = {
|
|
1535
2022
|
operationId: "zalo_ads_create_spell_check_v3_job",
|
|
1536
2023
|
method: "POST",
|
|
@@ -1559,6 +2046,8 @@ var ZaloCampaignsService = class {
|
|
|
1559
2046
|
constructor(client) {
|
|
1560
2047
|
this.client = client;
|
|
1561
2048
|
}
|
|
2049
|
+
validator = ZaloCampaignsValidator;
|
|
2050
|
+
static validator = ZaloCampaignsValidator;
|
|
1562
2051
|
updateVideoAd(request, options) {
|
|
1563
2052
|
return this.client.requestFormUrlEncoded(OP_ZaloAdsUpdateVideoAd, this.client.toTransportInput(OP_ZaloAdsUpdateVideoAd, request), options);
|
|
1564
2053
|
}
|
|
@@ -1615,10 +2104,19 @@ var ZaloCampaignsService = class {
|
|
|
1615
2104
|
return this.createPostCampaign(request, options);
|
|
1616
2105
|
}
|
|
1617
2106
|
getAdById(request = {}, options) {
|
|
1618
|
-
|
|
2107
|
+
const normalized = {
|
|
2108
|
+
adId: request.adId,
|
|
2109
|
+
v: request.v ?? 2,
|
|
2110
|
+
newWard: request.newWard ?? true
|
|
2111
|
+
};
|
|
2112
|
+
return this.client.requestWithoutBody(OP_ZaloAdsGetAdById, this.client.toTransportInput(OP_ZaloAdsGetAdById, normalized), options);
|
|
1619
2113
|
}
|
|
1620
2114
|
getAdChangeLog(request, options) {
|
|
1621
|
-
|
|
2115
|
+
const normalized = {
|
|
2116
|
+
adId: request.adId,
|
|
2117
|
+
type: request.type ?? 1
|
|
2118
|
+
};
|
|
2119
|
+
return this.client.requestWithoutBody(OP_ZaloAdsGetAdChangeLog, this.client.toTransportInput(OP_ZaloAdsGetAdChangeLog, normalized), options);
|
|
1622
2120
|
}
|
|
1623
2121
|
getApiPlaceGetalldistricts(request = {}, options) {
|
|
1624
2122
|
return this.client.requestWithoutBody(OP_ZaloAdsGetApiPlaceGetalldistricts, this.client.toTransportInput(OP_ZaloAdsGetApiPlaceGetalldistricts, request), options);
|
|
@@ -1630,7 +2128,16 @@ var ZaloCampaignsService = class {
|
|
|
1630
2128
|
return this.client.requestWithoutBody(OP_ZaloAdsGetZaapiCheckcamphasmanyads, this.client.toTransportInput(OP_ZaloAdsGetZaapiCheckcamphasmanyads, request), options);
|
|
1631
2129
|
}
|
|
1632
2130
|
getZaapiGetadsfromcampaignid(request = {}, options) {
|
|
1633
|
-
|
|
2131
|
+
const normalized = {
|
|
2132
|
+
campaignId: request.campaignId ?? request.campId,
|
|
2133
|
+
dataType: request.dataType ?? 1,
|
|
2134
|
+
v: request.v ?? 2
|
|
2135
|
+
};
|
|
2136
|
+
return this.client.requestWithoutBody(OP_ZaloAdsGetZaapiGetadsfromcampaignid, this.client.toTransportInput(OP_ZaloAdsGetZaapiGetadsfromcampaignid, normalized), options);
|
|
2137
|
+
}
|
|
2138
|
+
/** Alias lấy danh sách quảng cáo của chiến dịch kèm metadata extend và extra.appliedRuleInfo */
|
|
2139
|
+
getAdsFromCampaignId(request = {}, options) {
|
|
2140
|
+
return this.getZaapiGetadsfromcampaignid(request, options);
|
|
1634
2141
|
}
|
|
1635
2142
|
getZaapiGetallpages(request = {}, options) {
|
|
1636
2143
|
return this.client.requestWithoutBody(OP_ZaloAdsGetZaapiGetallpages, this.client.toTransportInput(OP_ZaloAdsGetZaapiGetallpages, request), options);
|
|
@@ -1660,7 +2167,11 @@ var ZaloCampaignsService = class {
|
|
|
1660
2167
|
return this.client.requestWithoutBody(OP_ZaloAdsPostZaapiDeletead, this.client.toTransportInput(OP_ZaloAdsPostZaapiDeletead, request), options);
|
|
1661
2168
|
}
|
|
1662
2169
|
renameCampaign(request, options) {
|
|
1663
|
-
|
|
2170
|
+
const normalized = {
|
|
2171
|
+
campid: request.campid ?? request.campaignId,
|
|
2172
|
+
newname: request.newname ?? request.campaignName ?? request.name
|
|
2173
|
+
};
|
|
2174
|
+
return this.client.requestFormUrlEncoded(OP_ZaloAdsRenameCampaign, this.client.toTransportInput(OP_ZaloAdsRenameCampaign, normalized), options);
|
|
1664
2175
|
}
|
|
1665
2176
|
updateEcommerceAd(request, options) {
|
|
1666
2177
|
return this.client.requestFormUrlEncoded(OP_ZaloAdsUpdateEcommerceAd, this.client.toTransportInput(OP_ZaloAdsUpdateEcommerceAd, request), options);
|
|
@@ -1746,6 +2257,20 @@ var ZaloCampaignsService = class {
|
|
|
1746
2257
|
}
|
|
1747
2258
|
throw new Error(`[SpellCheckV3] Qu\xE1 th\u1EDDi gian ch\u1EDD (${timeoutMs}ms) cho t\xE1c v\u1EE5 ki\u1EC3m tra ch\xEDnh t\u1EA3 jobId: ${jobId}`);
|
|
1748
2259
|
}
|
|
2260
|
+
/**
|
|
2261
|
+
* Nhân bản (sao chép / duplicate) một mẫu quảng cáo đã tồn tại trên Zalo Ads (POST /zaapi/DuplicateAd).
|
|
2262
|
+
* Giúp tạo nhanh một bản sao Ad mới trong cùng chiến dịch để thực hiện A/B testing.
|
|
2263
|
+
*/
|
|
2264
|
+
duplicateAd(request, options) {
|
|
2265
|
+
const payload = {
|
|
2266
|
+
adid: request.adid ?? request.adId
|
|
2267
|
+
};
|
|
2268
|
+
return this.client.requestFormUrlEncoded(
|
|
2269
|
+
OP_ZaloAdsDuplicateAd,
|
|
2270
|
+
this.client.toTransportInput(OP_ZaloAdsDuplicateAd, payload),
|
|
2271
|
+
options
|
|
2272
|
+
);
|
|
2273
|
+
}
|
|
1749
2274
|
};
|
|
1750
2275
|
|
|
1751
2276
|
// src/services/account.service.ts
|
|
@@ -2647,6 +3172,25 @@ var OP_ZaloAdsUpsertCustomReport = {
|
|
|
2647
3172
|
"isDefault"
|
|
2648
3173
|
]
|
|
2649
3174
|
};
|
|
3175
|
+
var OP_ZaloAdsDownloadReport = {
|
|
3176
|
+
operationId: "zalo_ads_download_report",
|
|
3177
|
+
method: "POST",
|
|
3178
|
+
endpoint: "/api/collect",
|
|
3179
|
+
baseUrl: "https://ads.zalo.me",
|
|
3180
|
+
binaryFields: [],
|
|
3181
|
+
pathFields: [],
|
|
3182
|
+
queryFields: [],
|
|
3183
|
+
headerFields: [],
|
|
3184
|
+
cookieFields: [],
|
|
3185
|
+
bodyFields: [
|
|
3186
|
+
"t",
|
|
3187
|
+
"adIds",
|
|
3188
|
+
"status",
|
|
3189
|
+
"dateFilter",
|
|
3190
|
+
"reportKind",
|
|
3191
|
+
"et"
|
|
3192
|
+
]
|
|
3193
|
+
};
|
|
2650
3194
|
var ZaloReportsService = class {
|
|
2651
3195
|
constructor(client) {
|
|
2652
3196
|
this.client = client;
|
|
@@ -2709,6 +3253,18 @@ var ZaloReportsService = class {
|
|
|
2709
3253
|
getCampaignReportLegacy(...args) {
|
|
2710
3254
|
return this.getZaapiCampaignReportcampaign(...args);
|
|
2711
3255
|
}
|
|
3256
|
+
/** Xuất và tải trực tiếp tệp tin Excel (.xlsx / Blob) báo cáo hiệu quả quảng cáo (POST /api/collect) */
|
|
3257
|
+
downloadReport(request, options) {
|
|
3258
|
+
const payload = {
|
|
3259
|
+
t: request.t ?? "cd.download.report",
|
|
3260
|
+
status: request.status ?? 2,
|
|
3261
|
+
dateFilter: request.dateFilter ?? 0,
|
|
3262
|
+
reportKind: request.reportKind ?? 100001,
|
|
3263
|
+
et: request.et ?? Math.floor(Date.now() / 1e3),
|
|
3264
|
+
adIds: request.adIds
|
|
3265
|
+
};
|
|
3266
|
+
return this.client.requestJson(OP_ZaloAdsDownloadReport, this.client.toTransportInput(OP_ZaloAdsDownloadReport, payload), options);
|
|
3267
|
+
}
|
|
2712
3268
|
};
|
|
2713
3269
|
|
|
2714
3270
|
// src/services/conversions.service.ts
|
|
@@ -4967,7 +5523,7 @@ function validateUpdateInstantPageRequest(input) {
|
|
|
4967
5523
|
if (obj.status !== void 0 && obj.status !== null) {
|
|
4968
5524
|
const st = Number(obj.status);
|
|
4969
5525
|
if (![0, 1, 2, 3].includes(st)) {
|
|
4970
|
-
errors.push("Tr\u01B0\u1EDDng 'status' ph\u1EA3i l\xE0 m\u1ED9t trong c\xE1c m\xE3: 0 (B\u1EA3n sao m\u1EDBi), 1 (
|
|
5526
|
+
errors.push("Tr\u01B0\u1EDDng 'status' ph\u1EA3i l\xE0 m\u1ED9t trong c\xE1c m\xE3: 0 (B\u1EA3n sao m\u1EDBi t\u1EA1o ch\u01B0a l\u01B0u), 1 (\u0110ang ho\u1EA1t \u0111\u1ED9ng / \u0110\xE3 xu\u1EA5t b\u1EA3n), 3 (\u0110\xE3 k\u1EBFt th\xFAc / L\u01B0u tr\u1EEF).");
|
|
4971
5527
|
} else {
|
|
4972
5528
|
data.status = st;
|
|
4973
5529
|
}
|
|
@@ -5875,112 +6431,6 @@ var ZaloAdsIntegrationManager = class {
|
|
|
5875
6431
|
}
|
|
5876
6432
|
};
|
|
5877
6433
|
|
|
5878
|
-
// src/dtos/ads.dto.ts
|
|
5879
|
-
var ZaloAdsFlowChildMessageDto = class {
|
|
5880
|
-
/** Mẫu Zalo đã xác minh dùng 8 cho tin nhắn văn bản trong nhánh. */
|
|
5881
|
-
type;
|
|
5882
|
-
/** Nội dung phản hồi trong nhánh. */
|
|
5883
|
-
text;
|
|
5884
|
-
};
|
|
5885
|
-
var ZaloAdsFlowButtonDto = class {
|
|
5886
|
-
/** 3 = Gửi tin nhắn vào nhánh hội thoại; 10 = Mở website; 12 = Thực hiện cuộc gọi. */
|
|
5887
|
-
type;
|
|
5888
|
-
/** Nhãn nút hiển thị cho người dùng. */
|
|
5889
|
-
text;
|
|
5890
|
-
/** URL website; bắt buộc với type 10. */
|
|
5891
|
-
url;
|
|
5892
|
-
/** Cờ của nút website; dùng true với type 10. */
|
|
5893
|
-
editable;
|
|
5894
|
-
/** Số hotline, bắt buộc khi type là 12. */
|
|
5895
|
-
phone;
|
|
5896
|
-
/** Nhánh tin nhắn, bắt buộc khi type là 3. Với type 10 hoặc 12, để null hoặc bỏ qua. */
|
|
5897
|
-
messages;
|
|
5898
|
-
};
|
|
5899
|
-
var ZaloAdsFlowMessageDto = class {
|
|
5900
|
-
/** 1 = Tin nhắn văn bản; 2 = Tin nhắn kèm hình ảnh. */
|
|
5901
|
-
type;
|
|
5902
|
-
/** Nội dung tin nhắn, tối đa 1961 ký tự. Hỗ trợ biến: {{user_name}}, {{page_name}}, {{user_gender}}, {{user_id}}, {{page_id}}, {{date}}, {{datetime}}. */
|
|
5903
|
-
text;
|
|
5904
|
-
/** URL media hoặc null với tin nhắn văn bản thuần. Bắt buộc và không được null khi type = 2. */
|
|
5905
|
-
url;
|
|
5906
|
-
/** Các nút đi kèm tin nhắn. */
|
|
5907
|
-
buttons;
|
|
5908
|
-
};
|
|
5909
|
-
var ZaloAdsCreateFlowRequest = class {
|
|
5910
|
-
/** ID Official Account sở hữu kịch bản. */
|
|
5911
|
-
oaId;
|
|
5912
|
-
/** Luôn null khi tạo kịch bản mới. */
|
|
5913
|
-
id;
|
|
5914
|
-
/** Tên kịch bản, tối đa 33 ký tự theo giao diện Zalo Ads. */
|
|
5915
|
-
name;
|
|
5916
|
-
/** Các tin nhắn được gửi theo thứ tự trong kịch bản. */
|
|
5917
|
-
messages;
|
|
5918
|
-
};
|
|
5919
|
-
var ZaloAdsCreateFlowResponse = class {
|
|
5920
|
-
/** 0 khi tạo thành công; 1 khi lỗi (ví dụ: đã tới hạn mức 20 kịch bản). */
|
|
5921
|
-
code;
|
|
5922
|
-
/** Thông báo lỗi từ Zalo Ads khi code khác 0. */
|
|
5923
|
-
msg;
|
|
5924
|
-
/** ID kịch bản mới, truyền vào data.ZaloFlowId khi cập nhật quảng cáo Tin nhắn. */
|
|
5925
|
-
data;
|
|
5926
|
-
};
|
|
5927
|
-
var ZaloAdsUpdateVideoAdRequest = class {
|
|
5928
|
-
data;
|
|
5929
|
-
est;
|
|
5930
|
-
isBoostAd;
|
|
5931
|
-
stt;
|
|
5932
|
-
};
|
|
5933
|
-
var ZaloAdsUpdateVideoAdResponse = class {
|
|
5934
|
-
code;
|
|
5935
|
-
msg;
|
|
5936
|
-
data;
|
|
5937
|
-
};
|
|
5938
|
-
var ZaloAdsCreatePostCampaignRequest = class {
|
|
5939
|
-
/** Cấu hình chiến dịch Bài viết (object hoặc chuỗi JSON). */
|
|
5940
|
-
data;
|
|
5941
|
-
};
|
|
5942
|
-
var ZaloAdsCreatePostCampaignResponse = class {
|
|
5943
|
-
code;
|
|
5944
|
-
/** Chuỗi ID quảng cáo mới trong response Zalo Ads. */
|
|
5945
|
-
msg;
|
|
5946
|
-
data;
|
|
5947
|
-
};
|
|
5948
|
-
var ZaloAdsMessageAdUpdateDataDto = class {
|
|
5949
|
-
AdId;
|
|
5950
|
-
CampaignId;
|
|
5951
|
-
MemberId;
|
|
5952
|
-
/** Phiên bản lạc quan lấy từ bản quảng cáo hiện tại. */
|
|
5953
|
-
RowVersion;
|
|
5954
|
-
AdName;
|
|
5955
|
-
/** 20 (hoặc 19) là quảng cáo Tin nhắn. */
|
|
5956
|
-
Type;
|
|
5957
|
-
Settings;
|
|
5958
|
-
Status;
|
|
5959
|
-
StartDate;
|
|
5960
|
-
EndDate;
|
|
5961
|
-
/** ID kịch bản, lấy từ createFlow hoặc listFlowsByOfficialAccount. */
|
|
5962
|
-
ZaloFlowId;
|
|
5963
|
-
ZaloPageId;
|
|
5964
|
-
ZaloFormId;
|
|
5965
|
-
ConversionId;
|
|
5966
|
-
Report;
|
|
5967
|
-
};
|
|
5968
|
-
var ZaloAdsUpdateMessageAdRequest = class {
|
|
5969
|
-
/** Payload quảng cáo đầy đủ (object hoặc chuỗi JSON); service tự tuần tự hóa thành field form data. */
|
|
5970
|
-
data;
|
|
5971
|
-
/** Tham số UI phụ trợ; capture Zalo Ads có giá trị literal "undefined". */
|
|
5972
|
-
est;
|
|
5973
|
-
/** 0 là quảng cáo thông thường, 1 là boost ad. */
|
|
5974
|
-
isBoostAd;
|
|
5975
|
-
/** Trạng thái thao tác của giao diện; mẫu đã ghi nhận 0. */
|
|
5976
|
-
stt;
|
|
5977
|
-
};
|
|
5978
|
-
var ZaloAdsUpdateMessageAdResponse = class {
|
|
5979
|
-
msg;
|
|
5980
|
-
code;
|
|
5981
|
-
data;
|
|
5982
|
-
};
|
|
5983
|
-
|
|
5984
6434
|
// src/dtos/instant-pages.dto.ts
|
|
5985
6435
|
var ZaloInstantPageBlockType = /* @__PURE__ */ ((ZaloInstantPageBlockType2) => {
|
|
5986
6436
|
ZaloInstantPageBlockType2[ZaloInstantPageBlockType2["CAROUSEL_SLIDER"] = 1] = "CAROUSEL_SLIDER";
|
|
@@ -6004,21 +6454,28 @@ var ZaloInstantPageBlockType = /* @__PURE__ */ ((ZaloInstantPageBlockType2) => {
|
|
|
6004
6454
|
return ZaloInstantPageBlockType2;
|
|
6005
6455
|
})(ZaloInstantPageBlockType || {});
|
|
6006
6456
|
export {
|
|
6457
|
+
ALLOWED_CTAS_PER_AD_TYPE,
|
|
6007
6458
|
ALL_ZALO_ADS_DOMAINS,
|
|
6008
6459
|
MemoryZaloSessionStore,
|
|
6009
6460
|
RedisZaloSessionStore,
|
|
6010
6461
|
TieredZaloSessionStore,
|
|
6462
|
+
VALID_AD_TYPES,
|
|
6463
|
+
VALID_CAMPAIGN_TYPES,
|
|
6011
6464
|
ZaloAccountService,
|
|
6012
6465
|
ZaloAdsIntegrationManager as ZaloAdsAccountPool,
|
|
6466
|
+
ZaloAdsActionType,
|
|
6467
|
+
ZaloAdsAgeRangeId,
|
|
6013
6468
|
ZaloAdsCreateFlowRequest,
|
|
6014
6469
|
ZaloAdsCreateFlowResponse,
|
|
6015
6470
|
ZaloAdsCreatePostCampaignRequest,
|
|
6016
6471
|
ZaloAdsCreatePostCampaignResponse,
|
|
6472
|
+
ZaloAdsDeliveryType,
|
|
6017
6473
|
ZaloAdsFlowButtonDto,
|
|
6018
6474
|
ZaloAdsFlowChildMessageDto,
|
|
6019
6475
|
ZaloAdsFlowMessageDto,
|
|
6020
6476
|
ZaloAdsIntegrationManager,
|
|
6021
6477
|
ZaloAdsMessageAdUpdateDataDto,
|
|
6478
|
+
ZaloAdsOsId,
|
|
6022
6479
|
ZaloAdsSdk,
|
|
6023
6480
|
ZaloAdsService,
|
|
6024
6481
|
ZaloAdsUpdateMessageAdRequest,
|
|
@@ -6030,6 +6487,7 @@ export {
|
|
|
6030
6487
|
ZaloAuthManager,
|
|
6031
6488
|
ZaloAutomatedRulesService,
|
|
6032
6489
|
ZaloCampaignsService,
|
|
6490
|
+
ZaloCampaignsValidator,
|
|
6033
6491
|
ZaloChatWidgetService,
|
|
6034
6492
|
ZaloConversionsService,
|
|
6035
6493
|
ZaloFlowsService,
|
|
@@ -6052,7 +6510,9 @@ export {
|
|
|
6052
6510
|
defaultSharedMemorySessionStore,
|
|
6053
6511
|
deriveAccountKeyFromZpsid,
|
|
6054
6512
|
parseZaloCookieInput,
|
|
6513
|
+
validateChangeCampaignStatusParams,
|
|
6055
6514
|
validateCloneInstantPageRequest,
|
|
6515
|
+
validateCreateCampaignPayload,
|
|
6056
6516
|
validateCreateFlowRequest,
|
|
6057
6517
|
validateCreateFormEventAudienceRequest,
|
|
6058
6518
|
validateCreateFormRequest,
|
|
@@ -6061,6 +6521,7 @@ export {
|
|
|
6061
6521
|
validateCreateMessagePersonalEventAudienceRequest,
|
|
6062
6522
|
validateCreatePhoneAudienceRequest,
|
|
6063
6523
|
validateCreateSavedAudienceRequest,
|
|
6524
|
+
validateDuplicateAdParams,
|
|
6064
6525
|
validateEstimateAudienceRequest,
|
|
6065
6526
|
validateGetInstantPageDetailRequest,
|
|
6066
6527
|
validateGetInstantPageSharedUserRequest,
|
|
@@ -6074,7 +6535,9 @@ export {
|
|
|
6074
6535
|
validateListInstantPageUsersRequest,
|
|
6075
6536
|
validateListMiniPageTemplatesRequest,
|
|
6076
6537
|
validateListOfficialAccountsRequest,
|
|
6538
|
+
validateRenameCampaignParams,
|
|
6077
6539
|
validateSearchInstantPagesRequest,
|
|
6540
|
+
validateUpdateAdPayload,
|
|
6078
6541
|
validateUpdateFlowRequest,
|
|
6079
6542
|
validateUpdateInstantPageRequest,
|
|
6080
6543
|
validateUpsertInstantPageFormRequest
|