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.
- package/README.md +100 -0
- package/dist/actions/account.d.ts +59 -0
- package/dist/actions/account.d.ts.map +1 -0
- package/dist/actions/account.js +142 -0
- package/dist/actions/account.js.map +1 -0
- package/dist/actions/interact.d.ts +37 -0
- package/dist/actions/interact.d.ts.map +1 -0
- package/dist/actions/interact.js +205 -0
- package/dist/actions/interact.js.map +1 -0
- package/dist/actions/publish.d.ts +18 -0
- package/dist/actions/publish.d.ts.map +1 -0
- package/dist/actions/publish.js +135 -0
- package/dist/actions/publish.js.map +1 -0
- package/dist/actions/scrape.d.ts +21 -0
- package/dist/actions/scrape.d.ts.map +1 -0
- package/dist/actions/scrape.js +145 -0
- package/dist/actions/scrape.js.map +1 -0
- package/dist/agents/copywriter.d.ts +21 -0
- package/dist/agents/copywriter.d.ts.map +1 -0
- package/dist/agents/copywriter.js +115 -0
- package/dist/agents/copywriter.js.map +1 -0
- package/dist/agents/image-composer.d.ts +26 -0
- package/dist/agents/image-composer.d.ts.map +1 -0
- package/dist/agents/image-composer.js +103 -0
- package/dist/agents/image-composer.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +204 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +61 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +182 -0
- package/dist/plugin.js.map +1 -0
- package/dist/risk/behavior-humanizer.d.ts +30 -0
- package/dist/risk/behavior-humanizer.d.ts.map +1 -0
- package/dist/risk/behavior-humanizer.js +105 -0
- package/dist/risk/behavior-humanizer.js.map +1 -0
- package/dist/risk/fingerprint-guard.d.ts +23 -0
- package/dist/risk/fingerprint-guard.d.ts.map +1 -0
- package/dist/risk/fingerprint-guard.js +127 -0
- package/dist/risk/fingerprint-guard.js.map +1 -0
- package/dist/risk/rate-guard.d.ts +33 -0
- package/dist/risk/rate-guard.d.ts.map +1 -0
- package/dist/risk/rate-guard.js +104 -0
- package/dist/risk/rate-guard.js.map +1 -0
- package/dist/runtime/standalone.d.ts +15 -0
- package/dist/runtime/standalone.d.ts.map +1 -0
- package/dist/runtime/standalone.js +199 -0
- package/dist/runtime/standalone.js.map +1 -0
- package/dist/scheduler.d.ts +42 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +139 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/storage/database.d.ts +23 -0
- package/dist/storage/database.d.ts.map +1 -0
- package/dist/storage/database.js +142 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/storage/kv-store.d.ts +13 -0
- package/dist/storage/kv-store.d.ts.map +1 -0
- package/dist/storage/kv-store.js +60 -0
- package/dist/storage/kv-store.js.map +1 -0
- package/dist/types/index.d.ts +320 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/helpers.d.ts +63 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +115 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/workflows/content-campaign.d.ts +58 -0
- package/dist/workflows/content-campaign.d.ts.map +1 -0
- package/dist/workflows/content-campaign.js +155 -0
- package/dist/workflows/content-campaign.js.map +1 -0
- package/dist/workflows/daily-operate.d.ts +36 -0
- package/dist/workflows/daily-operate.d.ts.map +1 -0
- package/dist/workflows/daily-operate.js +222 -0
- package/dist/workflows/daily-operate.js.map +1 -0
- package/manifest.json +29 -0
- 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
|
+
}
|