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
@@ -0,0 +1,155 @@
1
+ // ============================================================
2
+ // Content Campaign Workflow — Scheduled multi-day content series
3
+ // ============================================================
4
+ import { Copywriter } from '../agents/copywriter.js';
5
+ import { ImageComposer } from '../agents/image-composer.js';
6
+ import { PublishAction } from '../actions/publish.js';
7
+ import { createWorkflowLogger, sleep, randomBetween } from '../utils/helpers.js';
8
+ export class ContentCampaignWorkflow {
9
+ runtime;
10
+ db;
11
+ kvStore;
12
+ fingerprintGuard;
13
+ rateGuard;
14
+ copywriter;
15
+ imageComposer;
16
+ publishAction;
17
+ constructor(runtime, db, kvStore, fingerprintGuard, rateGuard) {
18
+ this.runtime = runtime;
19
+ this.db = db;
20
+ this.kvStore = kvStore;
21
+ this.fingerprintGuard = fingerprintGuard;
22
+ this.rateGuard = rateGuard;
23
+ this.copywriter = new Copywriter(runtime);
24
+ this.imageComposer = new ImageComposer(runtime);
25
+ this.publishAction = new PublishAction(runtime, fingerprintGuard, rateGuard);
26
+ }
27
+ /**
28
+ * Start a new content campaign.
29
+ */
30
+ async startCampaign(account, config) {
31
+ const campaignId = `campaign:${account.id}:${Date.now()}`;
32
+ const log = createWorkflowLogger('content-campaign', account.id);
33
+ // Distribute topics across the campaign duration
34
+ const topicsPerDay = Math.ceil(config.totalNotes / config.daysSpan);
35
+ const allTopics = this.expandTopics(config.topics, config.totalNotes);
36
+ const state = {
37
+ campaignId,
38
+ config,
39
+ accountId: account.id,
40
+ publishedNotes: [],
41
+ remainingTopics: allTopics,
42
+ startedAt: new Date().toISOString(),
43
+ status: 'active',
44
+ };
45
+ this.kvStore.setJSON(campaignId, state);
46
+ log.info('campaign_started', { campaignId, totalTopics: allTopics.length, topicsPerDay });
47
+ return campaignId;
48
+ }
49
+ /**
50
+ * Execute today's portion of a campaign.
51
+ */
52
+ async executeDailyBatch(account, campaignId) {
53
+ const log = createWorkflowLogger('content-campaign', account.id);
54
+ const state = this.kvStore.getJSON(campaignId);
55
+ if (!state || state.status !== 'active') {
56
+ throw new Error(`Campaign ${campaignId} not found or not active`);
57
+ }
58
+ const topicsPerDay = Math.ceil(state.config.totalNotes / state.config.daysSpan);
59
+ const todayTopics = state.remainingTopics.slice(0, topicsPerDay);
60
+ if (todayTopics.length === 0) {
61
+ state.status = 'completed';
62
+ this.kvStore.setJSON(campaignId, state);
63
+ log.info('campaign_completed', { campaignId });
64
+ return { published: 0, remaining: 0 };
65
+ }
66
+ let published = 0;
67
+ for (const topic of todayTopics) {
68
+ try {
69
+ log.step(`publishing_topic: ${topic}`);
70
+ // Generate content
71
+ const content = await this.copywriter.generateNote({
72
+ topic,
73
+ style: state.config.style,
74
+ tone: state.config.tone,
75
+ keywords: [topic],
76
+ wordCount: [300, 800],
77
+ includeEmoji: true,
78
+ includeHashtags: true,
79
+ });
80
+ // Compose image
81
+ const image = await this.imageComposer.composeCoverImage(content, {
82
+ style: 'clean',
83
+ brandColors: [],
84
+ });
85
+ // Publish
86
+ const result = await this.publishAction.publishNote(account, content, [image]);
87
+ if (result.success) {
88
+ state.publishedNotes.push({
89
+ noteId: result.noteId || '',
90
+ topic,
91
+ publishedAt: new Date().toISOString(),
92
+ });
93
+ state.remainingTopics = state.remainingTopics.filter((t) => t !== topic);
94
+ published++;
95
+ log.info('note_published', { topic, noteId: result.noteId });
96
+ }
97
+ // Wait between publishes (at least 2 hours)
98
+ if (todayTopics.indexOf(topic) < todayTopics.length - 1) {
99
+ await sleep(randomBetween(2 * 60 * 60 * 1000, 3 * 60 * 60 * 1000));
100
+ }
101
+ }
102
+ catch (error) {
103
+ log.error('publish_failed', { topic, error: String(error) });
104
+ }
105
+ }
106
+ // Update state
107
+ if (state.remainingTopics.length === 0) {
108
+ state.status = 'completed';
109
+ }
110
+ this.kvStore.setJSON(campaignId, state);
111
+ return { published, remaining: state.remainingTopics.length };
112
+ }
113
+ /**
114
+ * Pause a running campaign.
115
+ */
116
+ pauseCampaign(campaignId) {
117
+ const state = this.kvStore.getJSON(campaignId);
118
+ if (state) {
119
+ state.status = 'paused';
120
+ this.kvStore.setJSON(campaignId, state);
121
+ }
122
+ }
123
+ /**
124
+ * Resume a paused campaign.
125
+ */
126
+ resumeCampaign(campaignId) {
127
+ const state = this.kvStore.getJSON(campaignId);
128
+ if (state && state.status === 'paused') {
129
+ state.status = 'active';
130
+ this.kvStore.setJSON(campaignId, state);
131
+ }
132
+ }
133
+ /**
134
+ * Get campaign status.
135
+ */
136
+ getCampaignStatus(campaignId) {
137
+ return this.kvStore.getJSON(campaignId);
138
+ }
139
+ /**
140
+ * Expand topic list to match the total number of notes needed.
141
+ */
142
+ expandTopics(topics, totalNotes) {
143
+ const expanded = [];
144
+ let idx = 0;
145
+ while (expanded.length < totalNotes) {
146
+ // Add variation suffix to avoid duplicates
147
+ const cycle = Math.floor(idx / topics.length);
148
+ const topic = topics[idx % topics.length];
149
+ expanded.push(cycle > 0 ? `${topic} (${cycle + 1})` : topic);
150
+ idx++;
151
+ }
152
+ return expanded;
153
+ }
154
+ }
155
+ //# sourceMappingURL=content-campaign.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-campaign.js","sourceRoot":"","sources":["../../src/workflows/content-campaign.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { OpenClawRuntime, Account, DailyConfig } from '../types/index.js';
2
+ import { FingerprintGuard } from '../risk/fingerprint-guard.js';
3
+ import { RateGuard } from '../risk/rate-guard.js';
4
+ import type { AppDatabase } from '../storage/database.js';
5
+ export declare class DailyOperateWorkflow {
6
+ private runtime;
7
+ private db;
8
+ private fingerprintGuard;
9
+ private rateGuard;
10
+ private copywriter;
11
+ private imageComposer;
12
+ private publishAction;
13
+ private interactAction;
14
+ private scrapeAction;
15
+ private accountAction;
16
+ constructor(runtime: OpenClawRuntime, db: AppDatabase, fingerprintGuard: FingerprintGuard, rateGuard: RateGuard);
17
+ /**
18
+ * Execute the full daily operation workflow for an account.
19
+ */
20
+ execute(account: Account, config: DailyConfig): Promise<void>;
21
+ /**
22
+ * Execute warm-up workflow for new accounts.
23
+ */
24
+ private executeWarmup;
25
+ /**
26
+ * Wait until the next best publish time window.
27
+ */
28
+ private waitUntilBestPublishTime;
29
+ private getNextTimeWindow;
30
+ /**
31
+ * Generate and store a daily operation report.
32
+ */
33
+ private generateDailyReport;
34
+ private generateRecommendations;
35
+ }
36
+ //# sourceMappingURL=daily-operate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daily-operate.d.ts","sourceRoot":"","sources":["../../src/workflows/daily-operate.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EACf,OAAO,EACP,WAAW,EAOZ,MAAM,mBAAmB,CAAC;AAQ3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAW1D,qBAAa,oBAAoB;IAS7B,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,SAAS;IAXnB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,aAAa,CAAgB;gBAG3B,OAAO,EAAE,eAAe,EACxB,EAAE,EAAE,WAAW,EACf,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAE,SAAS;IAU9B;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAqEnE;;OAEG;YACW,aAAa;IAmD3B;;OAEG;YACW,wBAAwB;IAatC,OAAO,CAAC,iBAAiB;IAczB;;OAEG;YACW,mBAAmB;IA8BjC,OAAO,CAAC,uBAAuB;CAkBhC"}
@@ -0,0 +1,222 @@
1
+ // ============================================================
2
+ // Daily Operate Workflow — Full daily automation cycle
3
+ // ============================================================
4
+ import { Copywriter } from '../agents/copywriter.js';
5
+ import { ImageComposer } from '../agents/image-composer.js';
6
+ import { PublishAction } from '../actions/publish.js';
7
+ import { InteractAction } from '../actions/interact.js';
8
+ import { ScrapeAction } from '../actions/scrape.js';
9
+ import { AccountAction } from '../actions/account.js';
10
+ import { BehaviorHumanizer } from '../risk/behavior-humanizer.js';
11
+ import { createWorkflowLogger, sleep, randomBetween, msUntilTime, today } from '../utils/helpers.js';
12
+ /** Default prime time windows for publishing */
13
+ const PRIME_WINDOWS = [
14
+ { start: '07:30', end: '09:00', score: 0.85 },
15
+ { start: '12:00', end: '13:30', score: 0.90 },
16
+ { start: '18:00', end: '20:00', score: 0.95 },
17
+ { start: '21:00', end: '23:00', score: 1.00 },
18
+ ];
19
+ export class DailyOperateWorkflow {
20
+ runtime;
21
+ db;
22
+ fingerprintGuard;
23
+ rateGuard;
24
+ copywriter;
25
+ imageComposer;
26
+ publishAction;
27
+ interactAction;
28
+ scrapeAction;
29
+ accountAction;
30
+ constructor(runtime, db, fingerprintGuard, rateGuard) {
31
+ this.runtime = runtime;
32
+ this.db = db;
33
+ this.fingerprintGuard = fingerprintGuard;
34
+ this.rateGuard = rateGuard;
35
+ this.copywriter = new Copywriter(runtime);
36
+ this.imageComposer = new ImageComposer(runtime);
37
+ this.publishAction = new PublishAction(runtime, fingerprintGuard, rateGuard);
38
+ this.interactAction = new InteractAction(runtime, fingerprintGuard, rateGuard);
39
+ this.scrapeAction = new ScrapeAction(runtime, fingerprintGuard);
40
+ this.accountAction = new AccountAction(db, fingerprintGuard);
41
+ }
42
+ /**
43
+ * Execute the full daily operation workflow for an account.
44
+ */
45
+ async execute(account, config) {
46
+ const log = createWorkflowLogger('daily-operate', account.id);
47
+ const startTime = Date.now();
48
+ try {
49
+ // Check warm-up status
50
+ if (this.accountAction.isInWarmup(account)) {
51
+ await this.executeWarmup(account, config);
52
+ return;
53
+ }
54
+ // Step 1: Scrape current metrics
55
+ log.step('scraping_metrics');
56
+ const metrics = await this.scrapeAction.scrapeAccountMetrics(account);
57
+ this.db.saveMetricsSnapshot(account.id, metrics);
58
+ log.info('metrics_scraped', { fans: metrics.fans, likes: metrics.likes });
59
+ // Step 2: Generate content based on top-performing topics
60
+ log.step('generating_content');
61
+ const bestTopic = await this.copywriter.analyzeTopPerformingTopics(metrics.notes);
62
+ const noteContent = await this.copywriter.generateNote({
63
+ topic: bestTopic,
64
+ ...config.contentStyle,
65
+ });
66
+ log.info('content_generated', { title: noteContent.title });
67
+ // Step 3: Compose cover image
68
+ log.step('composing_image');
69
+ const coverImage = await this.imageComposer.composeCoverImage(noteContent, config.imageStyle);
70
+ // Step 4: Wait for best publish time
71
+ log.step('waiting_best_time');
72
+ await this.waitUntilBestPublishTime(account.timezone);
73
+ // Step 5: Publish note
74
+ log.step('publishing');
75
+ const publishResult = await this.publishAction.publishNote(account, noteContent, [coverImage]);
76
+ if (publishResult.success) {
77
+ const noteId = this.db.saveNote(account.id, noteContent, []);
78
+ if (publishResult.noteId) {
79
+ this.db.markNotePublished(noteId, publishResult.noteId);
80
+ }
81
+ log.info('published', { noteId: publishResult.noteId });
82
+ }
83
+ else {
84
+ log.error('publish_failed', { error: publishResult.error });
85
+ }
86
+ // Step 6: Interaction growth
87
+ log.step('interacting');
88
+ const targets = await this.interactAction.discoverTargets(account, config.niche);
89
+ const interactResult = await this.interactAction.executeBatch(account, targets, config.interactQuota);
90
+ log.info('interactions_done', interactResult);
91
+ // Step 7: Generate daily report
92
+ log.step('reporting');
93
+ await this.generateDailyReport(account, metrics, publishResult);
94
+ const duration = Date.now() - startTime;
95
+ this.db.logWorkflow(account.id, 'daily-operate', 'completed', 'completed', undefined, duration);
96
+ log.info('workflow_complete', { durationMs: duration });
97
+ }
98
+ catch (error) {
99
+ const errorMsg = error instanceof Error ? error.message : String(error);
100
+ log.error('workflow_failed', { error: errorMsg });
101
+ this.db.logWorkflow(account.id, 'daily-operate', 'failed', 'failed', errorMsg, Date.now() - startTime);
102
+ throw error;
103
+ }
104
+ }
105
+ /**
106
+ * Execute warm-up workflow for new accounts.
107
+ */
108
+ async executeWarmup(account, config) {
109
+ const log = createWorkflowLogger('warmup', account.id);
110
+ const quota = this.accountAction.getWarmupQuota(account);
111
+ const day = this.accountAction.getWarmupDay(account);
112
+ log.info('warmup_day', { day, quota });
113
+ // Browse randomly (all days)
114
+ if (quota.browseMins > 0) {
115
+ log.step('browsing');
116
+ const page = await this.runtime.browser.newPage({
117
+ cookieFile: account.sessionFile,
118
+ proxy: account.proxy,
119
+ });
120
+ try {
121
+ await this.fingerprintGuard.applyFingerprint(page, account.id);
122
+ await page.navigate('https://www.xiaohongshu.com');
123
+ const h = new BehaviorHumanizer();
124
+ await h.browseRandomly(page, quota.browseMins * 60);
125
+ }
126
+ finally {
127
+ await page.close();
128
+ }
129
+ }
130
+ // Interact if allowed
131
+ if (quota.likes > 0 || quota.comments > 0 || quota.follows > 0) {
132
+ log.step('interacting');
133
+ const targets = await this.interactAction.discoverTargets(account, config.niche, 10);
134
+ await this.interactAction.executeBatch(account, targets, {
135
+ likes: quota.likes,
136
+ comments: quota.comments,
137
+ follows: quota.follows,
138
+ collects: quota.collects,
139
+ });
140
+ }
141
+ // Publish if allowed (day 8+)
142
+ if (quota.canPublish && day >= 8) {
143
+ log.step('first_publish');
144
+ const noteContent = await this.copywriter.generateNote({
145
+ topic: config.niche,
146
+ ...config.contentStyle,
147
+ });
148
+ const coverImage = await this.imageComposer.composeCoverImage(noteContent, config.imageStyle);
149
+ await this.waitUntilBestPublishTime(account.timezone);
150
+ await this.publishAction.publishNote(account, noteContent, [coverImage]);
151
+ }
152
+ log.info('warmup_complete', { day });
153
+ }
154
+ /**
155
+ * Wait until the next best publish time window.
156
+ */
157
+ async waitUntilBestPublishTime(timezone) {
158
+ const nextWindow = this.getNextTimeWindow(PRIME_WINDOWS, timezone);
159
+ if (!nextWindow)
160
+ return;
161
+ const waitMs = msUntilTime(nextWindow.start, timezone);
162
+ if (waitMs > 0 && waitMs < 12 * 60 * 60 * 1000) { // Don't wait more than 12 hours
163
+ await sleep(waitMs);
164
+ }
165
+ // Random offset within the window to avoid pattern detection
166
+ await sleep(randomBetween(0, 15 * 60 * 1000));
167
+ }
168
+ getNextTimeWindow(windows, _timezone) {
169
+ const now = new Date();
170
+ const currentMinutes = now.getHours() * 60 + now.getMinutes();
171
+ // Find the next upcoming window
172
+ for (const w of windows) {
173
+ const [h, m] = w.start.split(':').map(Number);
174
+ if (h * 60 + m > currentMinutes)
175
+ return w;
176
+ }
177
+ // All windows passed today, return first window for tomorrow
178
+ return windows[0] || null;
179
+ }
180
+ /**
181
+ * Generate and store a daily operation report.
182
+ */
183
+ async generateDailyReport(account, metrics, publishResult) {
184
+ const metricsHistory = this.db.getMetricsHistory(account.id, 7);
185
+ // Calculate growth trends
186
+ const previousMetrics = metricsHistory.length > 1 ? metricsHistory[1] : null;
187
+ const growthTrend = {
188
+ fansGrowth: previousMetrics ? metrics.fans - previousMetrics.fans : 0,
189
+ likesGrowth: previousMetrics ? metrics.likes - previousMetrics.total_likes : 0,
190
+ collectsGrowth: previousMetrics ? metrics.collects - previousMetrics.total_collects : 0,
191
+ avgNoteViews: metrics.notes.length > 0
192
+ ? metrics.notes.reduce((sum, n) => sum + n.views, 0) / metrics.notes.length
193
+ : 0,
194
+ };
195
+ const report = {
196
+ accountId: account.id,
197
+ dateRange: { start: new Date(today()), end: new Date(today()) },
198
+ metricsOverview: metrics,
199
+ contentPerformance: metrics.notes.slice(0, 10),
200
+ growthTrend,
201
+ recommendations: this.generateRecommendations(metrics, growthTrend),
202
+ };
203
+ return report;
204
+ }
205
+ generateRecommendations(metrics, trend) {
206
+ const recs = [];
207
+ if (trend.fansGrowth < 0) {
208
+ recs.push('粉丝数下降,建议增加互动频率和内容质量');
209
+ }
210
+ if (trend.avgNoteViews < 100) {
211
+ recs.push('笔记平均浏览量较低,建议优化标题和封面');
212
+ }
213
+ if (metrics.notes.length > 0) {
214
+ const avgEngagement = metrics.notes.reduce((sum, n) => sum + n.likes + n.comments, 0) / metrics.notes.length;
215
+ if (avgEngagement < 10) {
216
+ recs.push('互动率偏低,建议在正文中增加互动引导');
217
+ }
218
+ }
219
+ return recs;
220
+ }
221
+ }
222
+ //# sourceMappingURL=daily-operate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daily-operate.js","sourceRoot":"","sources":["../../src/workflows/daily-operate.ts"],"names":[],"mappings":"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"}
package/manifest.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "id": "xhs-operator",
3
+ "name": "小红书自动运营",
4
+ "version": "1.0.0",
5
+ "openclaw_api": "^2.0.0",
6
+ "permissions": [
7
+ "browser:navigate",
8
+ "browser:click",
9
+ "browser:input",
10
+ "browser:screenshot",
11
+ "storage:read",
12
+ "storage:write",
13
+ "network:fetch",
14
+ "ai:completion",
15
+ "ai:image_generation"
16
+ ],
17
+ "target_origins": [
18
+ "https://www.xiaohongshu.com",
19
+ "https://creator.xiaohongshu.com"
20
+ ],
21
+ "sandbox": {
22
+ "isolation": "strict",
23
+ "prompt_injection_guard": true,
24
+ "max_concurrent_sessions": 5
25
+ },
26
+ "risk_profile": "medium",
27
+ "author": "your-org",
28
+ "license": "MIT"
29
+ }
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "xhs-operator",
3
+ "version": "1.0.0-beta.1",
4
+ "description": "小红书自动运营 OpenClaw 插件 — 支持内容发布、互动增长、数据监控",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "bin": {
15
+ "xhs-operator": "./dist/cli.js"
16
+ },
17
+ "files": [
18
+ "dist/",
19
+ "manifest.json",
20
+ "README.md"
21
+ ],
22
+ "scripts": {
23
+ "build": "tsc",
24
+ "dev": "tsc --watch",
25
+ "start": "node dist/cli.js",
26
+ "test": "vitest run",
27
+ "test:watch": "vitest",
28
+ "lint": "tsc --noEmit",
29
+ "prepare": "npm run build",
30
+ "postinstall": "node -e \"const fs=require('fs');['data'].forEach(d=>fs.mkdirSync(d,{recursive:true}))\" 2>/dev/null || true"
31
+ },
32
+ "keywords": [
33
+ "openclaw",
34
+ "xiaohongshu",
35
+ "xhs",
36
+ "rednote",
37
+ "automation",
38
+ "plugin",
39
+ "social-media"
40
+ ],
41
+ "author": "your-org",
42
+ "license": "MIT",
43
+ "engines": {
44
+ "node": ">=20.0.0"
45
+ },
46
+ "dependencies": {
47
+ "@anthropic-ai/sdk": "^0.36.3",
48
+ "better-sqlite3": "^11.0.0",
49
+ "node-cron": "^3.0.3",
50
+ "pino": "^9.0.0",
51
+ "playwright": "^1.49.0",
52
+ "sharp": "^0.33.0",
53
+ "uuid": "^10.0.0"
54
+ },
55
+ "devDependencies": {
56
+ "@types/better-sqlite3": "^7.6.0",
57
+ "@types/node": "^22.0.0",
58
+ "@types/node-cron": "^3.0.0",
59
+ "@types/uuid": "^10.0.0",
60
+ "typescript": "^5.6.0",
61
+ "vitest": "^2.0.0"
62
+ },
63
+ "optionalDependencies": {
64
+ "sharp": "^0.33.0"
65
+ }
66
+ }