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 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.31),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-cso-cli`。
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 (isDomestic) {
3205
- if (options.state === "normal") {
3206
- stateParams["mediaAccountState"] = "Linked";
3207
- } else if (options.state === "abnormal") {
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: isDomestic ? "1" : "0",
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${tradeLabel}\uFF0C${pageInfo}\uFF09`);
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${tradeLabel}\uFF0C${pageInfo}\uFF09`);
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 csoPlatformType = options.domestic ? 1 : 2;
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${platformLabel(csoPlatformType)}\uFF0C\u5171 ${groups.length} \u4E2A\u5206\u7EC4\uFF09
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, csoPlatformType, accountIds }));
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\uFF08${platformLabel(csoPlatformType)}\uFF09`);
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, csoPlatformType, accountIds }));
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 topicPosition = ["YouTube", "Facebook"].includes(mediaType) ? 4 : 2;
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/${csoPlatformType}?` + createQueryString({ page, size });
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\u5E73\u53F0\u7C7B\u578B ${csoPlatformType}\uFF0C\u7B2C ${page} \u9875\uFF0C\u6BCF\u9875 ${size} \u6761\uFF0C\u603B\u6570 ${data?.total ?? 0}\uFF09\uFF1A`);
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/${csoPlatformType}?` + createQueryString({ id: options.id });
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/${csoPlatformType}?${createQueryString3({
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\u5E73\u53F0\u7C7B\u578B ${csoPlatformType}\uFF0C\u7B2C ${page} \u9875\uFF0C\u6BCF\u9875 ${size} \u6761\uFF0C\u603B\u6570 ${data.total ?? 0}\uFF09\uFF1A`);
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/${csoPlatformType}?${createQueryString3({
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/${csoPlatformType}/${mediaType}?${createQueryString3({
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 tradeSegment = opts.domestic ? "domestic_trade" : "foreign_trade";
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
- "\n\u5C1A\u672A\u914D\u7F6E Token\u3002\n\n \u5982\u679C\u4F60\u8FD8\u6CA1\u6709 Siluzan \u8D26\u53F7\uFF0C\u8BF7\u5148\u6CE8\u518C\uFF1A\n \u{1F449} https://www.siluzan.com\n\n \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\n siluzan-cso login\n"
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\u5916\u8D38\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("--domestic", "\u5185\u8D38\u6A21\u5F0F\uFF0C\u6388\u6743\u5B8C\u6210\u540E\u8DF3\u56DE\u5185\u8D38\u8D26\u53F7\u7BA1\u7406\u9875\uFF08\u9ED8\u8BA4\u5916\u8D38\uFF09", 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) => {
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("--domestic", "\u5185\u8D38\u6A21\u5F0F\uFF08mediaGroup=1\uFF09\uFF0C\u9ED8\u8BA4\u5916\u8D38", false).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) => {
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("--domestic", "\u5185\u8D38\u6A21\u5F0F\uFF08csoPlatformType=1\uFF09\uFF0C\u9ED8\u8BA4\u5916\u8D38", false).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) => {
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("--domestic", "\u5185\u8D38\u6A21\u5F0F\uFF08csoPlatformType=1\uFF09\uFF0C\u9ED8\u8BA4\u5916\u8D38", false).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("--domestic", "\u5185\u8D38\u6A21\u5F0F\uFF08csoPlatformType=1\uFF09\uFF0C\u9ED8\u8BA4\u5916\u8D38", false).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("--domestic", "\u56FD\u5185\u4E1A\u52A1\uFF08csoPlatformType=1\uFF09\uFF1B\u4E0D\u4F20\u9ED8\u8BA4\u6D77\u5916\uFF08csoPlatformType=2\uFF09", false).option("--platform-type <1|2>", "\u663E\u5F0F\u6307\u5B9A csoPlatformType\uFF0C\u4F18\u5148\u7EA7\u9AD8\u4E8E --domestic").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) => {
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("--domestic", "\u56FD\u5185\u4E1A\u52A1\uFF08csoPlatformType=1\uFF09\uFF1B\u4E0D\u4F20\u9ED8\u8BA4\u6D77\u5916\uFF08csoPlatformType=2\uFF09", false).option("--platform-type <1|2>", "\u663E\u5F0F\u6307\u5B9A csoPlatformType\uFF0C\u4F18\u5148\u7EA7\u9AD8\u4E8E --domestic").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) => {
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("--domestic", "\u56FD\u5185\u4E1A\u52A1\uFF08csoPlatformType=1\uFF09\uFF1B\u4E0D\u4F20\u9ED8\u8BA4\u6D77\u5916\uFF08csoPlatformType=2\uFF09", false).option("--platform-type <1|2>", "\u663E\u5F0F\u6307\u5B9A csoPlatformType\uFF0C\u4F18\u5148\u7EA7\u9AD8\u4E8E --domestic").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) => {
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("--domestic", "\u56FD\u5185\u4E1A\u52A1\uFF08csoPlatformType=1\uFF09\uFF1B\u4E0D\u4F20\u9ED8\u8BA4\u6D77\u5916\uFF08csoPlatformType=2\uFF09", false).option("--platform-type <1|2>", "\u663E\u5F0F\u6307\u5B9A csoPlatformType\uFF0C\u4F18\u5148\u7EA7\u9AD8\u4E8E --domestic").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) => {
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("--domestic", "\u56FD\u5185\u4E1A\u52A1\uFF08csoPlatformType=1\uFF09\uFF1B\u4E0D\u4F20\u9ED8\u8BA4\u6D77\u5916\uFF08csoPlatformType=2\uFF09", false).option("--platform-type <1|2>", "\u663E\u5F0F\u6307\u5B9A csoPlatformType\uFF0C\u4F18\u5148\u7EA7\u9AD8\u4E8E --domestic").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) => {
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("--domestic", "\u56FD\u5185\u4E1A\u52A1\uFF08csoPlatformType=1\uFF09\uFF1B\u4E0D\u4F20\u9ED8\u8BA4\u6D77\u5916\uFF08csoPlatformType=2\uFF09", false).option("--platform-type <1|2>", "\u663E\u5F0F\u6307\u5B9A csoPlatformType\uFF0C\u4F18\u5148\u7EA7\u9AD8\u4E8E --domestic").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) => {
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();
@@ -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 命令的模块,应引导用户在 CSO Web 操作。
73
- > URL 模板:`https://www.siluzan.com/v3/foreign_trade/cso/{页面}`
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`(作品数据)
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "slug": "siluzan-cso",
3
- "version": "1.0.0-beta.31",
4
- "publishedAt": 1775546785739
3
+ "version": "1.0.0-beta.33",
4
+ "publishedAt": 1775553443182
5
5
  }
@@ -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
- | 修改分组名称或账号 | `siluzan-cso account-group update --id <groupId> --name <名称> --accounts <ids>` |
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
- ### update编辑分组
53
+ ### add-accounts追加账号(推荐)
52
54
 
53
55
  ```bash
54
- # 更新名称和账号列表
55
- siluzan-cso account-group update --id <groupId> --name "新名称" --accounts "id1,id2"
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
- # 只修改名称(不传 --accounts 则清空组内账号!)
58
- # ⚠️ 建议先 list --json 查出当前账号,再合并修改
59
- siluzan-cso account-group update --id <groupId> --name "新名称" --accounts "保留的id1,保留的id2"
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
- ```bash
79
- # Step 1:获取分组 ID 和当前账号列表
80
- siluzan-cso account-group list --json
99
+ ### 向已有分组添加新账号
81
100
 
82
- # Step 2:获取新账号的 mediaCustomerId
101
+ ```bash
102
+ # Step 1:获取新账号的 mediaCustomerId
83
103
  siluzan-cso list-accounts --name "新账号名" --json
84
104
 
85
- # Step 3:合并更新(原有账号 + 新账号)
86
- siluzan-cso account-group update --id <groupId> --name <原名称> --accounts "原id1,原id2,新id"
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "siluzan-cso-cli",
3
- "version": "1.0.0-beta.31",
3
+ "version": "1.0.0-beta.33",
4
4
  "description": "Siluzan platform AI Skill CLI — multi-platform content publishing (video/image-text) for Cursor, Claude Code, and OpenClaw.",
5
5
  "type": "module",
6
6
  "bin": {