siluzan-cso-cli 1.0.0-beta.31 → 1.0.0-beta.33
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 +1 -1
- package/dist/index.js +178 -76
- package/dist/skill/SKILL.md +47 -4
- package/dist/skill/_meta.json +2 -2
- package/dist/skill/assets/publish-config.example.json +5 -1
- package/dist/skill/references/account-group.md +42 -15
- package/dist/skill/references/web-pages.md +88 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -20,7 +20,7 @@ siluzan-cso init -d /path/to/skills # 写入自定义目录
|
|
|
20
20
|
siluzan-cso init --force # 强制覆盖已存在文件
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
-
> **注意**:当前为测试版(1.0.0-beta.
|
|
23
|
+
> **注意**:当前为测试版(1.0.0-beta.33),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-cso-cli`。
|
|
24
24
|
|
|
25
25
|
| 助手 | 建议 `--ai` |
|
|
26
26
|
|------|-------------|
|
package/dist/index.js
CHANGED
|
@@ -2825,8 +2825,6 @@ async function runLogin(opts = {}) {
|
|
|
2825
2825
|
return;
|
|
2826
2826
|
}
|
|
2827
2827
|
}
|
|
2828
|
-
console.log("\n\u8BF7\u524D\u5F80\uFF1Ahttps://www.siluzan.com/user/settings/token");
|
|
2829
|
-
console.log("\u590D\u5236 Access Token \u540E\u7C98\u8D34\u5230\u4E0B\u65B9\u3002\n");
|
|
2830
2828
|
let token = "";
|
|
2831
2829
|
for (let i = 0; i < 3; i++) {
|
|
2832
2830
|
const input = await prompt("\u7C98\u8D34 Token\uFF1A");
|
|
@@ -3197,25 +3195,16 @@ function groupByPlatform(list) {
|
|
|
3197
3195
|
}
|
|
3198
3196
|
async function runListAccounts(options) {
|
|
3199
3197
|
const config = loadConfig(options.token);
|
|
3200
|
-
const isDomestic = options.domestic ?? false;
|
|
3201
3198
|
const pageNo = options.page ?? 1;
|
|
3202
3199
|
const pageSize = options.pageSize ?? 20;
|
|
3203
3200
|
const stateParams = {};
|
|
3204
|
-
if (
|
|
3205
|
-
|
|
3206
|
-
|
|
3207
|
-
|
|
3208
|
-
stateParams["mediaAccountState"] = "Abnormal,Expired,NoPermissionToPublish";
|
|
3209
|
-
}
|
|
3210
|
-
} else {
|
|
3211
|
-
if (options.state === "normal") {
|
|
3212
|
-
stateParams["state"] = "false";
|
|
3213
|
-
} else if (options.state === "abnormal") {
|
|
3214
|
-
stateParams["state"] = "true";
|
|
3215
|
-
}
|
|
3201
|
+
if (options.state === "normal") {
|
|
3202
|
+
stateParams["state"] = "false";
|
|
3203
|
+
} else if (options.state === "abnormal") {
|
|
3204
|
+
stateParams["state"] = "true";
|
|
3216
3205
|
}
|
|
3217
3206
|
const params = new URLSearchParams({
|
|
3218
|
-
mediaGroup:
|
|
3207
|
+
mediaGroup: "0",
|
|
3219
3208
|
pageNo: String(pageNo),
|
|
3220
3209
|
pageSize: String(pageSize),
|
|
3221
3210
|
...options.name ? { mediaCustomerName: options.name } : {},
|
|
@@ -3265,7 +3254,6 @@ async function runListAccounts(options) {
|
|
|
3265
3254
|
console.log("\n\u5F53\u524D\u6CA1\u6709\u7B26\u5408\u6761\u4EF6\u7684\u5A92\u4F53\u8D26\u53F7\u3002");
|
|
3266
3255
|
return;
|
|
3267
3256
|
}
|
|
3268
|
-
const tradeLabel = isDomestic ? "\u5185\u8D38" : "\u5916\u8D38";
|
|
3269
3257
|
const totalPages = Math.ceil(total / pageSize);
|
|
3270
3258
|
const pageInfo = `\u7B2C ${pageNo} \u9875 / \u5171 ${totalPages} \u9875\uFF0C\u603B\u8BA1 ${total} \u6761`;
|
|
3271
3259
|
const tableOpts2 = options.unicode ? { plain: false } : void 0;
|
|
@@ -3273,7 +3261,7 @@ async function runListAccounts(options) {
|
|
|
3273
3261
|
const isOverview = options.overview ?? true;
|
|
3274
3262
|
if (isOverview) {
|
|
3275
3263
|
console.log(`
|
|
3276
|
-
\u8D26\u53F7\u6570\u636E\u603B\u89C8\uFF08${
|
|
3264
|
+
\u8D26\u53F7\u6570\u636E\u603B\u89C8\uFF08${pageInfo}\uFF09`);
|
|
3277
3265
|
const overviewColumns = [
|
|
3278
3266
|
{ key: "mediaCustomerName", header: "\u8D26\u53F7\u540D\u79F0" },
|
|
3279
3267
|
{ key: "state", header: "\u72B6\u6001" },
|
|
@@ -3303,7 +3291,7 @@ async function runListAccounts(options) {
|
|
|
3303
3291
|
}
|
|
3304
3292
|
} else {
|
|
3305
3293
|
console.log(`
|
|
3306
|
-
\u5A92\u4F53\u8D26\u53F7\u5217\u8868\uFF08${
|
|
3294
|
+
\u5A92\u4F53\u8D26\u53F7\u5217\u8868\uFF08${pageInfo}\uFF09`);
|
|
3307
3295
|
const columns = [
|
|
3308
3296
|
{ key: "mediaCustomerName", header: "\u8D26\u53F7\u540D\u79F0" },
|
|
3309
3297
|
{ key: "mediaCustomerId", header: "\u8D26\u53F7ID" },
|
|
@@ -3333,6 +3321,7 @@ async function runListAccounts(options) {
|
|
|
3333
3321
|
\u63D0\u793A\uFF1A\u8FD8\u6709\u66F4\u591A\u8D26\u53F7\uFF0C\u4F7F\u7528 --page ${pageNo + 1} \u53EF\u67E5\u770B\u4E0B\u4E00\u9875\u3002`);
|
|
3334
3322
|
}
|
|
3335
3323
|
console.log("\u63D0\u793A\uFF1A\u4F7F\u7528 --json \u53EF\u83B7\u53D6\u5B8C\u6574 JSON \u6570\u636E\uFF08\u542B mediaCustomerId \u7B49\u5B57\u6BB5\uFF09\u3002");
|
|
3324
|
+
console.log(`\u63D0\u793A\uFF1A\u8D26\u53F7\u8BE6\u7EC6\u6570\u636E\u8BF7\u767B\u5F55\u540E\u53F0\u67E5\u770B \u{1F449} ${DEFAULT_WEB_BASE}/v3/foreign_trade/cso/ManageAccounts`);
|
|
3336
3325
|
}
|
|
3337
3326
|
|
|
3338
3327
|
// src/commands/list-members.ts
|
|
@@ -3401,17 +3390,13 @@ ${hint}`);
|
|
|
3401
3390
|
}
|
|
3402
3391
|
|
|
3403
3392
|
// src/commands/account-group.ts
|
|
3404
|
-
function platformLabel(csoPlatformType) {
|
|
3405
|
-
return csoPlatformType === 1 ? "\u5185\u8D38" : "\u5916\u8D38";
|
|
3406
|
-
}
|
|
3407
3393
|
function parseAccountIds(raw) {
|
|
3408
3394
|
if (!raw) return [];
|
|
3409
3395
|
return raw.split(",").map((s) => s.trim()).filter(Boolean);
|
|
3410
3396
|
}
|
|
3411
3397
|
async function runAccountGroupList(options) {
|
|
3412
3398
|
const config = loadConfig(options.token);
|
|
3413
|
-
const
|
|
3414
|
-
const url = `${config.apiBaseUrl}/query/media-account/GetMediaAccountGroups?csoPlatformType=${csoPlatformType}`;
|
|
3399
|
+
const url = `${config.apiBaseUrl}/query/media-account/GetMediaAccountGroups?csoPlatformType=2`;
|
|
3415
3400
|
let res;
|
|
3416
3401
|
try {
|
|
3417
3402
|
res = await apiFetch2(url, config, {}, options.verbose);
|
|
@@ -3436,7 +3421,7 @@ async function runAccountGroupList(options) {
|
|
|
3436
3421
|
return;
|
|
3437
3422
|
}
|
|
3438
3423
|
console.log(`
|
|
3439
|
-
\u8D26\u53F7\u5206\u7EC4\u5217\u8868\uFF08
|
|
3424
|
+
\u8D26\u53F7\u5206\u7EC4\u5217\u8868\uFF08\u5171 ${groups.length} \u4E2A\u5206\u7EC4\uFF09
|
|
3440
3425
|
`);
|
|
3441
3426
|
const columns = [
|
|
3442
3427
|
{ key: "id", header: "\u5206\u7EC4 ID" },
|
|
@@ -3458,11 +3443,10 @@ async function runAccountGroupList(options) {
|
|
|
3458
3443
|
}
|
|
3459
3444
|
async function runAccountGroupCreate(options) {
|
|
3460
3445
|
const config = loadConfig(options.token);
|
|
3461
|
-
const csoPlatformType = options.domestic ? 1 : 2;
|
|
3462
3446
|
const accountIds = parseAccountIds(options.accounts);
|
|
3463
3447
|
const body = {
|
|
3464
3448
|
name: options.name,
|
|
3465
|
-
csoPlatformType,
|
|
3449
|
+
csoPlatformType: 2,
|
|
3466
3450
|
// 后端字段名为 mediaAccountInfos,实际传 mediaCustomerId 字符串数组
|
|
3467
3451
|
mediaAccountInfos: accountIds
|
|
3468
3452
|
};
|
|
@@ -3489,11 +3473,11 @@ async function runAccountGroupCreate(options) {
|
|
|
3489
3473
|
}
|
|
3490
3474
|
const newGroupId = res;
|
|
3491
3475
|
if (options.json) {
|
|
3492
|
-
console.log(JSON.stringify({ success: true, id: newGroupId, name: options.name,
|
|
3476
|
+
console.log(JSON.stringify({ success: true, id: newGroupId, name: options.name, accountIds }));
|
|
3493
3477
|
return;
|
|
3494
3478
|
}
|
|
3495
3479
|
console.log(`
|
|
3496
|
-
\u2705 \u5206\u7EC4\u300C${options.name}\u300D\u521B\u5EFA\u6210\u529F
|
|
3480
|
+
\u2705 \u5206\u7EC4\u300C${options.name}\u300D\u521B\u5EFA\u6210\u529F`);
|
|
3497
3481
|
console.log(` \u5206\u7EC4 ID\uFF1A${newGroupId}`);
|
|
3498
3482
|
if (accountIds.length > 0) {
|
|
3499
3483
|
console.log(` \u5DF2\u6DFB\u52A0 ${accountIds.length} \u4E2A\u8D26\u53F7\uFF1A${accountIds.join(", ")}`);
|
|
@@ -3504,12 +3488,11 @@ async function runAccountGroupCreate(options) {
|
|
|
3504
3488
|
}
|
|
3505
3489
|
async function runAccountGroupUpdate(options) {
|
|
3506
3490
|
const config = loadConfig(options.token);
|
|
3507
|
-
const csoPlatformType = options.domestic ? 1 : 2;
|
|
3508
3491
|
const accountIds = parseAccountIds(options.accounts);
|
|
3509
3492
|
const body = {
|
|
3510
3493
|
id: options.id,
|
|
3511
3494
|
name: options.name,
|
|
3512
|
-
csoPlatformType,
|
|
3495
|
+
csoPlatformType: 2,
|
|
3513
3496
|
mediaAccountInfos: accountIds
|
|
3514
3497
|
};
|
|
3515
3498
|
const url = `${config.apiBaseUrl}/command/media-account/SetMediaAccountGroup`;
|
|
@@ -3534,7 +3517,7 @@ async function runAccountGroupUpdate(options) {
|
|
|
3534
3517
|
process.exit(1);
|
|
3535
3518
|
}
|
|
3536
3519
|
if (options.json) {
|
|
3537
|
-
console.log(JSON.stringify({ success: true, id: options.id, name: options.name,
|
|
3520
|
+
console.log(JSON.stringify({ success: true, id: options.id, name: options.name, accountIds }));
|
|
3538
3521
|
return;
|
|
3539
3522
|
}
|
|
3540
3523
|
console.log(`
|
|
@@ -3568,6 +3551,120 @@ async function runAccountGroupDelete(options) {
|
|
|
3568
3551
|
\u2705 \u5206\u7EC4\uFF08ID: ${options.id}\uFF09\u5DF2\u5220\u9664\u3002`);
|
|
3569
3552
|
console.log("\n\u4F7F\u7528 siluzan-cso account-group list \u67E5\u770B\u6240\u6709\u5206\u7EC4\u3002");
|
|
3570
3553
|
}
|
|
3554
|
+
async function fetchGroupDetail(id, config, verbose) {
|
|
3555
|
+
const url = `${config.apiBaseUrl}/query/media-account/GetMediaAccountGroups?csoPlatformType=2`;
|
|
3556
|
+
let res;
|
|
3557
|
+
try {
|
|
3558
|
+
res = await apiFetch2(url, config, {}, verbose);
|
|
3559
|
+
} catch (e) {
|
|
3560
|
+
throw new Error(`\u83B7\u53D6\u5206\u7EC4\u5217\u8868\u5931\u8D25\uFF1A${e.message}`);
|
|
3561
|
+
}
|
|
3562
|
+
const group = (res.labelList ?? []).find((g) => g.id === id);
|
|
3563
|
+
if (!group) {
|
|
3564
|
+
throw new Error(`\u672A\u627E\u5230 ID \u4E3A "${id}" \u7684\u5206\u7EC4\uFF0C\u8BF7\u901A\u8FC7 account-group list \u786E\u8BA4\u5206\u7EC4 ID`);
|
|
3565
|
+
}
|
|
3566
|
+
const currentAccountIds = (group.mediaAccountInfos ?? []).map((a) => a.mediaCustomerId);
|
|
3567
|
+
return { name: group.labelName, currentAccountIds };
|
|
3568
|
+
}
|
|
3569
|
+
async function runAccountGroupAddAccounts(options) {
|
|
3570
|
+
const config = loadConfig(options.token);
|
|
3571
|
+
const newIds = parseAccountIds(options.accounts);
|
|
3572
|
+
if (newIds.length === 0) {
|
|
3573
|
+
console.error("\n\u274C --accounts \u4E0D\u80FD\u4E3A\u7A7A");
|
|
3574
|
+
process.exit(1);
|
|
3575
|
+
}
|
|
3576
|
+
let name;
|
|
3577
|
+
let currentAccountIds;
|
|
3578
|
+
try {
|
|
3579
|
+
({ name, currentAccountIds } = await fetchGroupDetail(options.id, config, options.verbose));
|
|
3580
|
+
} catch (e) {
|
|
3581
|
+
console.error(`
|
|
3582
|
+
\u274C ${e.message}`);
|
|
3583
|
+
process.exit(1);
|
|
3584
|
+
}
|
|
3585
|
+
const merged = Array.from(/* @__PURE__ */ new Set([...currentAccountIds, ...newIds]));
|
|
3586
|
+
const addedCount = merged.length - currentAccountIds.length;
|
|
3587
|
+
const body = { id: options.id, name, csoPlatformType: 2, mediaAccountInfos: merged };
|
|
3588
|
+
const url = `${config.apiBaseUrl}/command/media-account/SetMediaAccountGroup`;
|
|
3589
|
+
let res;
|
|
3590
|
+
try {
|
|
3591
|
+
res = await apiFetch2(url, config, {
|
|
3592
|
+
method: "POST",
|
|
3593
|
+
headers: { "Content-Type": "application/json" },
|
|
3594
|
+
body: JSON.stringify(body)
|
|
3595
|
+
}, options.verbose);
|
|
3596
|
+
} catch (e) {
|
|
3597
|
+
console.error(`
|
|
3598
|
+
\u274C \u8BF7\u6C42\u5931\u8D25\uFF1A${e.message}`);
|
|
3599
|
+
process.exit(1);
|
|
3600
|
+
}
|
|
3601
|
+
if (typeof res !== "string") {
|
|
3602
|
+
console.error(`
|
|
3603
|
+
\u274C \u6DFB\u52A0\u8D26\u53F7\u5931\u8D25\uFF1A${res.message ?? "\u670D\u52A1\u7AEF\u8FD4\u56DE\u5F02\u5E38"}`);
|
|
3604
|
+
process.exit(1);
|
|
3605
|
+
}
|
|
3606
|
+
if (options.json) {
|
|
3607
|
+
console.log(JSON.stringify({ success: true, id: options.id, name, added: addedCount, total: merged.length, accountIds: merged }));
|
|
3608
|
+
return;
|
|
3609
|
+
}
|
|
3610
|
+
if (addedCount === 0) {
|
|
3611
|
+
console.log(`
|
|
3612
|
+
\u2139\uFE0F \u6240\u6709\u8D26\u53F7\u5DF2\u5728\u5206\u7EC4\u300C${name}\u300D\u4E2D\uFF0C\u65E0\u9700\u6DFB\u52A0\uFF08\u5171 ${merged.length} \u4E2A\uFF09\u3002`);
|
|
3613
|
+
} else {
|
|
3614
|
+
console.log(`
|
|
3615
|
+
\u2705 \u5DF2\u5411\u5206\u7EC4\u300C${name}\u300D\u6DFB\u52A0 ${addedCount} \u4E2A\u8D26\u53F7\uFF08\u5171 ${merged.length} \u4E2A\uFF09`);
|
|
3616
|
+
console.log(` \u65B0\u589E\uFF1A${newIds.filter((id) => !currentAccountIds.includes(id)).join(", ")}`);
|
|
3617
|
+
}
|
|
3618
|
+
}
|
|
3619
|
+
async function runAccountGroupRemoveAccounts(options) {
|
|
3620
|
+
const config = loadConfig(options.token);
|
|
3621
|
+
const removeIds = new Set(parseAccountIds(options.accounts));
|
|
3622
|
+
if (removeIds.size === 0) {
|
|
3623
|
+
console.error("\n\u274C --accounts \u4E0D\u80FD\u4E3A\u7A7A");
|
|
3624
|
+
process.exit(1);
|
|
3625
|
+
}
|
|
3626
|
+
let name;
|
|
3627
|
+
let currentAccountIds;
|
|
3628
|
+
try {
|
|
3629
|
+
({ name, currentAccountIds } = await fetchGroupDetail(options.id, config, options.verbose));
|
|
3630
|
+
} catch (e) {
|
|
3631
|
+
console.error(`
|
|
3632
|
+
\u274C ${e.message}`);
|
|
3633
|
+
process.exit(1);
|
|
3634
|
+
}
|
|
3635
|
+
const remaining = currentAccountIds.filter((id) => !removeIds.has(id));
|
|
3636
|
+
const removedCount = currentAccountIds.length - remaining.length;
|
|
3637
|
+
const body = { id: options.id, name, csoPlatformType: 2, mediaAccountInfos: remaining };
|
|
3638
|
+
const url = `${config.apiBaseUrl}/command/media-account/SetMediaAccountGroup`;
|
|
3639
|
+
let res;
|
|
3640
|
+
try {
|
|
3641
|
+
res = await apiFetch2(url, config, {
|
|
3642
|
+
method: "POST",
|
|
3643
|
+
headers: { "Content-Type": "application/json" },
|
|
3644
|
+
body: JSON.stringify(body)
|
|
3645
|
+
}, options.verbose);
|
|
3646
|
+
} catch (e) {
|
|
3647
|
+
console.error(`
|
|
3648
|
+
\u274C \u8BF7\u6C42\u5931\u8D25\uFF1A${e.message}`);
|
|
3649
|
+
process.exit(1);
|
|
3650
|
+
}
|
|
3651
|
+
if (typeof res !== "string") {
|
|
3652
|
+
console.error(`
|
|
3653
|
+
\u274C \u79FB\u9664\u8D26\u53F7\u5931\u8D25\uFF1A${res.message ?? "\u670D\u52A1\u7AEF\u8FD4\u56DE\u5F02\u5E38"}`);
|
|
3654
|
+
process.exit(1);
|
|
3655
|
+
}
|
|
3656
|
+
if (options.json) {
|
|
3657
|
+
console.log(JSON.stringify({ success: true, id: options.id, name, removed: removedCount, total: remaining.length, accountIds: remaining }));
|
|
3658
|
+
return;
|
|
3659
|
+
}
|
|
3660
|
+
if (removedCount === 0) {
|
|
3661
|
+
console.log(`
|
|
3662
|
+
\u2139\uFE0F \u6307\u5B9A\u8D26\u53F7\u5747\u4E0D\u5728\u5206\u7EC4\u300C${name}\u300D\u4E2D\uFF0C\u65E0\u9700\u79FB\u9664\uFF08\u5F53\u524D\u5171 ${remaining.length} \u4E2A\uFF09\u3002`);
|
|
3663
|
+
} else {
|
|
3664
|
+
console.log(`
|
|
3665
|
+
\u2705 \u5DF2\u4ECE\u5206\u7EC4\u300C${name}\u300D\u79FB\u9664 ${removedCount} \u4E2A\u8D26\u53F7\uFF08\u5269\u4F59 ${remaining.length} \u4E2A\uFF09`);
|
|
3666
|
+
}
|
|
3667
|
+
}
|
|
3571
3668
|
|
|
3572
3669
|
// src/commands/publish.ts
|
|
3573
3670
|
import * as fs6 from "fs";
|
|
@@ -3594,7 +3691,8 @@ function buildPublishTitle(item, mediaType, override, isImagePost = false) {
|
|
|
3594
3691
|
} else {
|
|
3595
3692
|
description = ["YouTube", "Facebook"].includes(mediaType) ? rawDesc || title : title;
|
|
3596
3693
|
}
|
|
3597
|
-
const
|
|
3694
|
+
const defaultTopicPosition = ["YouTube", "Facebook"].includes(mediaType) ? 4 : 2;
|
|
3695
|
+
const topicPosition = override?.topicPosition ?? item.topicPosition ?? defaultTopicPosition;
|
|
3598
3696
|
return { title, description, topics, topicPosition };
|
|
3599
3697
|
}
|
|
3600
3698
|
function buildImagePayload(img, currentUserId) {
|
|
@@ -4527,12 +4625,6 @@ function parseMediaCustomerIds(value) {
|
|
|
4527
4625
|
const ids = value.flatMap((part) => part.split(",")).map((s) => s.trim()).filter(Boolean);
|
|
4528
4626
|
return Array.from(new Set(ids));
|
|
4529
4627
|
}
|
|
4530
|
-
function parsePlatformType(domestic, platformTypeArg) {
|
|
4531
|
-
if (platformTypeArg) {
|
|
4532
|
-
return platformTypeArg === "1" ? 1 : 2;
|
|
4533
|
-
}
|
|
4534
|
-
return domestic ? 1 : 2;
|
|
4535
|
-
}
|
|
4536
4628
|
function ensureMethod(value) {
|
|
4537
4629
|
if (!value) return DEFAULT_METHOD;
|
|
4538
4630
|
if (value === "Day" || value === "Week" || value === "Moth") return value;
|
|
@@ -4564,7 +4656,6 @@ function buildRuntime(opts) {
|
|
|
4564
4656
|
exitWithError("\u8BF7\u901A\u8FC7 --media \u6307\u5B9A\u5A92\u4F53\u7C7B\u578B\uFF0C\u4F8B\u5982 Douyin\u3001YouTube\u3002");
|
|
4565
4657
|
}
|
|
4566
4658
|
const config = loadConfig(opts.token);
|
|
4567
|
-
const csoPlatformType = parsePlatformType(opts.domestic, opts.platformType);
|
|
4568
4659
|
const days = opts.days && opts.days > 0 ? opts.days : 30;
|
|
4569
4660
|
const { startDate: defaultStart, endDate: defaultEnd } = getDefaultDateRange(days);
|
|
4570
4661
|
const startDate = opts.start ? normalizeDateInput(opts.start, "start") : defaultStart;
|
|
@@ -4573,7 +4664,7 @@ function buildRuntime(opts) {
|
|
|
4573
4664
|
exitWithError("--start \u4E0D\u80FD\u665A\u4E8E --end");
|
|
4574
4665
|
}
|
|
4575
4666
|
const baseQuery = {
|
|
4576
|
-
csoPlatformType,
|
|
4667
|
+
csoPlatformType: 2,
|
|
4577
4668
|
mediaTypes: [opts.media],
|
|
4578
4669
|
mediaCustomerIds: parseMediaCustomerIds(opts.maids),
|
|
4579
4670
|
startDate: formatUtcDateTime(startDate),
|
|
@@ -4581,7 +4672,6 @@ function buildRuntime(opts) {
|
|
|
4581
4672
|
};
|
|
4582
4673
|
return {
|
|
4583
4674
|
config,
|
|
4584
|
-
csoPlatformType,
|
|
4585
4675
|
baseQuery,
|
|
4586
4676
|
method: ensureMethod(opts.method),
|
|
4587
4677
|
verbose: Boolean(opts.verbose)
|
|
@@ -4813,11 +4903,10 @@ function renderRecordTable(list, unicode = false) {
|
|
|
4813
4903
|
}
|
|
4814
4904
|
async function runReportRecords(options) {
|
|
4815
4905
|
const config = loadConfig(options.token);
|
|
4816
|
-
const csoPlatformType = parsePlatformType(options.domestic, options.platformType);
|
|
4817
4906
|
const page = parsePositiveInt(options.page, "--page", 1);
|
|
4818
4907
|
const size = parsePositiveInt(options.pageSize, "--page-size", 20);
|
|
4819
4908
|
const verbose = Boolean(options.verbose);
|
|
4820
|
-
const url = `${config.csoBaseUrl}/cso/v1/accountData/OperationsReportRecord
|
|
4909
|
+
const url = `${config.csoBaseUrl}/cso/v1/accountData/OperationsReportRecord/2?` + createQueryString({ page, size });
|
|
4821
4910
|
let data;
|
|
4822
4911
|
try {
|
|
4823
4912
|
const res = await apiFetch2(url, config, {}, verbose);
|
|
@@ -4835,7 +4924,7 @@ async function runReportRecords(options) {
|
|
|
4835
4924
|
return;
|
|
4836
4925
|
}
|
|
4837
4926
|
console.log(`
|
|
4838
|
-
\u5BFC\u51FA\u8BB0\u5F55\uFF08\
|
|
4927
|
+
\u5BFC\u51FA\u8BB0\u5F55\uFF08\u7B2C ${page} \u9875\uFF0C\u6BCF\u9875 ${size} \u6761\uFF0C\u603B\u6570 ${data?.total ?? 0}\uFF09\uFF1A`);
|
|
4839
4928
|
renderRecordTable(list, options.unicode);
|
|
4840
4929
|
console.log();
|
|
4841
4930
|
}
|
|
@@ -4858,9 +4947,8 @@ async function runReportDownload(options) {
|
|
|
4858
4947
|
exitWithError("\u8BF7\u63D0\u4F9B --id <record-id>");
|
|
4859
4948
|
}
|
|
4860
4949
|
const config = loadConfig(options.token);
|
|
4861
|
-
const csoPlatformType = parsePlatformType(options.domestic, options.platformType);
|
|
4862
4950
|
const verbose = Boolean(options.verbose);
|
|
4863
|
-
const url = `${config.csoBaseUrl}/cso/v1/accountData/DownLoadOperationsReport
|
|
4951
|
+
const url = `${config.csoBaseUrl}/cso/v1/accountData/DownLoadOperationsReport/2?` + createQueryString({ id: options.id });
|
|
4864
4952
|
let pdfUrl = "";
|
|
4865
4953
|
try {
|
|
4866
4954
|
const res = await apiFetch2(url, config, { method: "POST" }, verbose);
|
|
@@ -5603,10 +5691,6 @@ function exitWithError3(message) {
|
|
|
5603
5691
|
`);
|
|
5604
5692
|
process.exit(1);
|
|
5605
5693
|
}
|
|
5606
|
-
function parsePlatformType2(domestic, platformTypeArg) {
|
|
5607
|
-
if (platformTypeArg) return platformTypeArg === "1" ? 1 : 2;
|
|
5608
|
-
return domestic ? 1 : 2;
|
|
5609
|
-
}
|
|
5610
5694
|
function parsePositiveInt3(input, field, defaultValue) {
|
|
5611
5695
|
if (!input) return defaultValue;
|
|
5612
5696
|
const n = Number(input);
|
|
@@ -5703,7 +5787,6 @@ async function postNoBody(endpoint, options) {
|
|
|
5703
5787
|
}
|
|
5704
5788
|
async function runTaskList(options) {
|
|
5705
5789
|
const config = loadConfig(options.token);
|
|
5706
|
-
const csoPlatformType = parsePlatformType2(options.domestic, options.platformType);
|
|
5707
5790
|
const page = parsePositiveInt3(options.page, "--page", 1);
|
|
5708
5791
|
const size = parsePositiveInt3(options.size, "--size", 10);
|
|
5709
5792
|
const status = parseTaskStatus(options.status);
|
|
@@ -5721,7 +5804,7 @@ async function runTaskList(options) {
|
|
|
5721
5804
|
if (options.searchType === "creator") creator = options.keyword;
|
|
5722
5805
|
else taskName = options.keyword;
|
|
5723
5806
|
}
|
|
5724
|
-
const url = `${config.csoBaseUrl}/cso/v1/task/taskList
|
|
5807
|
+
const url = `${config.csoBaseUrl}/cso/v1/task/taskList/2?${createQueryString3({
|
|
5725
5808
|
page,
|
|
5726
5809
|
size,
|
|
5727
5810
|
status,
|
|
@@ -5747,7 +5830,7 @@ async function runTaskList(options) {
|
|
|
5747
5830
|
return;
|
|
5748
5831
|
}
|
|
5749
5832
|
console.log(`
|
|
5750
|
-
\u4EFB\u52A1\u5217\u8868\uFF08\
|
|
5833
|
+
\u4EFB\u52A1\u5217\u8868\uFF08\u7B2C ${page} \u9875\uFF0C\u6BCF\u9875 ${size} \u6761\uFF0C\u603B\u6570 ${data.total ?? 0}\uFF09\uFF1A`);
|
|
5751
5834
|
if (list.length === 0) {
|
|
5752
5835
|
console.log(" \u6682\u65E0\u6570\u636E\u3002\n");
|
|
5753
5836
|
return;
|
|
@@ -5774,11 +5857,10 @@ async function runTaskList(options) {
|
|
|
5774
5857
|
async function runTaskDetail(options) {
|
|
5775
5858
|
if (!options.publishId) exitWithError3("\u8BF7\u63D0\u4F9B --publish-id");
|
|
5776
5859
|
const config = loadConfig(options.token);
|
|
5777
|
-
const csoPlatformType = parsePlatformType2(options.domestic, options.platformType);
|
|
5778
5860
|
const page = parsePositiveInt3(options.page, "--page", 1);
|
|
5779
5861
|
const size = parsePositiveInt3(options.size, "--size", 10);
|
|
5780
5862
|
const mediaType = options.media ? resolveMediaTypeForApi(options.media) : null;
|
|
5781
|
-
const url = `${config.csoBaseUrl}/cso/v1/task/taskDetail
|
|
5863
|
+
const url = `${config.csoBaseUrl}/cso/v1/task/taskDetail/2?${createQueryString3({
|
|
5782
5864
|
publishId: options.publishId,
|
|
5783
5865
|
page,
|
|
5784
5866
|
size,
|
|
@@ -5906,9 +5988,8 @@ async function runTaskItemRunNow(options) {
|
|
|
5906
5988
|
}
|
|
5907
5989
|
async function runTaskCommentList(options) {
|
|
5908
5990
|
const config = loadConfig(options.token);
|
|
5909
|
-
const csoPlatformType = parsePlatformType2(options.domestic, options.platformType);
|
|
5910
5991
|
const mediaType = resolveMediaTypeForApi(options.mediaType);
|
|
5911
|
-
const url = `${config.csoBaseUrl}/cso/v1/comment/listByVideoId/${
|
|
5992
|
+
const url = `${config.csoBaseUrl}/cso/v1/comment/listByVideoId/2/${mediaType}?${createQueryString3({
|
|
5912
5993
|
videoId: encodeURIComponent(options.videoId),
|
|
5913
5994
|
mediaCustomerId: options.mediaCustomerId
|
|
5914
5995
|
})}`;
|
|
@@ -5961,8 +6042,7 @@ function openBrowser(url) {
|
|
|
5961
6042
|
}
|
|
5962
6043
|
async function runAuthorize(opts) {
|
|
5963
6044
|
const config = loadConfig(opts.token);
|
|
5964
|
-
const
|
|
5965
|
-
const returnUrl = `${DEFAULT_WEB_BASE}/v3/${tradeSegment}/cso/ManageAccounts`;
|
|
6045
|
+
const returnUrl = `${DEFAULT_WEB_BASE}/v3/foreign_trade/cso/ManageAccounts`;
|
|
5966
6046
|
const url = `${config.apiBaseUrl}/command/media-account/link/${encodeURIComponent(opts.mediaType)}?returnUrl=${encodeURIComponent(returnUrl)}`;
|
|
5967
6047
|
let redirectUrl;
|
|
5968
6048
|
try {
|
|
@@ -5984,7 +6064,15 @@ function cmdConfigShow() {
|
|
|
5984
6064
|
const shared = readSharedConfig();
|
|
5985
6065
|
if (!shared.authToken) {
|
|
5986
6066
|
console.log(
|
|
5987
|
-
|
|
6067
|
+
`
|
|
6068
|
+
\u5C1A\u672A\u914D\u7F6E Token\u3002
|
|
6069
|
+
|
|
6070
|
+
\u5982\u679C\u4F60\u8FD8\u6CA1\u6709 Siluzan \u8D26\u53F7\uFF0C\u8BF7\u5148\u6CE8\u518C\uFF1A
|
|
6071
|
+
\u{1F449} ${DEFAULT_WEB_BASE}
|
|
6072
|
+
|
|
6073
|
+
\u6CE8\u518C\u767B\u5F55\u540E\u8FDB\u5165\u300C\u4E2A\u4EBA\u8BBE\u7F6E \u2192 API Token\u300D\u590D\u5236\u4F60\u7684 Token\uFF0C\u7136\u540E\u8FD0\u884C\uFF1A
|
|
6074
|
+
siluzan-cso login
|
|
6075
|
+
`
|
|
5988
6076
|
);
|
|
5989
6077
|
return;
|
|
5990
6078
|
}
|
|
@@ -6073,14 +6161,13 @@ program.command("init").description("\u5C06 Skill \u6587\u4EF6\u5199\u5165\u6307
|
|
|
6073
6161
|
apiBaseUrl: opts.apiBase ?? "https://api.siluzan.com"
|
|
6074
6162
|
});
|
|
6075
6163
|
});
|
|
6076
|
-
program.command("authorize").description("\u53D1\u8D77\
|
|
6164
|
+
program.command("authorize").description("\u53D1\u8D77\u5A92\u4F53\u5E73\u53F0 OAuth \u6388\u6743\uFF08YouTube/TikTok/Instagram/Facebook/LinkedIn \u7B49\uFF09\uFF0C\u5728\u6D4F\u89C8\u5668\u4E2D\u5B8C\u6210\u6388\u6743\u540E\u8DF3\u56DE\u4E1D\u8DEF\u8D5E\u8D26\u53F7\u7BA1\u7406\u9875").requiredOption("--media-type <type>", "\u5A92\u4F53\u5E73\u53F0\u7C7B\u578B\uFF0C\u5982 YouTube / TikTok / Instagram / Facebook / LinkedIn").option("-t, --token <token>", "Token\uFF08\u53EF\u9009\uFF1B\u4F18\u5148\u4E8E ~/.siluzan/config.json\uFF09").option("--verbose", "\u663E\u793A\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(async (opts) => {
|
|
6077
6165
|
await runAuthorize(opts);
|
|
6078
6166
|
});
|
|
6079
|
-
program.command("list-accounts").description("\u5217\u51FA\u5A92\u4F53\u8D26\u53F7\u5217\u8868\uFF0C\u9ED8\u8BA4\u5C55\u793A\u7C89\u4E1D\u6570/\u4F5C\u54C1\u6570/\u64AD\u653E\u6570\u7B49\u6570\u636E\u603B\u89C8\uFF1B\u652F\u6301\u5206\u9875\u3001\u5E73\u53F0/\u540D\u79F0/\u72B6\u6001/\u8D1F\u8D23\u4EBA\u8FC7\u6EE4").option("--
|
|
6167
|
+
program.command("list-accounts").description("\u5217\u51FA\u5A92\u4F53\u8D26\u53F7\u5217\u8868\uFF0C\u9ED8\u8BA4\u5C55\u793A\u7C89\u4E1D\u6570/\u4F5C\u54C1\u6570/\u64AD\u653E\u6570\u7B49\u6570\u636E\u603B\u89C8\uFF1B\u652F\u6301\u5206\u9875\u3001\u5E73\u53F0/\u540D\u79F0/\u72B6\u6001/\u8D1F\u8D23\u4EBA\u8FC7\u6EE4").option("--name <name>", "\u6309\u8D26\u53F7\u540D\u79F0\u6A21\u7CCA\u641C\u7D22").option("--media-type <type>", "\u6309\u5E73\u53F0\u7C7B\u578B\u8FC7\u6EE4\uFF08\u5982 \u6296\u97F3\u3001YouTube\u3001TikTok \u7B49\uFF09").option("--state <state>", "\u6309\u72B6\u6001\u8FC7\u6EE4\uFF1Aall\uFF08\u5168\u90E8\uFF09| normal\uFF08\u6B63\u5E38\uFF09| abnormal\uFF08\u5F02\u5E38/\u8FC7\u671F\uFF09\uFF0C\u9ED8\u8BA4 all", "all").option("--owner <owner>", "\u6309\u8D1F\u8D23\u4EBA\u8FC7\u6EE4\uFF08\u4F20\u5165\u7528\u6237 ID\uFF0C\u53EF\u4ECE --json \u8FD4\u56DE\u7684 ownerInfo[].id \u5B57\u6BB5\u83B7\u53D6\uFF09").option("--page <n>", "\u9875\u7801\uFF08\u9ED8\u8BA4 1\uFF09", "1").option("--page-size <n>", "\u6BCF\u9875\u6761\u6570\uFF08\u9ED8\u8BA4 20\uFF09", "20").option("--no-overview", "\u5173\u95ED\u603B\u89C8\u6A21\u5F0F\uFF0C\u6539\u4E3A\u5C55\u793A\u57FA\u7840\u8D26\u53F7\u4FE1\u606F\uFF08\u8D26\u53F7ID/\u6388\u6743\u72B6\u6001/Token\u5230\u671F\u7B49\uFF09").option("--json", "\u4EE5 JSON \u8F93\u51FA\u8D26\u53F7\u5217\u8868\uFF08\u542B\u603B\u89C8\u6570\u636E\uFF0C\u7528\u4E8E\u811A\u672C\u6216\u914D\u7F6E\u6587\u4EF6\uFF09", false).option("--unicode", "\u4F7F\u7528 Unicode \u7EBF\u6846\u8868\u683C\uFF08\u9ED8\u8BA4 ASCII +-|\uFF09", false).option("--verbose", "\u663E\u793A\u5B8C\u6574\u4EE4\u724C\u6807\u8BC6\uFF08\u9ED8\u8BA4\u8131\u654F\uFF09", false).action(async (opts) => {
|
|
6080
6168
|
const state = opts.state;
|
|
6081
6169
|
await runListAccounts({
|
|
6082
6170
|
token: opts.token,
|
|
6083
|
-
domestic: opts.domestic,
|
|
6084
6171
|
name: opts.name,
|
|
6085
6172
|
mediaType: opts.mediaType,
|
|
6086
6173
|
state: state === "all" ? void 0 : state,
|
|
@@ -6094,29 +6181,27 @@ program.command("list-accounts").description("\u5217\u51FA\u5A92\u4F53\u8D26\u53
|
|
|
6094
6181
|
});
|
|
6095
6182
|
});
|
|
6096
6183
|
var accountGroupCmd = program.command("account-group").description("\u8D26\u53F7\u5206\u7EC4\u7BA1\u7406\uFF1A\u67E5\u8BE2\u3001\u65B0\u5EFA\u3001\u7F16\u8F91\u3001\u5220\u9664\u5206\u7EC4");
|
|
6097
|
-
accountGroupCmd.command("list").description("\u67E5\u8BE2\u8D26\u53F7\u5206\u7EC4\u5217\u8868").option("-t, --token <token>", "Token\uFF08\u53EF\u9009\uFF1B\u4F18\u5148\u4E8E ~/.siluzan/config.json\uFF09").option("--
|
|
6184
|
+
accountGroupCmd.command("list").description("\u67E5\u8BE2\u8D26\u53F7\u5206\u7EC4\u5217\u8868").option("-t, --token <token>", "Token\uFF08\u53EF\u9009\uFF1B\u4F18\u5148\u4E8E ~/.siluzan/config.json\uFF09").option("--json", "\u4EE5 JSON \u683C\u5F0F\u8F93\u51FA\u5B8C\u6574\u5206\u7EC4\u6570\u636E\uFF08\u542B mediaAccountInfos\uFF09", false).option("--unicode", "\u4F7F\u7528 Unicode \u7EBF\u6846\u8868\u683C\uFF08\u9ED8\u8BA4 ASCII +-|\uFF09", false).option("--verbose", "\u663E\u793A\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(async (opts) => {
|
|
6098
6185
|
await runAccountGroupList({
|
|
6099
6186
|
token: opts.token,
|
|
6100
|
-
domestic: opts.domestic,
|
|
6101
6187
|
json: opts.json,
|
|
6102
6188
|
unicode: opts.unicode,
|
|
6103
6189
|
verbose: opts.verbose
|
|
6104
6190
|
});
|
|
6105
6191
|
});
|
|
6106
|
-
accountGroupCmd.command("create").description("\u65B0\u5EFA\u8D26\u53F7\u5206\u7EC4").option("-t, --token <token>", "Token\uFF08\u53EF\u9009\uFF1B\u4F18\u5148\u4E8E ~/.siluzan/config.json\uFF09").requiredOption("--name <name>", "\u5206\u7EC4\u540D\u79F0").option(
|
|
6192
|
+
accountGroupCmd.command("create").description("\u65B0\u5EFA\u8D26\u53F7\u5206\u7EC4").option("-t, --token <token>", "Token\uFF08\u53EF\u9009\uFF1B\u4F18\u5148\u4E8E ~/.siluzan/config.json\uFF09").requiredOption("--name <name>", "\u5206\u7EC4\u540D\u79F0").option(
|
|
6107
6193
|
"--accounts <ids>",
|
|
6108
6194
|
"\u7EC4\u5185\u8D26\u53F7\u7684 mediaCustomerId\uFF0C\u9017\u53F7\u5206\u9694\uFF08\u53EF\u4ECE list-accounts --json \u83B7\u53D6\uFF09"
|
|
6109
6195
|
).option("--json", "\u4EE5 JSON \u683C\u5F0F\u8F93\u51FA\u7ED3\u679C", false).option("--verbose", "\u663E\u793A\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(async (opts) => {
|
|
6110
6196
|
await runAccountGroupCreate({
|
|
6111
6197
|
token: opts.token,
|
|
6112
6198
|
name: opts.name,
|
|
6113
|
-
domestic: opts.domestic,
|
|
6114
6199
|
accounts: opts.accounts,
|
|
6115
6200
|
json: opts.json,
|
|
6116
6201
|
verbose: opts.verbose
|
|
6117
6202
|
});
|
|
6118
6203
|
});
|
|
6119
|
-
accountGroupCmd.command("update").description("\u7F16\u8F91\u5DF2\u6709\u8D26\u53F7\u5206\u7EC4\uFF08\u66F4\u65B0\u540D\u79F0\u6216\u8D26\u53F7\u5217\u8868\uFF09").option("-t, --token <token>", "Token\uFF08\u53EF\u9009\uFF1B\u4F18\u5148\u4E8E ~/.siluzan/config.json\uFF09").requiredOption("--id <groupId>", "\u5206\u7EC4 ID\uFF08\u6765\u81EA account-group list \u7684 id \u5B57\u6BB5\uFF09").requiredOption("--name <name>", "\u65B0\u5206\u7EC4\u540D\u79F0").option(
|
|
6204
|
+
accountGroupCmd.command("update").description("\u7F16\u8F91\u5DF2\u6709\u8D26\u53F7\u5206\u7EC4\uFF08\u66F4\u65B0\u540D\u79F0\u6216\u8D26\u53F7\u5217\u8868\uFF09").option("-t, --token <token>", "Token\uFF08\u53EF\u9009\uFF1B\u4F18\u5148\u4E8E ~/.siluzan/config.json\uFF09").requiredOption("--id <groupId>", "\u5206\u7EC4 ID\uFF08\u6765\u81EA account-group list \u7684 id \u5B57\u6BB5\uFF09").requiredOption("--name <name>", "\u65B0\u5206\u7EC4\u540D\u79F0").option(
|
|
6120
6205
|
"--accounts <ids>",
|
|
6121
6206
|
"\u7EC4\u5185\u8D26\u53F7\u7684 mediaCustomerId\uFF0C\u9017\u53F7\u5206\u9694\uFF1B\u4E0D\u4F20\u5219\u6E05\u7A7A\u5206\u7EC4\u5185\u8D26\u53F7"
|
|
6122
6207
|
).option("--json", "\u4EE5 JSON \u683C\u5F0F\u8F93\u51FA\u7ED3\u679C", false).option("--verbose", "\u663E\u793A\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(async (opts) => {
|
|
@@ -6124,7 +6209,6 @@ accountGroupCmd.command("update").description("\u7F16\u8F91\u5DF2\u6709\u8D26\u5
|
|
|
6124
6209
|
token: opts.token,
|
|
6125
6210
|
id: opts.id,
|
|
6126
6211
|
name: opts.name,
|
|
6127
|
-
domestic: opts.domestic,
|
|
6128
6212
|
accounts: opts.accounts,
|
|
6129
6213
|
json: opts.json,
|
|
6130
6214
|
verbose: opts.verbose
|
|
@@ -6138,6 +6222,24 @@ accountGroupCmd.command("delete").description("\u5220\u9664\u8D26\u53F7\u5206\u7
|
|
|
6138
6222
|
verbose: opts.verbose
|
|
6139
6223
|
});
|
|
6140
6224
|
});
|
|
6225
|
+
accountGroupCmd.command("add-accounts").description("\u5411\u5206\u7EC4\u8FFD\u52A0\u8D26\u53F7\uFF08\u81EA\u52A8\u5408\u5E76\uFF0C\u4E0D\u5F71\u54CD\u5DF2\u6709\u8D26\u53F7\uFF09").option("-t, --token <token>", "Token\uFF08\u53EF\u9009\uFF1B\u4F18\u5148\u4E8E ~/.siluzan/config.json\uFF09").requiredOption("--id <groupId>", "\u5206\u7EC4 ID\uFF08\u6765\u81EA account-group list \u7684 id \u5B57\u6BB5\uFF09").requiredOption("--accounts <ids>", "\u8981\u6DFB\u52A0\u7684 mediaCustomerId\uFF0C\u9017\u53F7\u5206\u9694").option("--json", "\u4EE5 JSON \u683C\u5F0F\u8F93\u51FA\u7ED3\u679C", false).option("--verbose", "\u663E\u793A\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(async (opts) => {
|
|
6226
|
+
await runAccountGroupAddAccounts({
|
|
6227
|
+
token: opts.token,
|
|
6228
|
+
id: opts.id,
|
|
6229
|
+
accounts: opts.accounts,
|
|
6230
|
+
json: opts.json,
|
|
6231
|
+
verbose: opts.verbose
|
|
6232
|
+
});
|
|
6233
|
+
});
|
|
6234
|
+
accountGroupCmd.command("remove-accounts").description("\u4ECE\u5206\u7EC4\u79FB\u9664\u6307\u5B9A\u8D26\u53F7\uFF08\u4E0D\u5F71\u54CD\u5176\u4ED6\u5DF2\u6709\u8D26\u53F7\uFF09").option("-t, --token <token>", "Token\uFF08\u53EF\u9009\uFF1B\u4F18\u5148\u4E8E ~/.siluzan/config.json\uFF09").requiredOption("--id <groupId>", "\u5206\u7EC4 ID\uFF08\u6765\u81EA account-group list \u7684 id \u5B57\u6BB5\uFF09").requiredOption("--accounts <ids>", "\u8981\u79FB\u9664\u7684 mediaCustomerId\uFF0C\u9017\u53F7\u5206\u9694").option("--json", "\u4EE5 JSON \u683C\u5F0F\u8F93\u51FA\u7ED3\u679C", false).option("--verbose", "\u663E\u793A\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(async (opts) => {
|
|
6235
|
+
await runAccountGroupRemoveAccounts({
|
|
6236
|
+
token: opts.token,
|
|
6237
|
+
id: opts.id,
|
|
6238
|
+
accounts: opts.accounts,
|
|
6239
|
+
json: opts.json,
|
|
6240
|
+
verbose: opts.verbose
|
|
6241
|
+
});
|
|
6242
|
+
});
|
|
6141
6243
|
program.command("list-members").description("\u5217\u51FA\u516C\u53F8\u6240\u6709\u6210\u5458\uFF0C\u663E\u793A\u7528\u6237ID\u4F9B list-accounts --owner \u4F7F\u7528").option("-t, --token <token>", "Token\uFF08\u53EF\u9009\uFF1B\u4F18\u5148\u4E8E ~/.siluzan/config.json\uFF09").option("-q, --query <keyword>", "\u6309\u59D3\u540D\u6216\u624B\u673A\u53F7\u6A21\u7CCA\u641C\u7D22").option("--json", "\u4EE5 JSON \u8F93\u51FA\u6210\u5458\u5217\u8868", false).option("--unicode", "\u4F7F\u7528 Unicode \u7EBF\u6846\u8868\u683C\uFF08\u9ED8\u8BA4 ASCII +-|\uFF09", false).option("--verbose", "\u8F93\u51FA\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(async (opts) => {
|
|
6142
6244
|
await runListMembers({
|
|
6143
6245
|
token: opts.token,
|
|
@@ -6190,16 +6292,16 @@ var reportCmd = program.command("report").description("\u8FD0\u8425\u62A5\u8868\
|
|
|
6190
6292
|
reportCmd.command("fetch").description("\u6309\u5A92\u4F53/\u65E5\u671F\u62C9\u53D6\u8FD0\u8425\u62A5\u8868\u6A21\u5757\u6570\u636E\uFF08\u8986\u76D6 table \u9875\u4E3B\u8981\u67E5\u8BE2\u63A5\u53E3\uFF09").requiredOption("--media <mediaType>", "\u5A92\u4F53\u7C7B\u578B\uFF0C\u5982 Douyin / YouTube / TikTokBusinessAccount / Twitter").option("--maids <ids...>", "\u5A92\u4F53\u8D26\u53F7list-accounts\u83B7\u53D6\u7684[mediaCustomerId] ID\uFF0C\u652F\u6301\u7A7A\u683C\u5206\u9694\u6216\u9017\u53F7\u5206\u9694\uFF1B\u4E0D\u4F20\u8868\u793A\u8BE5\u5A92\u4F53\u5168\u90E8\u8D26\u53F7").option("--days <n>", "\u8FD1 N \u5929\uFF08\u4ECE\u6628\u5929\u5F80\u56DE\u7B97\uFF09\uFF1A7=\u8FD1 7 \u5929\uFF0C30=\u8FD1 30 \u5929\uFF08\u9ED8\u8BA4\uFF09\uFF0C90/180 \u7B49\uFF0C\u4F18\u5148\u7EA7\u4F4E\u4E8E --start/--end").option("--start <date>", "\u5F00\u59CB\u65F6\u95F4\uFF08\u672C\u5730\u65F6\u533A\uFF0CYYYY-MM-DD \u6216 ISO \u65E5\u671F\u65F6\u95F4\uFF09").option("--end <date>", "\u7ED3\u675F\u65F6\u95F4\uFF08\u672C\u5730\u65F6\u533A\uFF0CYYYY-MM-DD \u6216 ISO \u65E5\u671F\u65F6\u95F4\uFF09").option("--method <Day|Week|Moth>", "\u805A\u5408\u7EF4\u5EA6\uFF08\u4E0E Web table \u4FDD\u6301\u4E00\u81F4\uFF09", "Day").option(
|
|
6191
6293
|
"--include <modules...>",
|
|
6192
6294
|
"\u9700\u8981\u62C9\u53D6\u7684\u6A21\u5757\uFF0C\u652F\u6301\u9017\u53F7\u5206\u9694\uFF1Aoperation,total-fans,fans-analysis,hot-topic,works,hot-comment-word,comment-top10,video-duration,video-distribution,comment-trend,fans-trend,new-fans-trend,homepage-visit"
|
|
6193
|
-
).option("--order <play|digg|fullplay>", "works \u6A21\u5757\u6392\u5E8F\u5B57\u6BB5", "play").option("
|
|
6295
|
+
).option("--order <play|digg|fullplay>", "works \u6A21\u5757\u6392\u5E8F\u5B57\u6BB5", "play").option("-t, --token <token>", "Token\uFF08\u53EF\u9009\uFF1B\u4F18\u5148\u4E8E ~/.siluzan/config.json\uFF09").option("--json", "\u8F93\u51FA\u5B8C\u6574 JSON\uFF08\u9002\u5408\u811A\u672C\u5904\u7406\uFF09", false).option("--unicode", "\u4F7F\u7528 Unicode \u7EBF\u6846\u8868\u683C\uFF08\u9ED8\u8BA4 ASCII\uFF09", false).option("--verbose", "\u663E\u793A\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(async (opts) => {
|
|
6194
6296
|
await runReportFetch({
|
|
6195
6297
|
...opts,
|
|
6196
6298
|
days: opts.days ? parseInt(opts.days, 10) : void 0
|
|
6197
6299
|
});
|
|
6198
6300
|
});
|
|
6199
|
-
reportCmd.command("records").description("\u67E5\u8BE2\u8FD0\u8425\u62A5\u8868\u5BFC\u51FA\u8BB0\u5F55\uFF08\u5BF9\u5E94 table \u5BFC\u51FA\u8BB0\u5F55\u5F39\u7A97\uFF09").option("--
|
|
6301
|
+
reportCmd.command("records").description("\u67E5\u8BE2\u8FD0\u8425\u62A5\u8868\u5BFC\u51FA\u8BB0\u5F55\uFF08\u5BF9\u5E94 table \u5BFC\u51FA\u8BB0\u5F55\u5F39\u7A97\uFF09").option("--page <number>", "\u9875\u7801\uFF08\u9ED8\u8BA4 1\uFF09").option("--page-size <number>", "\u6BCF\u9875\u6761\u6570\uFF08\u9ED8\u8BA4 20\uFF09").option("-t, --token <token>", "Token\uFF08\u53EF\u9009\uFF1B\u4F18\u5148\u4E8E ~/.siluzan/config.json\uFF09").option("--json", "\u8F93\u51FA\u5B8C\u6574 JSON\uFF08\u9002\u5408\u811A\u672C\u5904\u7406\uFF09", false).option("--unicode", "\u4F7F\u7528 Unicode \u7EBF\u6846\u8868\u683C\uFF08\u9ED8\u8BA4 ASCII\uFF09", false).option("--verbose", "\u663E\u793A\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(async (opts) => {
|
|
6200
6302
|
await runReportRecords(opts);
|
|
6201
6303
|
});
|
|
6202
|
-
reportCmd.command("download").description("\u6309\u5BFC\u51FA\u8BB0\u5F55 ID \u4E0B\u8F7D\u8FD0\u8425\u62A5\u8868 PDF\uFF08\u5BF9\u5E94 table \u7684\u91CD\u65B0\u4E0B\u8F7D\uFF09").requiredOption("--id <recordId>", "\u5BFC\u51FA\u8BB0\u5F55 ID").option("
|
|
6304
|
+
reportCmd.command("download").description("\u6309\u5BFC\u51FA\u8BB0\u5F55 ID \u4E0B\u8F7D\u8FD0\u8425\u62A5\u8868 PDF\uFF08\u5BF9\u5E94 table \u7684\u91CD\u65B0\u4E0B\u8F7D\uFF09").requiredOption("--id <recordId>", "\u5BFC\u51FA\u8BB0\u5F55 ID").option("-o, --output <path>", "\u8F93\u51FA PDF \u8DEF\u5F84\uFF08\u9ED8\u8BA4\u5F53\u524D\u76EE\u5F55\u81EA\u52A8\u547D\u540D\uFF09").option("--url-only", "\u4EC5\u8F93\u51FA\u4E0B\u8F7D URL\uFF0C\u4E0D\u843D\u76D8", false).option("-t, --token <token>", "Token\uFF08\u53EF\u9009\uFF1B\u4F18\u5148\u4E8E ~/.siluzan/config.json\uFF09").option("--verbose", "\u663E\u793A\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(async (opts) => {
|
|
6203
6305
|
await runReportDownload(opts);
|
|
6204
6306
|
});
|
|
6205
6307
|
var planningCmd = program.command("planning").description("AI \u5185\u5BB9\u89C4\u5212\uFF08planning\uFF09\uFF1A\u4F01\u4E1A\u5217\u8868\u3001\u5185\u5BB9\u7C7B\u578B\u3001\u751F\u6210\u3001\u4EFB\u52A1\u7BA1\u7406\u3001\u8BE6\u60C5\u4E0E\u5BFC\u51FA");
|
|
@@ -6239,10 +6341,10 @@ planningExportCmd.command("txt").description("\u5BFC\u51FA\u89C4\u5212\u4E3A TXT
|
|
|
6239
6341
|
await runPlanningExportTxt(opts);
|
|
6240
6342
|
});
|
|
6241
6343
|
var taskCmd = program.command("task").description("\u4EFB\u52A1\u7BA1\u7406\uFF08taskManage\uFF09\uFF1A\u5217\u8868\u7B5B\u9009\u3001\u8BE6\u60C5\u3001\u4EFB\u52A1\u64CD\u4F5C\u3001\u53D1\u5E03\u9879\u64CD\u4F5C\u3001\u8BC4\u8BBA\u64CD\u4F5C");
|
|
6242
|
-
taskCmd.command("list").description("\u67E5\u8BE2\u4EFB\u52A1\u5217\u8868\uFF08\u652F\u6301\u72B6\u6001/\u65F6\u95F4/\u7C7B\u578B/\u5173\u952E\u8BCD/\u5F02\u5E38\u4EFB\u52A1\u7B5B\u9009\uFF09").option("--page <number>", "\u9875\u7801\uFF08\u9ED8\u8BA4 1\uFF09").option("--size <number>", "\u6BCF\u9875\u6761\u6570\uFF08\u9ED8\u8BA4 10\uFF09").option("--status <-1|0|1|2>", "\u72B6\u6001\uFF1A-1 \u5168\u90E8\uFF0C0 \u6267\u884C\u4E2D\uFF0C1 \u5DF2\u5B8C\u6210\uFF0C2 \u5DF2\u4E2D\u6B62").option("--asc", "\u6309\u521B\u5EFA\u65F6\u95F4\u5347\u5E8F\uFF08\u9ED8\u8BA4\u964D\u5E8F\uFF09", false).option("--search-type <task-name|creator>", "\u5173\u952E\u8BCD\u5B57\u6BB5\uFF08\u9ED8\u8BA4 task-name\uFF09", "task-name").option("--keyword <text>", "\u5173\u952E\u8BCD\uFF08\u914D\u5408 --search-type \u4F7F\u7528\uFF09").option("--creator <name>", "\u6309\u521B\u5EFA\u4EBA\u7B5B\u9009\uFF08\u4F18\u5148\u7EA7\u9AD8\u4E8E --keyword + --search-type creator\uFF09").option("--mine", "\u4EC5\u770B\u6211\u521B\u5EFA\u7684\uFF08\u9700\u540C\u65F6\u63D0\u4F9B --mine-name\uFF09", false).option("--mine-name <name>", "\u6211\u7684\u7528\u6237\u540D\uFF08\u7528\u4E8E --mine\uFF09").option("--failed-only", "\u4EC5\u67E5\u770B\u5F02\u5E38\u4EFB\u52A1\uFF08nolyFailed=true\uFF09", false).option("--content-type <all|video|image-text>", "\u5185\u5BB9\u7C7B\u578B\u7B5B\u9009", "all").option("--date-preset <all|week|month|year>", "\u5FEB\u6377\u65F6\u95F4\u8303\u56F4", "all").option("--start-date <YYYY-MM-DD>", "\u81EA\u5B9A\u4E49\u5F00\u59CB\u65E5\u671F\uFF08\u4E0E --end-date \u540C\u65F6\u4F7F\u7528\uFF09").option("--end-date <YYYY-MM-DD>", "\u81EA\u5B9A\u4E49\u7ED3\u675F\u65E5\u671F\uFF08\u4E0E --start-date \u540C\u65F6\u4F7F\u7528\uFF09").option("
|
|
6344
|
+
taskCmd.command("list").description("\u67E5\u8BE2\u4EFB\u52A1\u5217\u8868\uFF08\u652F\u6301\u72B6\u6001/\u65F6\u95F4/\u7C7B\u578B/\u5173\u952E\u8BCD/\u5F02\u5E38\u4EFB\u52A1\u7B5B\u9009\uFF09").option("--page <number>", "\u9875\u7801\uFF08\u9ED8\u8BA4 1\uFF09").option("--size <number>", "\u6BCF\u9875\u6761\u6570\uFF08\u9ED8\u8BA4 10\uFF09").option("--status <-1|0|1|2>", "\u72B6\u6001\uFF1A-1 \u5168\u90E8\uFF0C0 \u6267\u884C\u4E2D\uFF0C1 \u5DF2\u5B8C\u6210\uFF0C2 \u5DF2\u4E2D\u6B62").option("--asc", "\u6309\u521B\u5EFA\u65F6\u95F4\u5347\u5E8F\uFF08\u9ED8\u8BA4\u964D\u5E8F\uFF09", false).option("--search-type <task-name|creator>", "\u5173\u952E\u8BCD\u5B57\u6BB5\uFF08\u9ED8\u8BA4 task-name\uFF09", "task-name").option("--keyword <text>", "\u5173\u952E\u8BCD\uFF08\u914D\u5408 --search-type \u4F7F\u7528\uFF09").option("--creator <name>", "\u6309\u521B\u5EFA\u4EBA\u7B5B\u9009\uFF08\u4F18\u5148\u7EA7\u9AD8\u4E8E --keyword + --search-type creator\uFF09").option("--mine", "\u4EC5\u770B\u6211\u521B\u5EFA\u7684\uFF08\u9700\u540C\u65F6\u63D0\u4F9B --mine-name\uFF09", false).option("--mine-name <name>", "\u6211\u7684\u7528\u6237\u540D\uFF08\u7528\u4E8E --mine\uFF09").option("--failed-only", "\u4EC5\u67E5\u770B\u5F02\u5E38\u4EFB\u52A1\uFF08nolyFailed=true\uFF09", false).option("--content-type <all|video|image-text>", "\u5185\u5BB9\u7C7B\u578B\u7B5B\u9009", "all").option("--date-preset <all|week|month|year>", "\u5FEB\u6377\u65F6\u95F4\u8303\u56F4", "all").option("--start-date <YYYY-MM-DD>", "\u81EA\u5B9A\u4E49\u5F00\u59CB\u65E5\u671F\uFF08\u4E0E --end-date \u540C\u65F6\u4F7F\u7528\uFF09").option("--end-date <YYYY-MM-DD>", "\u81EA\u5B9A\u4E49\u7ED3\u675F\u65E5\u671F\uFF08\u4E0E --start-date \u540C\u65F6\u4F7F\u7528\uFF09").option("-t, --token <token>", "Token\uFF08\u53EF\u9009\uFF1B\u4F18\u5148\u4E8E ~/.siluzan/config.json\uFF09").option("--json", "\u8F93\u51FA\u5B8C\u6574 JSON\uFF08\u9002\u5408\u811A\u672C\u5904\u7406\uFF09", false).option("--unicode", "\u4F7F\u7528 Unicode \u7EBF\u6846\u8868\u683C\uFF08\u9ED8\u8BA4 ASCII\uFF09", false).option("--verbose", "\u663E\u793A\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(async (opts) => {
|
|
6243
6345
|
await runTaskList(opts);
|
|
6244
6346
|
});
|
|
6245
|
-
taskCmd.command("detail").description("\u67E5\u770B\u4EFB\u52A1\u8BE6\u60C5\u53D1\u5E03\u9879\u5217\u8868\uFF08\u5BF9\u5E94\u8BE6\u60C5\u62BD\u5C49\uFF09").requiredOption("--publish-id <id>", "\u4EFB\u52A1 ID").option("--media <nameOrId>", "\u5A92\u4F53\u7C7B\u578B\uFF08\u5982 Douyin / YouTube\uFF0C\u6216\u6570\u5B57 ID\uFF09").option("--page <number>", "\u9875\u7801\uFF08\u9ED8\u8BA4 1\uFF09").option("--size <number>", "\u6BCF\u9875\u6761\u6570\uFF08\u9ED8\u8BA4 10\uFF09").option("
|
|
6347
|
+
taskCmd.command("detail").description("\u67E5\u770B\u4EFB\u52A1\u8BE6\u60C5\u53D1\u5E03\u9879\u5217\u8868\uFF08\u5BF9\u5E94\u8BE6\u60C5\u62BD\u5C49\uFF09").requiredOption("--publish-id <id>", "\u4EFB\u52A1 ID").option("--media <nameOrId>", "\u5A92\u4F53\u7C7B\u578B\uFF08\u5982 Douyin / YouTube\uFF0C\u6216\u6570\u5B57 ID\uFF09").option("--page <number>", "\u9875\u7801\uFF08\u9ED8\u8BA4 1\uFF09").option("--size <number>", "\u6BCF\u9875\u6761\u6570\uFF08\u9ED8\u8BA4 10\uFF09").option("-t, --token <token>", "Token\uFF08\u53EF\u9009\uFF1B\u4F18\u5148\u4E8E ~/.siluzan/config.json\uFF09").option("--json", "\u8F93\u51FA\u5B8C\u6574 JSON\uFF08\u9002\u5408\u811A\u672C\u5904\u7406\uFF09", false).option("--unicode", "\u4F7F\u7528 Unicode \u7EBF\u6846\u8868\u683C\uFF08\u9ED8\u8BA4 ASCII\uFF09", false).option("--verbose", "\u663E\u793A\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(async (opts) => {
|
|
6246
6348
|
await runTaskDetail(opts);
|
|
6247
6349
|
});
|
|
6248
6350
|
taskCmd.command("start").description("\u542F\u52A8\u4EFB\u52A1\uFF08\u5BF9\u5E94 taskManage \u7684 startTask\uFF09").requiredOption("--publish-id <id>", "\u4EFB\u52A1 ID").option("-t, --token <token>", "Token\uFF08\u53EF\u9009\uFF09").option("--verbose", "\u663E\u793A\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(async (opts) => {
|
|
@@ -6271,7 +6373,7 @@ taskItemCmd.command("run-now").description("\u7ACB\u5373\u53D1\u5E03\u5355\u4E2A
|
|
|
6271
6373
|
await runTaskItemRunNow(opts);
|
|
6272
6374
|
});
|
|
6273
6375
|
var taskCommentCmd = taskCmd.command("comment").description("\u4EFB\u52A1\u8BE6\u60C5\u4E2D\u7684\u8BC4\u8BBA\u67E5\u8BE2\u4E0E\u56DE\u590D");
|
|
6274
|
-
taskCommentCmd.command("list").description("\u6309\u89C6\u9891\u67E5\u8BE2\u8BC4\u8BBA\u5217\u8868").requiredOption("--media-type <nameOrId>", "\u5A92\u4F53\u7C7B\u578B\uFF08\u5982 Douyin / YouTube \u6216\u6570\u5B57 ID\uFF09").requiredOption("--video-id <id>", "\u89C6\u9891 ID").requiredOption("--media-customer-id <id>", "\u5A92\u4F53\u8D26\u53F7 ID").option("
|
|
6376
|
+
taskCommentCmd.command("list").description("\u6309\u89C6\u9891\u67E5\u8BE2\u8BC4\u8BBA\u5217\u8868").requiredOption("--media-type <nameOrId>", "\u5A92\u4F53\u7C7B\u578B\uFF08\u5982 Douyin / YouTube \u6216\u6570\u5B57 ID\uFF09").requiredOption("--video-id <id>", "\u89C6\u9891 ID").requiredOption("--media-customer-id <id>", "\u5A92\u4F53\u8D26\u53F7 ID").option("-t, --token <token>", "Token\uFF08\u53EF\u9009\uFF09").option("--json", "\u8F93\u51FA JSON", false).option("--unicode", "\u4F7F\u7528 Unicode \u7EBF\u6846\u8868\u683C\uFF08\u9ED8\u8BA4 ASCII\uFF09", false).option("--verbose", "\u663E\u793A\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(async (opts) => {
|
|
6275
6377
|
await runTaskCommentList(opts);
|
|
6276
6378
|
});
|
|
6277
6379
|
program.parse();
|
package/dist/skill/SKILL.md
CHANGED
|
@@ -20,13 +20,14 @@ description_en: >-
|
|
|
20
20
|
| `siluzan-cso update` | 更新 CLI 版本并刷新 Skill 文件 | `references/setup.md` |
|
|
21
21
|
| `siluzan-cso authorize --media-type <平台>` | 发起媒体账号 OAuth 授权 | `references/authorize.md` |
|
|
22
22
|
| `siluzan-cso list-accounts` | 列出媒体账号,获取账号 ID / 数据总览 | `references/list-accounts.md` |
|
|
23
|
-
| `siluzan-cso account-group list/create/update/delete` | 账号分组管理 | `references/account-group.md` |
|
|
23
|
+
| `siluzan-cso account-group list/create/add-accounts/remove-accounts/update/delete` | 账号分组管理 | `references/account-group.md` |
|
|
24
24
|
| `siluzan-cso upload -f <file>` | 上传视频 / 图片到素材库 | `references/upload.md` |
|
|
25
25
|
| `siluzan-cso extract-cover -f <video> -p <平台>` | 从视频截取封面帧 | `references/extract-cover.md` |
|
|
26
26
|
| `siluzan-cso publish -c config.json` | 提交多平台发布任务 | `references/publish.md` |
|
|
27
27
|
| `siluzan-cso task list/detail/item` | 查看任务状态 / 处理失败 / 重试 | `references/task.md` |
|
|
28
28
|
| `siluzan-cso report fetch --media <平台>` | 运营报表(核心指标 / 视频排行 / 趋势) | `references/report.md` |
|
|
29
29
|
| `siluzan-cso planning ...` | AI 内容规划:生成、监控、详情、导出 | `references/planning.md` |
|
|
30
|
+
| —(网页端) | CSO 后台全部页面 URL(含测试/生产环境) | `references/web-pages.md` |
|
|
30
31
|
|
|
31
32
|
---
|
|
32
33
|
|
|
@@ -44,6 +45,7 @@ description_en: >-
|
|
|
44
45
|
| 账号 Token 失效 / 重新授权 | `references/authorize.md` |
|
|
45
46
|
| 管理账号分组 | `references/account-group.md` |
|
|
46
47
|
| AI 内容规划 | `references/planning.md` |
|
|
48
|
+
| 需要给用户提供后台页面链接 | `references/web-pages.md` |
|
|
47
49
|
|
|
48
50
|
---
|
|
49
51
|
|
|
@@ -60,6 +62,46 @@ account-group ──需要 mediaCustomerId──► list-accounts
|
|
|
60
62
|
|
|
61
63
|
---
|
|
62
64
|
|
|
65
|
+
## AI 行为规范
|
|
66
|
+
|
|
67
|
+
### 执行任务的标准流程
|
|
68
|
+
|
|
69
|
+
遵循**计划 → 确认 → 执行 → 验证 → 预测**五步:
|
|
70
|
+
|
|
71
|
+
1. **计划**:根据用户意图,查阅上方命令索引找到对应 references 文档,制定操作步骤,不暴露命令行细节。
|
|
72
|
+
2. **确认**:与用户确认关键信息(目标账号、发布内容、时间等),不替用户做选择。
|
|
73
|
+
3. **执行**:按计划调用命令,处理异常。
|
|
74
|
+
4. **验证**:
|
|
75
|
+
- 写入/修改操作后,通过读取命令确认结果是否正确。
|
|
76
|
+
- 失败时优先尝试重试或用其他方式补救,而不是直接告知用户"任务失败"。
|
|
77
|
+
5. **预测**:任务完成后,结合当前结果对用户下一步操作给出合理建议。
|
|
78
|
+
|
|
79
|
+
### 硬规范
|
|
80
|
+
|
|
81
|
+
- **不确定时先读文档**:遇到不熟悉的命令,先查对应 references 文件,不猜参数。
|
|
82
|
+
- **先查账号再操作**:对具体账号做操作前,先用 `list-accounts --name <名称> --media-type <平台>` 确认账号存在且 Token 有效。
|
|
83
|
+
- **使用 `--json` 处理数据**:需要对返回结果做计算或筛选时,加 `--json` 再用 `node -e` 提取(`node -e "const d=require('fs').readFileSync('/dev/stdin','utf8'); ..."`)。
|
|
84
|
+
- **不猜账号 ID**:`entityId` ≠ `mediaCustomerId`,两者均须从 `list-accounts --json` 获取,不可假设。
|
|
85
|
+
- **严禁让用户执行命令**:除 `references/setup.md` 中的安装/登录命令外,所有 CLI 命令均由 AI 代替用户执行,禁止向用户透露任何命令行、参数或代码逻辑。
|
|
86
|
+
- **操作后必须验证**:完成发布、上传、分组等写操作后,需通过对应的查询命令确认结果。
|
|
87
|
+
|
|
88
|
+
### 必须遵守(违反将导致 skill 不可用)
|
|
89
|
+
|
|
90
|
+
- 输出的任何内容(计划、总结、报告)中,**严禁出现 CLI 命令**(setup.md 相关命令除外)。
|
|
91
|
+
- 每次执行前主动检查 CLI 版本,若需更新请先执行更新流程(详见 `references/setup.md`)。
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## 常见 HTTP 错误处理
|
|
96
|
+
|
|
97
|
+
| 状态码 | 原因 | 处理方式 |
|
|
98
|
+
|--------|------|----------|
|
|
99
|
+
| `400 Bad Request` | 参数错误 | 查对应 references 文档或用 `--help` 确认命令用法 |
|
|
100
|
+
| `401 Unauthorized` | 凭据失效 | 引导用户重新执行 `siluzan-cso login`(详见 `references/setup.md`) |
|
|
101
|
+
| `500 Internal Server Error` | 服务部署中或数据异常 | 稍后重试;若持续失败,提交给 Siluzan 相关人员处理 |
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
63
105
|
## 平台名称速查
|
|
64
106
|
|
|
65
107
|
`--media` / `--media-type` 参数值:
|
|
@@ -69,7 +111,8 @@ account-group ──需要 mediaCustomerId──► list-accounts
|
|
|
69
111
|
|
|
70
112
|
## Web 功能导航
|
|
71
113
|
|
|
72
|
-
> 无对应 CLI
|
|
73
|
-
|
|
114
|
+
> 无对应 CLI 命令的模块,或需要引导用户在网页端查看数据时,查阅 `references/web-pages.md` 获取完整页面清单与链接。
|
|
115
|
+
|
|
116
|
+
URL 格式:`https://www-ci.siluzan.com/v3/foreign_trade/cso/{页面}`
|
|
74
117
|
|
|
75
|
-
常用页面:`task`(任务管理)· `postVideo`(发布页)· `ManageAccounts`(账号管理)· `planning`(AI
|
|
118
|
+
常用页面:`task`(任务管理)· `postVideo`(发布页)· `ManageAccounts`(账号管理)· `planning`(AI 内容规划)· `table`(绩效报表)· `Workdata`(作品数据)
|
package/dist/skill/_meta.json
CHANGED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"title": "默认标题,所有平台共用",
|
|
18
18
|
"description": "描述(YouTube/Facebook 有独立描述字段,其他平台回落为标题)",
|
|
19
19
|
"topics": ["话题A", "话题B"],
|
|
20
|
+
"topicPosition": 2,
|
|
20
21
|
|
|
21
22
|
"cover": {
|
|
22
23
|
"imageUrl": "https://cdn.example.com/cover.jpg",
|
|
@@ -44,11 +45,14 @@
|
|
|
44
45
|
|
|
45
46
|
"publishMode": "immediate",
|
|
46
47
|
|
|
48
|
+
"youtubePrivacy": "public",
|
|
49
|
+
|
|
47
50
|
"platformOverrides": {
|
|
48
51
|
"YouTube": {
|
|
49
52
|
"title": "YouTube 专用标题(≤100字)",
|
|
50
53
|
"description": "YouTube 专用描述",
|
|
51
|
-
"topics": ["YouTubeTopic"]
|
|
54
|
+
"topics": ["YouTubeTopic"],
|
|
55
|
+
"topicPosition": 4
|
|
52
56
|
}
|
|
53
57
|
}
|
|
54
58
|
}
|
|
@@ -13,7 +13,9 @@
|
|
|
13
13
|
| 查某分组内有哪些账号 | `siluzan-cso account-group list --json` |
|
|
14
14
|
| 新建空分组 | `siluzan-cso account-group create --name <名称>` |
|
|
15
15
|
| 新建分组并添加账号 | `siluzan-cso account-group create --name <名称> --accounts <id1,id2>` |
|
|
16
|
-
|
|
|
16
|
+
| **向已有分组追加账号(不影响其他账号)** | `siluzan-cso account-group add-accounts --id <groupId> --accounts <ids>` |
|
|
17
|
+
| **从分组移除指定账号(不影响其他账号)** | `siluzan-cso account-group remove-accounts --id <groupId> --accounts <ids>` |
|
|
18
|
+
| 全量替换分组账号列表 | `siluzan-cso account-group update --id <groupId> --name <名称> --accounts <ids>` |
|
|
17
19
|
| 删除分组 | `siluzan-cso account-group delete --id <groupId>` |
|
|
18
20
|
|
|
19
21
|
---
|
|
@@ -48,18 +50,37 @@ siluzan-cso account-group create --name "TikTok 主账号" --accounts "id1,id2,i
|
|
|
48
50
|
|
|
49
51
|
---
|
|
50
52
|
|
|
51
|
-
###
|
|
53
|
+
### add-accounts — 追加账号(推荐)
|
|
52
54
|
|
|
53
55
|
```bash
|
|
54
|
-
#
|
|
55
|
-
siluzan-cso account-group
|
|
56
|
+
# 向分组追加一个或多个账号,已在组内的账号自动跳过(幂等)
|
|
57
|
+
siluzan-cso account-group add-accounts --id <groupId> --accounts "新id1,新id2"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
内部自动拉取当前账号列表再合并,**无需提前知道组内有哪些账号**。
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
### remove-accounts — 移除账号(推荐)
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
# 从分组移除指定账号,不在组内的账号自动跳过(幂等)
|
|
68
|
+
siluzan-cso account-group remove-accounts --id <groupId> --accounts "要移除的id1,id2"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
内部自动拉取当前账号列表再过滤,**无需提前知道组内完整列表**。
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
### update — 全量替换(慎用)
|
|
56
76
|
|
|
57
|
-
|
|
58
|
-
#
|
|
59
|
-
siluzan-cso account-group update --id <groupId> --name "
|
|
77
|
+
```bash
|
|
78
|
+
# 将分组账号列表替换为指定的完整列表(不传 --accounts 则清空!)
|
|
79
|
+
siluzan-cso account-group update --id <groupId> --name "分组名称" --accounts "id1,id2,id3"
|
|
60
80
|
```
|
|
61
81
|
|
|
62
|
-
> **注意:** 后端以传入的 `--accounts` 为准,不传时**清空**分组内所有账号。
|
|
82
|
+
> **注意:** 后端以传入的 `--accounts` 为准,不传时**清空**分组内所有账号。
|
|
83
|
+
> 需要增量操作时,请优先使用 `add-accounts` / `remove-accounts`。
|
|
63
84
|
|
|
64
85
|
---
|
|
65
86
|
|
|
@@ -73,17 +94,23 @@ siluzan-cso account-group delete --id <groupId>
|
|
|
73
94
|
|
|
74
95
|
---
|
|
75
96
|
|
|
76
|
-
##
|
|
97
|
+
## 典型流程
|
|
77
98
|
|
|
78
|
-
|
|
79
|
-
# Step 1:获取分组 ID 和当前账号列表
|
|
80
|
-
siluzan-cso account-group list --json
|
|
99
|
+
### 向已有分组添加新账号
|
|
81
100
|
|
|
82
|
-
|
|
101
|
+
```bash
|
|
102
|
+
# Step 1:获取新账号的 mediaCustomerId
|
|
83
103
|
siluzan-cso list-accounts --name "新账号名" --json
|
|
84
104
|
|
|
85
|
-
# Step
|
|
86
|
-
siluzan-cso account-group
|
|
105
|
+
# Step 2:直接追加(无需查当前列表)
|
|
106
|
+
siluzan-cso account-group add-accounts --id <groupId> --accounts "新id"
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 从分组移除某个账号
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
# 直接移除(无需查当前列表)
|
|
113
|
+
siluzan-cso account-group remove-accounts --id <groupId> --accounts "要移除的id"
|
|
87
114
|
```
|
|
88
115
|
|
|
89
116
|
---
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# web-pages — CSO 后台页面速查
|
|
2
|
+
|
|
3
|
+
> 当需要引导用户前往网页端查看数据或执行操作时,使用本文件中的页面链接。
|
|
4
|
+
> URL 格式:`https://www-ci.siluzan.com/v3/foreign_trade/cso/{页面路径}`
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 页面速查表
|
|
9
|
+
|
|
10
|
+
### 账号管理
|
|
11
|
+
|
|
12
|
+
| 页面 | 完整链接 | 功能说明 |
|
|
13
|
+
|------|----------|----------|
|
|
14
|
+
| 账号管理 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/ManageAccounts` | 绑定/授权/查看媒体账号列表、账号状态、Token 到期时间 |
|
|
15
|
+
| 账号分组 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/AccountGroup` | 新建分组、管理分组内账号 |
|
|
16
|
+
| 重点账号 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/KeyAccounts` | 配置重点关注账号、数据备份 |
|
|
17
|
+
| 账号体检 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/check` | 账号健康度体检报告、新建体检任务 |
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
### 内容发布
|
|
22
|
+
|
|
23
|
+
| 页面 | 完整链接 | 功能说明 |
|
|
24
|
+
|------|----------|----------|
|
|
25
|
+
| 发布作品 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/postVideo` | 矩阵发布视频/图文、草稿管理、话题组 |
|
|
26
|
+
| 发布日历 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/publishCalendar` | 日历视图规划发布任务、创建/编辑发布任务 |
|
|
27
|
+
| 营销日历 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/marketingCalendar` | 营销节点日历、跳转创建发布任务 |
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
### 任务与视频管理
|
|
32
|
+
|
|
33
|
+
| 页面 | 完整链接 | 功能说明 |
|
|
34
|
+
|------|----------|----------|
|
|
35
|
+
| 任务列表 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/task` | 发布任务列表、状态筛选、任务详情抽屉 |
|
|
36
|
+
| 视频管理 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/VideoMgr` | 已发布视频/图文列表、删除、重发、评论查看 |
|
|
37
|
+
| 视频搬家 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/relocation` | 将视频搬运到其他平台 |
|
|
38
|
+
| 搬家记录 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/MovingRecord` | 搬家任务列表与执行状态 |
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
### 互动与私信
|
|
43
|
+
|
|
44
|
+
| 页面 | 完整链接 | 功能说明 |
|
|
45
|
+
|------|----------|----------|
|
|
46
|
+
| 私信管理 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/letter` | 按渠道/时间查看与处理私信(多平台 Tab) |
|
|
47
|
+
| 评论管理 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/comment` | 收到的评论列表、回复、账号组筛选 |
|
|
48
|
+
| 智能互动 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/interaction` | 私信欢迎语、自动回复规则配置 |
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
### 数据与报表
|
|
53
|
+
|
|
54
|
+
| 页面 | 完整链接 | 功能说明 |
|
|
55
|
+
|------|----------|----------|
|
|
56
|
+
| 作品数据 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/Workdata` | 作品维度统计、图表、明细(对应 CLI `report fetch`) |
|
|
57
|
+
| 账户数据 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/accountdata` | 账户维度汇总数据、趋势图表 |
|
|
58
|
+
| 绩效报表 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/table` | 多维度绩效报表、PDF 导出(对应 CLI `report fetch/records/download`) |
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
### AI 与内容工具
|
|
63
|
+
|
|
64
|
+
| 页面 | 完整链接 | 功能说明 |
|
|
65
|
+
|------|----------|----------|
|
|
66
|
+
| 内容规划 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/planning` | AI 内容规划列表、生成规划、企业维度筛选(对应 CLI `planning`) |
|
|
67
|
+
| 营销首页 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/ContentHome` | 工作台总览:账号数、视频数、最新评论与视频 |
|
|
68
|
+
| 平台内容检索 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/web-search` | 关键词检索平台公开内容、筛选排序 |
|
|
69
|
+
| 话题组 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/TopicGroup` | 话题组维护、话题内容管理 |
|
|
70
|
+
| 企业词库 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/words` | 词库列表、新建/编辑/删除关键词 |
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## CLI 命令与页面对应关系
|
|
75
|
+
|
|
76
|
+
| CLI 命令 | 对应后台页面 |
|
|
77
|
+
|----------|-------------|
|
|
78
|
+
| `list-accounts` | `ManageAccounts` |
|
|
79
|
+
| `authorize` | `ManageAccounts` |
|
|
80
|
+
| `account-group` | `AccountGroup` |
|
|
81
|
+
| `publish` | `postVideo`、`task` |
|
|
82
|
+
| `task list/detail` | `task` |
|
|
83
|
+
| `task comment list` | `comment` |
|
|
84
|
+
| `letter` | `letter` |
|
|
85
|
+
| `report fetch` | `Workdata`、`table` |
|
|
86
|
+
| `report records/download` | `table`(导出记录弹窗) |
|
|
87
|
+
| `planning` | `planning` |
|
|
88
|
+
| `upload` | `postVideo`(素材库) |
|
package/package.json
CHANGED