@easyasstudio/xhs-cli 1.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/AGENTS.md +29 -0
  2. package/LICENSE +641 -0
  3. package/README.md +108 -0
  4. package/dist/browser/cookie.d.ts +1 -0
  5. package/dist/browser/cookie.d.ts.map +1 -0
  6. package/dist/browser/cookie.js +2 -0
  7. package/dist/browser/cookie.js.map +1 -0
  8. package/dist/browser/index.d.ts +7 -0
  9. package/dist/browser/index.d.ts.map +1 -0
  10. package/dist/browser/index.js +201 -0
  11. package/dist/browser/index.js.map +1 -0
  12. package/dist/cli/cliRouter.d.ts +6 -0
  13. package/dist/cli/cliRouter.d.ts.map +1 -0
  14. package/dist/cli/cliRouter.js +249 -0
  15. package/dist/cli/cliRouter.js.map +1 -0
  16. package/dist/cli/index.d.ts +3 -0
  17. package/dist/cli/index.d.ts.map +1 -0
  18. package/dist/cli/index.js +18 -0
  19. package/dist/cli/index.js.map +1 -0
  20. package/dist/cli/parseArgs.d.ts +13 -0
  21. package/dist/cli/parseArgs.d.ts.map +1 -0
  22. package/dist/cli/parseArgs.js +64 -0
  23. package/dist/cli/parseArgs.js.map +1 -0
  24. package/dist/config.d.ts +29 -0
  25. package/dist/config.d.ts.map +1 -0
  26. package/dist/config.js +67 -0
  27. package/dist/config.js.map +1 -0
  28. package/dist/toolset/accountRegistry.d.ts +33 -0
  29. package/dist/toolset/accountRegistry.d.ts.map +1 -0
  30. package/dist/toolset/accountRegistry.js +198 -0
  31. package/dist/toolset/accountRegistry.js.map +1 -0
  32. package/dist/toolset/cachePaths.d.ts +3 -0
  33. package/dist/toolset/cachePaths.d.ts.map +1 -0
  34. package/dist/toolset/cachePaths.js +7 -0
  35. package/dist/toolset/cachePaths.js.map +1 -0
  36. package/dist/toolset/get_metrics.d.ts +47 -0
  37. package/dist/toolset/get_metrics.d.ts.map +1 -0
  38. package/dist/toolset/get_metrics.js +201 -0
  39. package/dist/toolset/get_metrics.js.map +1 -0
  40. package/dist/toolset/get_note_detail.d.ts +3 -0
  41. package/dist/toolset/get_note_detail.d.ts.map +1 -0
  42. package/dist/toolset/get_note_detail.js +100 -0
  43. package/dist/toolset/get_note_detail.js.map +1 -0
  44. package/dist/toolset/get_profile.d.ts +16 -0
  45. package/dist/toolset/get_profile.d.ts.map +1 -0
  46. package/dist/toolset/get_profile.js +79 -0
  47. package/dist/toolset/get_profile.js.map +1 -0
  48. package/dist/toolset/get_recent_posts.d.ts +3 -0
  49. package/dist/toolset/get_recent_posts.d.ts.map +1 -0
  50. package/dist/toolset/get_recent_posts.js +113 -0
  51. package/dist/toolset/get_recent_posts.js.map +1 -0
  52. package/dist/toolset/index.d.ts +12 -0
  53. package/dist/toolset/index.d.ts.map +1 -0
  54. package/dist/toolset/index.js +48 -0
  55. package/dist/toolset/index.js.map +1 -0
  56. package/dist/toolset/login.d.ts +4 -0
  57. package/dist/toolset/login.d.ts.map +1 -0
  58. package/dist/toolset/login.js +194 -0
  59. package/dist/toolset/login.js.map +1 -0
  60. package/dist/toolset/post.d.ts +27 -0
  61. package/dist/toolset/post.d.ts.map +1 -0
  62. package/dist/toolset/post.js +148 -0
  63. package/dist/toolset/post.js.map +1 -0
  64. package/dist/toolset/postValidate.d.ts +8 -0
  65. package/dist/toolset/postValidate.d.ts.map +1 -0
  66. package/dist/toolset/postValidate.js +59 -0
  67. package/dist/toolset/postValidate.js.map +1 -0
  68. package/dist/toolset/publishButton.d.ts +7 -0
  69. package/dist/toolset/publishButton.d.ts.map +1 -0
  70. package/dist/toolset/publishButton.js +28 -0
  71. package/dist/toolset/publishButton.js.map +1 -0
  72. package/dist/toolset/publishedRecords.d.ts +15 -0
  73. package/dist/toolset/publishedRecords.d.ts.map +1 -0
  74. package/dist/toolset/publishedRecords.js +60 -0
  75. package/dist/toolset/publishedRecords.js.map +1 -0
  76. package/dist/toolset/sessionResolve.d.ts +12 -0
  77. package/dist/toolset/sessionResolve.d.ts.map +1 -0
  78. package/dist/toolset/sessionResolve.js +39 -0
  79. package/dist/toolset/sessionResolve.js.map +1 -0
  80. package/dist/toolset/sessionTypes.d.ts +13 -0
  81. package/dist/toolset/sessionTypes.d.ts.map +1 -0
  82. package/dist/toolset/sessionTypes.js +3 -0
  83. package/dist/toolset/sessionTypes.js.map +1 -0
  84. package/dist/utils/cache.d.ts +10 -0
  85. package/dist/utils/cache.d.ts.map +1 -0
  86. package/dist/utils/cache.js +124 -0
  87. package/dist/utils/cache.js.map +1 -0
  88. package/dist/utils/titleToFilename.d.ts +2 -0
  89. package/dist/utils/titleToFilename.d.ts.map +1 -0
  90. package/dist/utils/titleToFilename.js +19 -0
  91. package/dist/utils/titleToFilename.js.map +1 -0
  92. package/dist/utils/version_check.d.ts +2 -0
  93. package/dist/utils/version_check.d.ts.map +1 -0
  94. package/dist/utils/version_check.js +105 -0
  95. package/dist/utils/version_check.js.map +1 -0
  96. package/package.json +63 -0
