xhs-operator 1.0.0-beta.1

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 (83) hide show
  1. package/README.md +100 -0
  2. package/dist/actions/account.d.ts +59 -0
  3. package/dist/actions/account.d.ts.map +1 -0
  4. package/dist/actions/account.js +142 -0
  5. package/dist/actions/account.js.map +1 -0
  6. package/dist/actions/interact.d.ts +37 -0
  7. package/dist/actions/interact.d.ts.map +1 -0
  8. package/dist/actions/interact.js +205 -0
  9. package/dist/actions/interact.js.map +1 -0
  10. package/dist/actions/publish.d.ts +18 -0
  11. package/dist/actions/publish.d.ts.map +1 -0
  12. package/dist/actions/publish.js +135 -0
  13. package/dist/actions/publish.js.map +1 -0
  14. package/dist/actions/scrape.d.ts +21 -0
  15. package/dist/actions/scrape.d.ts.map +1 -0
  16. package/dist/actions/scrape.js +145 -0
  17. package/dist/actions/scrape.js.map +1 -0
  18. package/dist/agents/copywriter.d.ts +21 -0
  19. package/dist/agents/copywriter.d.ts.map +1 -0
  20. package/dist/agents/copywriter.js +115 -0
  21. package/dist/agents/copywriter.js.map +1 -0
  22. package/dist/agents/image-composer.d.ts +26 -0
  23. package/dist/agents/image-composer.d.ts.map +1 -0
  24. package/dist/agents/image-composer.js +103 -0
  25. package/dist/agents/image-composer.js.map +1 -0
  26. package/dist/cli.d.ts +3 -0
  27. package/dist/cli.d.ts.map +1 -0
  28. package/dist/cli.js +204 -0
  29. package/dist/cli.js.map +1 -0
  30. package/dist/index.d.ts +5 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +6 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/plugin.d.ts +61 -0
  35. package/dist/plugin.d.ts.map +1 -0
  36. package/dist/plugin.js +182 -0
  37. package/dist/plugin.js.map +1 -0
  38. package/dist/risk/behavior-humanizer.d.ts +30 -0
  39. package/dist/risk/behavior-humanizer.d.ts.map +1 -0
  40. package/dist/risk/behavior-humanizer.js +105 -0
  41. package/dist/risk/behavior-humanizer.js.map +1 -0
  42. package/dist/risk/fingerprint-guard.d.ts +23 -0
  43. package/dist/risk/fingerprint-guard.d.ts.map +1 -0
  44. package/dist/risk/fingerprint-guard.js +127 -0
  45. package/dist/risk/fingerprint-guard.js.map +1 -0
  46. package/dist/risk/rate-guard.d.ts +33 -0
  47. package/dist/risk/rate-guard.d.ts.map +1 -0
  48. package/dist/risk/rate-guard.js +104 -0
  49. package/dist/risk/rate-guard.js.map +1 -0
  50. package/dist/runtime/standalone.d.ts +15 -0
  51. package/dist/runtime/standalone.d.ts.map +1 -0
  52. package/dist/runtime/standalone.js +199 -0
  53. package/dist/runtime/standalone.js.map +1 -0
  54. package/dist/scheduler.d.ts +42 -0
  55. package/dist/scheduler.d.ts.map +1 -0
  56. package/dist/scheduler.js +139 -0
  57. package/dist/scheduler.js.map +1 -0
  58. package/dist/storage/database.d.ts +23 -0
  59. package/dist/storage/database.d.ts.map +1 -0
  60. package/dist/storage/database.js +142 -0
  61. package/dist/storage/database.js.map +1 -0
  62. package/dist/storage/kv-store.d.ts +13 -0
  63. package/dist/storage/kv-store.d.ts.map +1 -0
  64. package/dist/storage/kv-store.js +60 -0
  65. package/dist/storage/kv-store.js.map +1 -0
  66. package/dist/types/index.d.ts +320 -0
  67. package/dist/types/index.d.ts.map +1 -0
  68. package/dist/types/index.js +5 -0
  69. package/dist/types/index.js.map +1 -0
  70. package/dist/utils/helpers.d.ts +63 -0
  71. package/dist/utils/helpers.d.ts.map +1 -0
  72. package/dist/utils/helpers.js +115 -0
  73. package/dist/utils/helpers.js.map +1 -0
  74. package/dist/workflows/content-campaign.d.ts +58 -0
  75. package/dist/workflows/content-campaign.d.ts.map +1 -0
  76. package/dist/workflows/content-campaign.js +155 -0
  77. package/dist/workflows/content-campaign.js.map +1 -0
  78. package/dist/workflows/daily-operate.d.ts +36 -0
  79. package/dist/workflows/daily-operate.d.ts.map +1 -0
  80. package/dist/workflows/daily-operate.js +222 -0
  81. package/dist/workflows/daily-operate.js.map +1 -0
  82. package/manifest.json +29 -0
  83. package/package.json +66 -0