@@ -0,0 +1,13 @@
1
+ /** CLI 参数解析(供 cliRouter 与测试共用) */
2
+ export declare function parseOpts(argv: string[]): {
3
+ rest: string[];
4
+ flags: Set<string>;
5
+ opts: Record<string, string>;
6
+ };
7
+ /** `post` 是否自动点击发布:显式 `--publish=<bool>` 优先于单独 `--publish` 开关 */
8
+ export declare function resolvePostPublish(opts: Record<string, string>, flags: Set<string>): boolean;
9
+ /** 读取 `--account`;空值由调用方校验 */
10
+ export declare function accountFromOpts(opts: Record<string, string>): string | undefined;
11
+ /** 扫描 argv 中的重复 `--image <path>` */
12
+ export declare function collectImagePaths(argv: string[]): string[];
13
+ //# sourceMappingURL=parseArgs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseArgs.d.ts","sourceRoot":"","sources":["../../src/cli/parseArgs.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAElC,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IACzC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B,CA8BA;AAED,iEAAiE;AACjE,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,GACjB,OAAO,CAWT;AAED,8BAA8B;AAC9B,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,GAAG,SAAS,CAEhF;AAED,oCAAoC;AACpC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAa1D"}
@@ -0,0 +1,64 @@
1
+ /** CLI 参数解析(供 cliRouter 与测试共用) */
2
+ export function parseOpts(argv) {
3
+ const rest = [];
4
+ const flags = new Set();
5
+ const opts = {};
6
+ for (let i = 0; i < argv.length; i++) {
7
+ const a = argv[i];
8
+ if (a === '--') {
9
+ rest.push(...argv.slice(i + 1));
10
+ break;
11
+ }
12
+ if (a.startsWith('--')) {
13
+ const eq = a.indexOf('=');
14
+ if (eq !== -1) {
15
+ const k = a.slice(2, eq);
16
+ opts[k] = a.slice(eq + 1);
17
+ continue;
18
+ }
19
+ const key = a.slice(2);
20
+ const next = argv[i + 1];
21
+ if (next !== undefined && !next.startsWith('-')) {
22
+ opts[key] = next;
23
+ i += 1;
24
+ }
25
+ else {
26
+ flags.add(key);
27
+ }
28
+ continue;
29
+ }
30
+ rest.push(a);
31
+ }
32
+ return { rest, flags, opts };
33
+ }
34
+ /** `post` 是否自动点击发布:显式 `--publish=<bool>` 优先于单独 `--publish` 开关 */
35
+ export function resolvePostPublish(opts, flags) {
36
+ if (opts.publish !== undefined) {
37
+ const v = opts.publish.trim().toLowerCase();
38
+ if (v === 'true' || v === '1' || v === 'yes') {
39
+ return true;
40
+ }
41
+ if (v === 'false' || v === '0' || v === 'no') {
42
+ return false;
43
+ }
44
+ }
45
+ return flags.has('publish');
46
+ }
47
+ /** 读取 `--account`;空值由调用方校验 */
48
+ export function accountFromOpts(opts) {
49
+ return opts.account?.trim() || undefined;
50
+ }
51
+ /** 扫描 argv 中的重复 `--image <path>` */
52
+ export function collectImagePaths(argv) {
53
+ const imagePaths = [];
54
+ for (let i = 0; i < argv.length; i++) {
55
+ if (argv[i] === '--image' &&
56
+ argv[i + 1] &&
57
+ !argv[i + 1].startsWith('-')) {
58
+ imagePaths.push(argv[i + 1]);
59
+ i += 1;
60
+ }
61
+ }
62
+ return imagePaths;
63
+ }
64
+ //# sourceMappingURL=parseArgs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseArgs.js","sourceRoot":"","sources":["../../src/cli/parseArgs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /** 应用主目录(仅作根路径,业务数据在 .cache 下) */
2
+ export declare const APP_HOME: string;
3
+ /**
4
+ * 应用缓存与生成数据根目录(笔记缓存、Cookie、浏览器配置等)
5
+ */
6
+ export declare const CACHE_DIR: string;
7
+ /** Puppeteer 用户数据目录(单账号或未选择多账号时的默认会话目录) */
8
+ export declare const BROWSER_USER_DATA_DIR: string;
9
+ /** 多账号元数据目录(会话目录在每账号子目录 browser-data) */
10
+ export declare const ACCOUNTS_ROOT: string;
11
+ /** 账号注册表:`~/.config/xhs-cli/.cache/accounts/registry.json` */
12
+ export declare const ACCOUNTS_REGISTRY_PATH: string;
13
+ /** 已发布归档:`~/.config/xhs-cli/.cache/published/` */
14
+ export declare const PUBLISHED_ROOT: string;
15
+ export declare const NOTES_CACHE_DIR: string;
16
+ export declare const COOKIE_FILE: string;
17
+ /** 可选:用户或外部工具自行使用的目录 */
18
+ export declare const SANDBOX_DIR: string;
19
+ /** 确保 `~/.config/xhs-cli/.cache` 目录存在(幂等) */
20
+ export declare function ensureAppDataLayout(): void;
21
+ /** 仅测试:重置 ensureAppDataLayout 幂等标记 */
22
+ export declare function resetAppDataLayoutCacheForTests(): void;
23
+ export declare const CACHE_TTL_OPERATION_DATA: number;
24
+ export declare const CACHE_TTL_NOTE_STATISTICS: number;
25
+ export declare const CACHE_TTL_NOTE_DETAIL: number;
26
+ export declare const CACHE_TTL_USER_PROFILE: number;
27
+ export declare const CACHE_TTL_NOTE_LIST: number;
28
+ export declare const CACHE_TTL_DEFAULT: number;
29
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAgBA,kCAAkC;AAClC,eAAO,MAAM,QAAQ,QAAmB,CAAC;AAEzC;;GAEG;AACH,eAAO,MAAM,SAAS,QAA2B,CAAC;AAElD,2CAA2C;AAC3C,eAAO,MAAM,qBAAqB,QAAkC,CAAC;AAErE,yCAAyC;AACzC,eAAO,MAAM,aAAa,QAA8B,CAAC;AACzD,8DAA8D;AAC9D,eAAO,MAAM,sBAAsB,QAAuC,CAAC;AAC3E,kDAAkD;AAClD,eAAO,MAAM,cAAc,QAA+B,CAAC;AAG3D,eAAO,MAAM,eAAe,QAA2B,CAAC;AAExD,eAAO,MAAM,WAAW,QAA6C,CAAC;AACtE,wBAAwB;AACxB,eAAO,MAAM,WAAW,QAA6B,CAAC;AAItD,6CAA6C;AAC7C,wBAAgB,mBAAmB,IAAI,IAAI,CAc1C;AAED,sCAAsC;AACtC,wBAAgB,+BAA+B,IAAI,IAAI,CAEtD;AAGD,eAAO,MAAM,wBAAwB,QAAe,CAAC;AAGrD,eAAO,MAAM,yBAAyB,QAAe,CAAC;AAGtD,eAAO,MAAM,qBAAqB,QAAoB,CAAC;AAGvD,eAAO,MAAM,sBAAsB,QAAe,CAAC;AAGnD,eAAO,MAAM,mBAAmB,QAAe,CAAC;AAGhD,eAAO,MAAM,iBAAiB,QAAU,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,67 @@
1
+ // src/config.ts
2
+ // 配置文件 — 所有应用生成的数据位于 ~/.config/xhs-cli/.cache/(测试可用 XHS_CLI_HOME 覆盖)
3
+ import { existsSync, mkdirSync } from 'fs';
4
+ import { join } from 'path';
5
+ import { homedir } from 'os';
6
+ function resolveAppHome() {
7
+ const override = process.env.XHS_CLI_HOME?.trim();
8
+ if (override) {
9
+ return override;
10
+ }
11
+ // 默认统一到 ~/.config/xhs-cli(与 xianyu-auto 其他 skill 的 ~/.config/<skill>/ 约定一致)
12
+ return join(homedir(), '.config', 'xhs-cli');
13
+ }
14
+ /** 应用主目录(仅作根路径,业务数据在 .cache 下) */
15
+ export const APP_HOME = resolveAppHome();
16
+ /**
17
+ * 应用缓存与生成数据根目录(笔记缓存、Cookie、浏览器配置等)
18
+ */
19
+ export const CACHE_DIR = join(APP_HOME, '.cache');
20
+ /** Puppeteer 用户数据目录(单账号或未选择多账号时的默认会话目录) */
21
+ export const BROWSER_USER_DATA_DIR = join(CACHE_DIR, 'browser-data');
22
+ /** 多账号元数据目录(会话目录在每账号子目录 browser-data) */
23
+ export const ACCOUNTS_ROOT = join(CACHE_DIR, 'accounts');
24
+ /** 账号注册表:`~/.config/xhs-cli/.cache/accounts/registry.json` */
25
+ export const ACCOUNTS_REGISTRY_PATH = join(ACCOUNTS_ROOT, 'registry.json');
26
+ /** 已发布归档:`~/.config/xhs-cli/.cache/published/` */
27
+ export const PUBLISHED_ROOT = join(CACHE_DIR, 'published');
28
+ // 笔记缓存目录
29
+ export const NOTES_CACHE_DIR = join(CACHE_DIR, 'notes');
30
+ // 浏览器 cookie 文件
31
+ export const COOKIE_FILE = join(CACHE_DIR, 'cookies', 'cookies.json');
32
+ /** 可选:用户或外部工具自行使用的目录 */
33
+ export const SANDBOX_DIR = join(CACHE_DIR, 'sandbox');
34
+ let appDataLayoutReady = false;
35
+ /** 确保 `~/.config/xhs-cli/.cache` 目录存在(幂等) */
36
+ export function ensureAppDataLayout() {
37
+ if (appDataLayoutReady) {
38
+ return;
39
+ }
40
+ appDataLayoutReady = true;
41
+ if (!existsSync(CACHE_DIR)) {
42
+ mkdirSync(CACHE_DIR, { recursive: true });
43
+ }
44
+ if (!existsSync(SANDBOX_DIR)) {
45
+ mkdirSync(SANDBOX_DIR, { recursive: true });
46
+ }
47
+ if (!existsSync(PUBLISHED_ROOT)) {
48
+ mkdirSync(PUBLISHED_ROOT, { recursive: true });
49
+ }
50
+ }
51
+ /** 仅测试:重置 ensureAppDataLayout 幂等标记 */
52
+ export function resetAppDataLayoutCacheForTests() {
53
+ appDataLayoutReady = false;
54
+ }
55
+ // 运营数据缓存时间
56
+ export const CACHE_TTL_OPERATION_DATA = 24 * 60 * 60; // 86400 秒 = 24小时
57
+ // 笔记统计缓存时间
58
+ export const CACHE_TTL_NOTE_STATISTICS = 24 * 60 * 60; // 24天
59
+ // 笔记详情缓存时间
60
+ export const CACHE_TTL_NOTE_DETAIL = 30 * 24 * 60 * 60; // 30天
61
+ // 用户资料缓存时间
62
+ export const CACHE_TTL_USER_PROFILE = 24 * 60 * 60; // 86400 秒 = 24小时
63
+ // 笔记列表缓存时间
64
+ export const CACHE_TTL_NOTE_LIST = 12 * 60 * 60; // 43200 秒 = 12小时
65
+ // 默认缓存时间
66
+ export const CACHE_TTL_DEFAULT = 60 * 60; // 3600 秒 = 1小时
67
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export declare const ACCOUNT_SLUG_RE: RegExp;
2
+ export type StoredAccount = {
3
+ name: string;
4
+ createdAt: string;
5
+ updatedAt: string;
6
+ browserDataDir: string;
7
+ policyPath: string;
8
+ };
9
+ export type AccountsRegistryFile = {
10
+ version: 1;
11
+ /** 当前默认账号;未指定 `--account` 时使用(可用 `xhs account use` 切换) */
12
+ currentAccount: string | null;
13
+ accounts: Record<string, StoredAccount>;
14
+ };
15
+ export declare function validateAccountSlug(name: string): void;
16
+ export declare function loadAccountsRegistry(): AccountsRegistryFile;
17
+ export declare function saveAccountsRegistry(reg: AccountsRegistryFile): void;
18
+ /** 是否为「已配置至少一个多账号」 */
19
+ export declare function hasConfiguredAccounts(reg: AccountsRegistryFile): boolean;
20
+ export declare function accountRootDir(slug: string): string;
21
+ /** 写入 policy.md(若缺失) */
22
+ export declare function ensureDefaultPolicy(policyPath: string): void;
23
+ export declare function addStoredAccount(opts: {
24
+ name: string;
25
+ }): StoredAccount;
26
+ /** 将 registry 中的当前账号设为 `slug` */
27
+ export declare function setCurrentAccount(slug: string): void;
28
+ /** 返回 registry 中记录的当前账号(不校验是否存在) */
29
+ export declare function getCurrentAccount(): string | null;
30
+ export declare function getStoredAccountOrThrow(slug: string): StoredAccount;
31
+ export declare function formatAccountListLines(): string;
32
+ export declare function formatShowAccount(slug: string): string;
33
+ //# sourceMappingURL=accountRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accountRegistry.d.ts","sourceRoot":"","sources":["../../src/toolset/accountRegistry.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,eAAe,QAAsB,CAAC;AAEnD,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,CAAC,CAAC;IACX,0DAA0D;IAC1D,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACzC,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAUtD;AA+BD,wBAAgB,oBAAoB,IAAI,oBAAoB,CA8B3D;AAYD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,oBAAoB,GAAG,IAAI,CAGpE;AAED,sBAAsB;AACtB,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAExE;AAcD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAwB;AACxB,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAS5D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,aAAa,CAgCtE;AAED,iCAAiC;AACjC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAQpD;AAED,oCAAoC;AACpC,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAIjD;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAOnE;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAqB/C;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAStD"}
@@ -0,0 +1,198 @@
1
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { ACCOUNTS_REGISTRY_PATH, ACCOUNTS_ROOT, CACHE_DIR, ensureAppDataLayout, } from '../config.js';
4
+ export const ACCOUNT_SLUG_RE = /^[a-zA-Z0-9._-]+$/;
5
+ export function validateAccountSlug(name) {
6
+ const n = name.trim();
7
+ if (!n) {
8
+ throw new Error('账号名不能为空');
9
+ }
10
+ if (!ACCOUNT_SLUG_RE.test(n)) {
11
+ throw new Error(`账号名须匹配 [a-zA-Z0-9._-]+,当前为: ${JSON.stringify(name)}`);
12
+ }
13
+ }
14
+ function defaultRegistry() {
15
+ return {
16
+ version: 1,
17
+ currentAccount: null,
18
+ accounts: {},
19
+ };
20
+ }
21
+ function normalizeStoredAccount(slug, raw) {
22
+ const r = raw;
23
+ const now = new Date().toISOString();
24
+ const root = join(CACHE_DIR, 'accounts', slug);
25
+ const browserDefault = join(root, 'browser-data');
26
+ const policyDefault = join(root, 'policy.md');
27
+ return {
28
+ name: typeof r.name === 'string' && r.name.trim() ? r.name.trim() : slug,
29
+ createdAt: typeof r.createdAt === 'string' ? r.createdAt : now,
30
+ updatedAt: typeof r.updatedAt === 'string' ? r.updatedAt : now,
31
+ browserDataDir: typeof r.browserDataDir === 'string' && r.browserDataDir.trim()
32
+ ? r.browserDataDir.trim()
33
+ : browserDefault,
34
+ policyPath: typeof r.policyPath === 'string' && r.policyPath.trim()
35
+ ? r.policyPath.trim()
36
+ : policyDefault,
37
+ };
38
+ }
39
+ export function loadAccountsRegistry() {
40
+ ensureAppDataLayout();
41
+ if (!existsSync(ACCOUNTS_REGISTRY_PATH)) {
42
+ return defaultRegistry();
43
+ }
44
+ try {
45
+ const raw = readFileSync(ACCOUNTS_REGISTRY_PATH, 'utf-8');
46
+ const parsed = JSON.parse(raw);
47
+ if (parsed.version !== 1 ||
48
+ typeof parsed.accounts !== 'object' ||
49
+ parsed.accounts === null) {
50
+ return defaultRegistry();
51
+ }
52
+ const accounts = {};
53
+ for (const slug of Object.keys(parsed.accounts)) {
54
+ accounts[slug] = normalizeStoredAccount(slug, parsed.accounts[slug]);
55
+ }
56
+ return {
57
+ version: 1,
58
+ currentAccount: typeof parsed.currentAccount === 'string' && parsed.currentAccount.trim()
59
+ ? parsed.currentAccount.trim()
60
+ : null,
61
+ accounts,
62
+ };
63
+ }
64
+ catch {
65
+ return defaultRegistry();
66
+ }
67
+ }
68
+ function atomicWriteJson(path, data) {
69
+ const dir = ACCOUNTS_ROOT;
70
+ if (!existsSync(dir)) {
71
+ mkdirSync(dir, { recursive: true });
72
+ }
73
+ const tmp = `${path}.${process.pid}.${Date.now()}.tmp`;
74
+ writeFileSync(tmp, JSON.stringify(data, null, 2), 'utf-8');
75
+ renameSync(tmp, path);
76
+ }
77
+ export function saveAccountsRegistry(reg) {
78
+ ensureAppDataLayout();
79
+ atomicWriteJson(ACCOUNTS_REGISTRY_PATH, reg);
80
+ }
81
+ /** 是否为「已配置至少一个多账号」 */
82
+ export function hasConfiguredAccounts(reg) {
83
+ return Object.keys(reg.accounts).length > 0;
84
+ }
85
+ const DEFAULT_POLICY = `<!-- xhs-cli 默认策略模板,可自行修改 -->
86
+
87
+ # 发帖与运营策略
88
+
89
+ - **合规**:遵守法律法规与小红书社区规范。
90
+ - **风格**:人设与选题与账号定位一致。
91
+ - **发布**:仅人工确认后正式发布。
92
+
93
+ 与本账号相关的备注可写在下文:
94
+
95
+ `;
96
+ export function accountRootDir(slug) {
97
+ return join(CACHE_DIR, 'accounts', slug);
98
+ }
99
+ /** 写入 policy.md(若缺失) */
100
+ export function ensureDefaultPolicy(policyPath) {
101
+ if (existsSync(policyPath)) {
102
+ return;
103
+ }
104
+ const dir = join(policyPath, '..');
105
+ if (!existsSync(dir)) {
106
+ mkdirSync(dir, { recursive: true });
107
+ }
108
+ writeFileSync(policyPath, DEFAULT_POLICY.trimStart(), 'utf-8');
109
+ }
110
+ export function addStoredAccount(opts) {
111
+ validateAccountSlug(opts.name);
112
+ const slug = opts.name.trim();
113
+ const reg = loadAccountsRegistry();
114
+ if (reg.accounts[slug]) {
115
+ throw new Error(`账号 ${slug} 已存在`);
116
+ }
117
+ ensureAppDataLayout();
118
+ const root = accountRootDir(slug);
119
+ const browserDataDir = join(root, 'browser-data');
120
+ const policyPath = join(root, 'policy.md');
121
+ mkdirSync(browserDataDir, { recursive: true });
122
+ ensureDefaultPolicy(policyPath);
123
+ const now = new Date().toISOString();
124
+ const row = {
125
+ name: slug,
126
+ createdAt: now,
127
+ updatedAt: now,
128
+ browserDataDir,
129
+ policyPath,
130
+ };
131
+ reg.accounts[slug] = row;
132
+ const keys = Object.keys(reg.accounts);
133
+ if (keys.length === 1 ||
134
+ !reg.currentAccount ||
135
+ !reg.accounts[reg.currentAccount]) {
136
+ reg.currentAccount = slug;
137
+ }
138
+ saveAccountsRegistry(reg);
139
+ return row;
140
+ }
141
+ /** 将 registry 中的当前账号设为 `slug` */
142
+ export function setCurrentAccount(slug) {
143
+ validateAccountSlug(slug);
144
+ const reg = loadAccountsRegistry();
145
+ if (!reg.accounts[slug]) {
146
+ throw new Error(`未知账号: ${slug}。可用 xhs account list 查看已配置账号。`);
147
+ }
148
+ reg.currentAccount = slug;
149
+ saveAccountsRegistry(reg);
150
+ }
151
+ /** 返回 registry 中记录的当前账号(不校验是否存在) */
152
+ export function getCurrentAccount() {
153
+ const reg = loadAccountsRegistry();
154
+ const cur = reg.currentAccount?.trim();
155
+ return cur && reg.accounts[cur] ? cur : null;
156
+ }
157
+ export function getStoredAccountOrThrow(slug) {
158
+ const reg = loadAccountsRegistry();
159
+ const a = reg.accounts[slug];
160
+ if (!a) {
161
+ throw new Error(`未知账号: ${slug}`);
162
+ }
163
+ return a;
164
+ }
165
+ export function formatAccountListLines() {
166
+ const reg = loadAccountsRegistry();
167
+ const keys = Object.keys(reg.accounts).sort();
168
+ if (keys.length === 0) {
169
+ return '尚未配置账号。请先执行 xhs account add <name>。';
170
+ }
171
+ const cur = getCurrentAccount();
172
+ const lines = [];
173
+ for (const k of keys) {
174
+ const a = reg.accounts[k];
175
+ const mark = k === cur ? ' *' : '';
176
+ lines.push(`${a.name}${mark}\t会话:${a.browserDataDir}`);
177
+ }
178
+ lines.push('');
179
+ if (cur) {
180
+ lines.push(`当前账号: ${cur}(列表中带 *)。切换: xhs account use <name>`);
181
+ }
182
+ else {
183
+ lines.push('未设置当前账号。请执行: xhs account use <name>');
184
+ }
185
+ lines.push('临时指定: --account <slug>。');
186
+ return lines.join('\n');
187
+ }
188
+ export function formatShowAccount(slug) {
189
+ const a = getStoredAccountOrThrow(slug);
190
+ return [
191
+ `name: ${a.name}`,
192
+ `createdAt: ${a.createdAt}`,
193
+ `updatedAt: ${a.updatedAt}`,
194
+ `browserDataDir: ${a.browserDataDir}`,
195
+ `policyPath: ${a.policyPath}`,
196
+ ].join('\n');
197
+ }
198
+ //# sourceMappingURL=accountRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accountRegistry.js","sourceRoot":"","sources":["../../src/toolset/accountRegistry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** 在多账号模式下为缓存文件名加前缀,避免创作者数据互相覆盖 */
2
+ export declare function prefixedCacheFilename(cachePathPrefix: string, filename: string): string;
3
+ //# sourceMappingURL=cachePaths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cachePaths.d.ts","sourceRoot":"","sources":["../../src/toolset/cachePaths.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,MAAM,GACf,MAAM,CAGR"}
@@ -0,0 +1,7 @@
1
+ /** 在多账号模式下为缓存文件名加前缀,避免创作者数据互相覆盖 */
2
+ export function prefixedCacheFilename(cachePathPrefix, filename) {
3
+ if (!cachePathPrefix)
4
+ return filename;
5
+ return `${cachePathPrefix}${filename.replace(/^\//, '')}`;
6
+ }
7
+ //# sourceMappingURL=cachePaths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cachePaths.js","sourceRoot":"","sources":["../../src/toolset/cachePaths.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC,MAAM,UAAU,qBAAqB,CACnC,eAAuB,EACvB,QAAgB;IAEhB,IAAI,CAAC,eAAe;QAAE,OAAO,QAAQ,CAAC;IACtC,OAAO,GAAG,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,47 @@
1
+ import type { Page } from 'puppeteer-core';
2
+ import type { ResolvedSession } from './sessionTypes.js';
3
+ interface TrafficSourceRow {
4
+ name: string;
5
+ percentage: string;
6
+ }
7
+ interface OperationDataSnapshot {
8
+ date: string;
9
+ totalFans: string;
10
+ newFans: string;
11
+ lostFans: string;
12
+ netFansGrowth: string;
13
+ totalLikes: string;
14
+ totalCollects: string;
15
+ totalComments: string;
16
+ totalShares: string;
17
+ publishedNotes: string;
18
+ noteReads: string;
19
+ noteReadRate: string;
20
+ avgReadTime: string;
21
+ homePageVisitors: string;
22
+ trafficSources: TrafficSourceRow[];
23
+ fanInterests: string[];
24
+ tendencies: Array<{
25
+ metric: string;
26
+ tendency: string;
27
+ value: string;
28
+ }>;
29
+ }
30
+ /** 统一的页面数据获取器 */
31
+ export declare class XHSOperationDataFetcher {
32
+ private page;
33
+ constructor(page: Page);
34
+ fetchAllData(): Promise<OperationDataSnapshot>;
35
+ private fetchHomeData;
36
+ private fetchFanData;
37
+ private fetchTrafficSources;
38
+ private navigate;
39
+ private transformToSnapshot;
40
+ }
41
+ /**
42
+ * 获取运营数据(纯文本;同日缓存命中则直接返回文本)
43
+ * @param session 浏览器目录与缓存命名空间(多账号)
44
+ */
45
+ export declare function getOperationData(session: ResolvedSession): Promise<string>;
46
+ export {};
47
+ //# sourceMappingURL=get_metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get_metrics.d.ts","sourceRoot":"","sources":["../../src/toolset/get_metrics.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAG3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,qBAAqB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,gBAAgB,EAAE,CAAC;IACnC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxE;AAoED,iBAAiB;AACjB,qBAAa,uBAAuB;IACtB,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,IAAI;IAExB,YAAY,IAAI,OAAO,CAAC,qBAAqB,CAAC;YAOtC,aAAa;YAgCb,YAAY;YAqCZ,mBAAmB;YAsBnB,QAAQ;IAKtB,OAAO,CAAC,mBAAmB;CAgC5B;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBhF"}