package/README.md ADDED
@@ -0,0 +1,100 @@
1
+ # xhs-operator
2
+
3
+ 小红书(REDnote)账号自动运营 OpenClaw 插件。支持内容发布、互动增长、数据监控,内置行为人性化与风控防护。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install xhs-operator
9
+ ```
10
+
11
+ > **系统要求**: Node.js ≥ 20,首次运行会自动安装 Playwright 浏览器驱动。
12
+
13
+ ## 快速开始
14
+
15
+ ### 命令行使用
16
+
17
+ ```bash
18
+ # 全局安装
19
+ npm install -g xhs-operator
20
+
21
+ # 1. 导入账号
22
+ xhs-operator import ./accounts.json
23
+
24
+ # 2. 启动自动运营(每日调度)
25
+ ANTHROPIC_API_KEY=sk-... xhs-operator start
26
+
27
+ # 3. 手动触发发布
28
+ xhs-operator publish <accountId>
29
+
30
+ # 4. 查看运营报告
31
+ xhs-operator report <accountId>
32
+ ```
33
+
34
+ ### 账号配置文件(accounts.json)
35
+
36
+ ```json
37
+ [
38
+ {
39
+ "nickname": "美食博主小明",
40
+ "niche": "美食",
41
+ "sessionFile": "./sessions/account1.json",
42
+ "proxy": {
43
+ "host": "127.0.0.1",
44
+ "port": 7890,
45
+ "protocol": "http"
46
+ }
47
+ }
48
+ ]
49
+ ```
50
+
51
+ ### 作为库使用(集成进 OpenClaw 框架)
52
+
53
+ ```typescript
54
+ import { XHSOperatorPlugin } from 'xhs-operator';
55
+ import { createStandaloneRuntime } from 'xhs-operator';
56
+
57
+ const runtime = createStandaloneRuntime({
58
+ anthropicApiKey: process.env.ANTHROPIC_API_KEY,
59
+ });
60
+
61
+ const plugin = new XHSOperatorPlugin();
62
+ await plugin.initialize(runtime);
63
+
64
+ // 手动触发发布
65
+ const result = await plugin.triggerPublish('account-id');
66
+
67
+ // 批量导入账号
68
+ await plugin.importAccounts([{ nickname: '...', niche: '美食', sessionFile: '...', proxy: { ... } }]);
69
+
70
+ // 启动自动调度
71
+ plugin.startScheduler({ ... });
72
+ ```
73
+
74
+ ## 环境变量
75
+
76
+ | 变量 | 必填 | 说明 |
77
+ |------|------|------|
78
+ | `ANTHROPIC_API_KEY` | 是 | Anthropic API Key,用于 AI 内容生成 |
79
+ | `XHS_HEADLESS` | 否 | 设为 `false` 可显示浏览器窗口(默认 `true`) |
80
+ | `XHS_NICHE` | 否 | 默认内容垂类(默认 `生活分享`) |
81
+ | `XHS_LOG_LEVEL` | 否 | 日志级别 `debug/info/warn/error`(默认 `info`) |
82
+
83
+ ## 核心功能
84
+
85
+ - **AI 内容生成** — 基于 Claude Sonnet 自动生成标题、正文、话题标签、封面文字
86
+ - **图片合成** — 封面图自动排版与文字叠加(基于 Sharp)
87
+ - **行为人性化** — 贝塞尔曲线鼠标轨迹、打字节奏模拟、随机浏览行为
88
+ - **频率限制** — 每日配额管理 + 熔断器,防封号
89
+ - **指纹管理** — 每账号绑定稳定浏览器指纹,避免关联
90
+ - **养号策略** — 新账号 14 天渐进式操作计划
91
+ - **多账号调度** — 最多 5 路并发,按健康分优先排序
92
+ - **数据采集** — 自动抓取创作者中心指标并生成报告
93
+
94
+ ## 安全声明
95
+
96
+ 本插件遵守小红书用户协议,不支持刷量、私信骚扰、绕过实名认证等违规操作。使用者需自行承担账号风险。
97
+
98
+ ## License
99
+
100
+ MIT
@@ -0,0 +1,59 @@
1
+ import type { Account, AccountImport, ImportResult } from '../types/index.js';
2
+ import type { AppDatabase } from '../storage/database.js';
3
+ import { FingerprintGuard } from '../risk/fingerprint-guard.js';
4
+ export declare class AccountAction {
5
+ private db;
6
+ private fingerprintGuard;
7
+ constructor(db: AppDatabase, fingerprintGuard: FingerprintGuard);
8
+ /**
9
+ * Import multiple accounts into the system.
10
+ */
11
+ importAccounts(accounts: AccountImport[]): ImportResult;
12
+ /**
13
+ * Compute health score for an account (0-100).
14
+ */
15
+ computeHealthScore(account: Account): number;
16
+ /**
17
+ * Get accounts sorted by health score (highest first).
18
+ */
19
+ getAccountsByHealth(): Array<Account & {
20
+ healthScore: number;
21
+ }>;
22
+ /**
23
+ * Check if an account is in warm-up period (new account).
24
+ */
25
+ isInWarmup(account: Account): boolean;
26
+ /**
27
+ * Get warm-up day number (1-14) for quota adjustment.
28
+ */
29
+ getWarmupDay(account: Account): number;
30
+ /**
31
+ * Get adjusted quotas for accounts in warm-up period.
32
+ * Day 1-3: browse only
33
+ * Day 4-5: likes only (≤20/day)
34
+ * Day 6-7: likes + comments + follows
35
+ * Day 8-14: first publish, gradually increase
36
+ * Day 15+: normal operation
37
+ */
38
+ getWarmupQuota(account: Account): {
39
+ canPublish: boolean;
40
+ likes: number;
41
+ comments: number;
42
+ follows: number;
43
+ collects: number;
44
+ browseMins: number;
45
+ };
46
+ /**
47
+ * Pause an account (set to cooling status).
48
+ */
49
+ pauseAccount(accountId: string): void;
50
+ /**
51
+ * Resume an account.
52
+ */
53
+ resumeAccount(accountId: string): void;
54
+ /**
55
+ * Flag an account for manual review.
56
+ */
57
+ flagForReview(accountId: string): void;
58
+ }
59
+ //# sourceMappingURL=account.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../src/actions/account.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAchE,qBAAa,aAAa;IAEtB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,gBAAgB;gBADhB,EAAE,EAAE,WAAW,EACf,gBAAgB,EAAE,gBAAgB;IAG5C;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,YAAY;IAsCvD;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;IAa5C;;OAEG;IACH,mBAAmB,IAAI,KAAK,CAAC,OAAO,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAO/D;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO;IAKrC;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;IAKtC;;;;;;;OAOG;IACH,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG;QAAE,UAAU,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IAoBjJ;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIrC;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAItC;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAGvC"}
@@ -0,0 +1,142 @@
1
+ // ============================================================
2
+ // Account Action — Account management and health monitoring
3
+ // ============================================================
4
+ import { v4 as uuid } from 'uuid';
5
+ import { hoursSince } from '../utils/helpers.js';
6
+ /** Account health score thresholds */
7
+ const HEALTH_THRESHOLDS = {
8
+ HEALTHY: 70,
9
+ WARNING: 40,
10
+ CRITICAL: 0,
11
+ };
12
+ /** New account warm-up period in days */
13
+ const WARMUP_DAYS = 14;
14
+ export class AccountAction {
15
+ db;
16
+ fingerprintGuard;
17
+ constructor(db, fingerprintGuard) {
18
+ this.db = db;
19
+ this.fingerprintGuard = fingerprintGuard;
20
+ }
21
+ /**
22
+ * Import multiple accounts into the system.
23
+ */
24
+ importAccounts(accounts) {
25
+ const result = {
26
+ total: accounts.length,
27
+ success: 0,
28
+ failed: 0,
29
+ errors: [],
30
+ };
31
+ for (const acc of accounts) {
32
+ try {
33
+ const id = uuid();
34
+ this.db.createAccount({
35
+ id,
36
+ nickname: acc.nickname,
37
+ niche: acc.niche,
38
+ sessionFile: acc.sessionFile,
39
+ proxy: acc.proxy,
40
+ fingerprintId: id,
41
+ status: 'active',
42
+ timezone: 'Asia/Shanghai',
43
+ });
44
+ // Pre-generate a stable fingerprint for this account
45
+ this.fingerprintGuard.getOrCreateFingerprint(id);
46
+ result.success++;
47
+ }
48
+ catch (error) {
49
+ result.failed++;
50
+ result.errors.push({
51
+ nickname: acc.nickname,
52
+ error: error instanceof Error ? error.message : String(error),
53
+ });
54
+ }
55
+ }
56
+ return result;
57
+ }
58
+ /**
59
+ * Compute health score for an account (0-100).
60
+ */
61
+ computeHealthScore(account) {
62
+ const { consecutiveErrors, banSignals, lastActiveAt } = account.dailyStats;
63
+ let score = 100;
64
+ score -= consecutiveErrors * 15;
65
+ score -= banSignals * 30;
66
+ if (hoursSince(lastActiveAt) > 72)
67
+ score -= 20;
68
+ if (hoursSince(lastActiveAt) > 168)
69
+ score -= 30; // >1 week
70
+ return Math.max(0, Math.min(100, score));
71
+ }
72
+ /**
73
+ * Get accounts sorted by health score (highest first).
74
+ */
75
+ getAccountsByHealth() {
76
+ const accounts = this.db.getAllAccounts('active');
77
+ return accounts
78
+ .map((acc) => ({ ...acc, healthScore: this.computeHealthScore(acc) }))
79
+ .sort((a, b) => b.healthScore - a.healthScore);
80
+ }
81
+ /**
82
+ * Check if an account is in warm-up period (new account).
83
+ */
84
+ isInWarmup(account) {
85
+ const daysSinceCreation = hoursSince(account.createdAt) / 24;
86
+ return daysSinceCreation < WARMUP_DAYS;
87
+ }
88
+ /**
89
+ * Get warm-up day number (1-14) for quota adjustment.
90
+ */
91
+ getWarmupDay(account) {
92
+ const daysSinceCreation = Math.floor(hoursSince(account.createdAt) / 24) + 1;
93
+ return Math.min(daysSinceCreation, WARMUP_DAYS);
94
+ }
95
+ /**
96
+ * Get adjusted quotas for accounts in warm-up period.
97
+ * Day 1-3: browse only
98
+ * Day 4-5: likes only (≤20/day)
99
+ * Day 6-7: likes + comments + follows
100
+ * Day 8-14: first publish, gradually increase
101
+ * Day 15+: normal operation
102
+ */
103
+ getWarmupQuota(account) {
104
+ const day = this.getWarmupDay(account);
105
+ if (day <= 3) {
106
+ return { canPublish: false, likes: 0, comments: 0, follows: 0, collects: 0, browseMins: randomRange(5, 15) };
107
+ }
108
+ if (day <= 5) {
109
+ return { canPublish: false, likes: 20, comments: 0, follows: 0, collects: 5, browseMins: randomRange(10, 20) };
110
+ }
111
+ if (day <= 7) {
112
+ return { canPublish: false, likes: 30, comments: 5, follows: 10, collects: 10, browseMins: randomRange(10, 25) };
113
+ }
114
+ if (day <= 14) {
115
+ return { canPublish: true, likes: 50, comments: 15, follows: 20, collects: 20, browseMins: randomRange(15, 30) };
116
+ }
117
+ // Day 15+: full quota (handled by rate-guard)
118
+ return { canPublish: true, likes: 80, comments: 30, follows: 50, collects: 50, browseMins: 0 };
119
+ }
120
+ /**
121
+ * Pause an account (set to cooling status).
122
+ */
123
+ pauseAccount(accountId) {
124
+ this.db.updateAccountStatus(accountId, 'cooling');
125
+ }
126
+ /**
127
+ * Resume an account.
128
+ */
129
+ resumeAccount(accountId) {
130
+ this.db.updateAccountStatus(accountId, 'active');
131
+ }
132
+ /**
133
+ * Flag an account for manual review.
134
+ */
135
+ flagForReview(accountId) {
136
+ this.db.updateAccountStatus(accountId, 'manual_review');
137
+ }
138
+ }
139
+ function randomRange(min, max) {
140
+ return Math.floor(Math.random() * (max - min + 1)) + min;
141
+ }
142
+ //# sourceMappingURL=account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.js","sourceRoot":"","sources":["../../src/actions/account.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,4DAA4D;AAC5D,+DAA+D;AAK/D,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,sCAAsC;AACtC,MAAM,iBAAiB,GAAG;IACxB,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE,CAAC;CACZ,CAAC;AAEF,yCAAyC;AACzC,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,MAAM,OAAO,aAAa;IAEd;IACA;IAFV,YACU,EAAe,EACf,gBAAkC;QADlC,OAAE,GAAF,EAAE,CAAa;QACf,qBAAgB,GAAhB,gBAAgB,CAAkB;IACzC,CAAC;IAEJ;;OAEG;IACH,cAAc,CAAC,QAAyB;QACtC,MAAM,MAAM,GAAiB;YAC3B,KAAK,EAAE,QAAQ,CAAC,MAAM;YACtB,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,EAAE;SACX,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;gBAClB,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC;oBACpB,EAAE;oBACF,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,WAAW,EAAE,GAAG,CAAC,WAAW;oBAC5B,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,aAAa,EAAE,EAAE;oBACjB,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,eAAe;iBAC1B,CAAC,CAAC;gBAEH,qDAAqD;gBACrD,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;gBAEjD,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBACjB,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,OAAgB;QACjC,MAAM,EAAE,iBAAiB,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;QAE3E,IAAI,KAAK,GAAG,GAAG,CAAC;QAChB,KAAK,IAAI,iBAAiB,GAAG,EAAE,CAAC;QAChC,KAAK,IAAI,UAAU,GAAG,EAAE,CAAC;QAEzB,IAAI,UAAU,CAAC,YAAY,CAAC,GAAG,EAAE;YAAE,KAAK,IAAI,EAAE,CAAC;QAC/C,IAAI,UAAU,CAAC,YAAY,CAAC,GAAG,GAAG;YAAE,KAAK,IAAI,EAAE,CAAC,CAAC,UAAU;QAE3D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,mBAAmB;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAClD,OAAO,QAAQ;aACZ,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;aACrE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,OAAgB;QACzB,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QAC7D,OAAO,iBAAiB,GAAG,WAAW,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,OAAgB;QAC3B,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;IAClD,CAAC;IAED;;;;;;;OAOG;IACH,cAAc,CAAC,OAAgB;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAEvC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QAC/G,CAAC;QACD,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QACjH,CAAC;QACD,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QACnH,CAAC;QACD,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC;YACd,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QACnH,CAAC;QAED,8CAA8C;QAC9C,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IACjG,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,SAAiB;QAC5B,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,SAAiB;QAC7B,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,SAAiB;QAC7B,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAC1D,CAAC;CACF;AAED,SAAS,WAAW,CAAC,GAAW,EAAE,GAAW;IAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { OpenClawRuntime, Account, InteractTask, InteractTarget } from '../types/index.js';
2
+ import { FingerprintGuard } from '../risk/fingerprint-guard.js';
3
+ import { RateGuard } from '../risk/rate-guard.js';
4
+ export declare class InteractAction {
5
+ private runtime;
6
+ private fingerprintGuard;
7
+ private rateGuard;
8
+ private humanizer;
9
+ private copywriter;
10
+ constructor(runtime: OpenClawRuntime, fingerprintGuard: FingerprintGuard, rateGuard: RateGuard);
11
+ /**
12
+ * Execute a single interaction task.
13
+ */
14
+ executeTask(account: Account, task: InteractTask): Promise<void>;
15
+ /**
16
+ * Execute a batch of interaction tasks with rate-limited delays.
17
+ */
18
+ executeBatch(account: Account, targets: InteractTarget[], quota: {
19
+ likes: number;
20
+ comments: number;
21
+ follows: number;
22
+ collects: number;
23
+ }): Promise<{
24
+ completed: number;
25
+ failed: number;
26
+ }>;
27
+ /**
28
+ * Discover relevant notes/users to interact with in a niche.
29
+ */
30
+ discoverTargets(account: Account, niche: string, count?: number): Promise<InteractTarget[]>;
31
+ private likeNote;
32
+ private commentOnNote;
33
+ private followUser;
34
+ private collectNote;
35
+ private buildTasksFromTargets;
36
+ }
37
+ //# sourceMappingURL=interact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interact.d.ts","sourceRoot":"","sources":["../../src/actions/interact.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EACf,OAAO,EACP,YAAY,EACZ,cAAc,EAEf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAsB,MAAM,uBAAuB,CAAC;AAItE,qBAAa,cAAc;IAKvB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,SAAS;IANnB,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,UAAU,CAAa;gBAGrB,OAAO,EAAE,eAAe,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAE,SAAS;IAM9B;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAyCtE;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAyB9L;;OAEG;IACG,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YA4CvF,QAAQ;YAYR,aAAa;YA6Bb,UAAU;YAYV,WAAW;IAYzB,OAAO,CAAC,qBAAqB;CAoC9B"}
@@ -0,0 +1,205 @@
1
+ // ============================================================
2
+ // Interact Action — Social interaction automation (like, comment, follow, collect)
3
+ // ============================================================
4
+ import { BehaviorHumanizer } from '../risk/behavior-humanizer.js';
5
+ import { QuotaExceededError } from '../risk/rate-guard.js';
6
+ import { Copywriter } from '../agents/copywriter.js';
7
+ import { randomBetween } from '../utils/helpers.js';
8
+ export class InteractAction {
9
+ runtime;
10
+ fingerprintGuard;
11
+ rateGuard;
12
+ humanizer;
13
+ copywriter;
14
+ constructor(runtime, fingerprintGuard, rateGuard) {
15
+ this.runtime = runtime;
16
+ this.fingerprintGuard = fingerprintGuard;
17
+ this.rateGuard = rateGuard;
18
+ this.humanizer = new BehaviorHumanizer();
19
+ this.copywriter = new Copywriter(runtime);
20
+ }
21
+ /**
22
+ * Execute a single interaction task.
23
+ */
24
+ async executeTask(account, task) {
25
+ const quota = this.rateGuard.checkQuota(account.id, task.type);
26
+ if (!quota.allowed) {
27
+ throw new QuotaExceededError(quota.resetAt);
28
+ }
29
+ const page = await this.runtime.browser.newPage({
30
+ cookieFile: account.sessionFile,
31
+ proxy: account.proxy,
32
+ });
33
+ try {
34
+ await this.fingerprintGuard.applyFingerprint(page, account.id);
35
+ // Browse randomly before interacting (simulate natural usage)
36
+ await this.humanizer.browseRandomly(page, randomBetween(3, 8));
37
+ switch (task.type) {
38
+ case 'like':
39
+ await this.likeNote(page, task.targetNoteId);
40
+ break;
41
+ case 'comment':
42
+ await this.commentOnNote(page, task.targetNoteId, task.commentContent);
43
+ break;
44
+ case 'follow':
45
+ await this.followUser(page, task.targetUserId);
46
+ break;
47
+ case 'collect':
48
+ await this.collectNote(page, task.targetNoteId);
49
+ break;
50
+ }
51
+ this.rateGuard.recordAction(account.id, task.type, task.targetNoteId || task.targetUserId);
52
+ }
53
+ catch (error) {
54
+ this.rateGuard.recordFailure(account.id);
55
+ throw error;
56
+ }
57
+ finally {
58
+ await page.close();
59
+ }
60
+ }
61
+ /**
62
+ * Execute a batch of interaction tasks with rate-limited delays.
63
+ */
64
+ async executeBatch(account, targets, quota) {
65
+ let completed = 0;
66
+ let failed = 0;
67
+ const tasks = this.buildTasksFromTargets(targets, quota);
68
+ for (const task of tasks) {
69
+ try {
70
+ await this.executeTask(account, task);
71
+ completed++;
72
+ }
73
+ catch (error) {
74
+ if (error instanceof QuotaExceededError)
75
+ break;
76
+ failed++;
77
+ }
78
+ // Random delay between tasks
79
+ await this.humanizer.waitRandom(randomBetween(5000, 15000), randomBetween(20000, 40000));
80
+ }
81
+ return { completed, failed };
82
+ }
83
+ /**
84
+ * Discover relevant notes/users to interact with in a niche.
85
+ */
86
+ async discoverTargets(account, niche, count = 20) {
87
+ const page = await this.runtime.browser.newPage({
88
+ cookieFile: account.sessionFile,
89
+ proxy: account.proxy,
90
+ });
91
+ try {
92
+ await this.fingerprintGuard.applyFingerprint(page, account.id);
93
+ // Search for niche content
94
+ await page.navigate(`https://www.xiaohongshu.com/search_result?keyword=${encodeURIComponent(niche)}`);
95
+ await this.humanizer.waitRandom(2000, 4000);
96
+ // Scroll and collect note cards
97
+ const targets = [];
98
+ for (let i = 0; i < Math.ceil(count / 10); i++) {
99
+ const cards = await page.$$('.note-card, [data-type="note"]');
100
+ for (const card of cards) {
101
+ if (targets.length >= count)
102
+ break;
103
+ const noteId = await card.getAttribute('data-note-id');
104
+ const userId = await card.getAttribute('data-user-id');
105
+ if (noteId && userId) {
106
+ targets.push({
107
+ noteId,
108
+ userId,
109
+ relevanceScore: 1 - (targets.length / count), // Simple decay
110
+ });
111
+ }
112
+ }
113
+ // Scroll for more
114
+ await this.humanizer.browseRandomly(page, randomBetween(2, 5));
115
+ }
116
+ return targets;
117
+ }
118
+ finally {
119
+ await page.close();
120
+ }
121
+ }
122
+ async likeNote(page, noteId) {
123
+ await page.navigate(`https://www.xiaohongshu.com/explore/${noteId}`);
124
+ await this.humanizer.waitRandom(1500, 3000);
125
+ // Scroll to read the note naturally
126
+ await this.humanizer.browseRandomly(page, randomBetween(3, 8));
127
+ // Click like button
128
+ await this.humanizer.clickNatural(page, '.like-btn, [data-type="like"]');
129
+ await this.humanizer.waitRandom(500, 1000);
130
+ }
131
+ async commentOnNote(page, noteId, content) {
132
+ await page.navigate(`https://www.xiaohongshu.com/explore/${noteId}`);
133
+ await this.humanizer.waitRandom(1500, 3000);
134
+ // Read the note first
135
+ await this.humanizer.browseRandomly(page, randomBetween(5, 12));
136
+ // Generate comment if not provided
137
+ if (!content) {
138
+ const titleEl = await page.$('.note-title, h1');
139
+ const bodyEl = await page.$('.note-content, .note-text');
140
+ const title = (await titleEl?.textContent()) || '';
141
+ const body = (await bodyEl?.textContent()) || '';
142
+ content = await this.copywriter.generateComment(title, body.slice(0, 200));
143
+ }
144
+ // Click comment area and type
145
+ await this.humanizer.clickNatural(page, '.comment-input, [data-type="comment-input"]');
146
+ await this.humanizer.waitRandom(300, 600);
147
+ await this.humanizer.typeHuman(page, '.comment-input textarea', content, {
148
+ wpm: randomBetween(40, 80),
149
+ });
150
+ await this.humanizer.waitRandom(500, 1500);
151
+ // Submit comment
152
+ await this.humanizer.clickNatural(page, '.comment-submit, [data-type="comment-submit"]');
153
+ await this.humanizer.waitRandom(1000, 2000);
154
+ }
155
+ async followUser(page, userId) {
156
+ await page.navigate(`https://www.xiaohongshu.com/user/profile/${userId}`);
157
+ await this.humanizer.waitRandom(2000, 4000);
158
+ // Browse the user's profile
159
+ await this.humanizer.browseRandomly(page, randomBetween(3, 6));
160
+ // Click follow button
161
+ await this.humanizer.clickNatural(page, '.follow-btn, [data-type="follow"]');
162
+ await this.humanizer.waitRandom(500, 1000);
163
+ }
164
+ async collectNote(page, noteId) {
165
+ await page.navigate(`https://www.xiaohongshu.com/explore/${noteId}`);
166
+ await this.humanizer.waitRandom(1500, 3000);
167
+ // Read the note
168
+ await this.humanizer.browseRandomly(page, randomBetween(4, 8));
169
+ // Click collect button
170
+ await this.humanizer.clickNatural(page, '.collect-btn, [data-type="collect"]');
171
+ await this.humanizer.waitRandom(500, 1000);
172
+ }
173
+ buildTasksFromTargets(targets, quota) {
174
+ const tasks = [];
175
+ let likeCount = 0;
176
+ let commentCount = 0;
177
+ let followCount = 0;
178
+ let collectCount = 0;
179
+ for (const target of targets) {
180
+ // Like most targets
181
+ if (likeCount < quota.likes) {
182
+ tasks.push({ type: 'like', targetNoteId: target.noteId });
183
+ likeCount++;
184
+ }
185
+ // Comment on high-relevance targets
186
+ if (commentCount < quota.comments && target.relevanceScore > 0.5) {
187
+ tasks.push({ type: 'comment', targetNoteId: target.noteId });
188
+ commentCount++;
189
+ }
190
+ // Follow selectively
191
+ if (followCount < quota.follows && target.relevanceScore > 0.7) {
192
+ tasks.push({ type: 'follow', targetUserId: target.userId });
193
+ followCount++;
194
+ }
195
+ // Collect high-quality content
196
+ if (collectCount < quota.collects && target.relevanceScore > 0.6) {
197
+ tasks.push({ type: 'collect', targetNoteId: target.noteId });
198
+ collectCount++;
199
+ }
200
+ }
201
+ // Shuffle for more natural behavior
202
+ return tasks.sort(() => Math.random() - 0.5);
203
+ }
204
+ }
205
+ //# sourceMappingURL=interact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interact.js","sourceRoot":"","sources":["../../src/actions/interact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { OpenClawRuntime, Account, NoteContent, PublishResult } from '../types/index.js';
2
+ import { FingerprintGuard } from '../risk/fingerprint-guard.js';
3
+ import { RateGuard } from '../risk/rate-guard.js';
4
+ export declare class PublishAction {
5
+ private runtime;
6
+ private fingerprintGuard;
7
+ private rateGuard;
8
+ private humanizer;
9
+ constructor(runtime: OpenClawRuntime, fingerprintGuard: FingerprintGuard, rateGuard: RateGuard);
10
+ /**
11
+ * Publish a note with images to XHS.
12
+ */
13
+ publishNote(account: Account, note: NoteContent, images: Buffer[]): Promise<PublishResult>;
14
+ private uploadImages;
15
+ private addHashtag;
16
+ private waitForPublishSuccess;
17
+ }
18
+ //# sourceMappingURL=publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/actions/publish.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EACf,OAAO,EACP,WAAW,EACX,aAAa,EAEd,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAsB,MAAM,uBAAuB,CAAC;AAKtE,qBAAa,aAAa;IAItB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,SAAS;IALnB,OAAO,CAAC,SAAS,CAAoB;gBAG3B,OAAO,EAAE,eAAe,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAE,SAAS;IAK9B;;OAEG;IACG,WAAW,CACf,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,aAAa,CAAC;YA+DX,YAAY;YAmBZ,UAAU;YAsBV,qBAAqB;CA6BpC"}