@luoyi-dsh/instagram-scroll 1.0.1 → 1.0.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.
@@ -7,7 +7,7 @@
7
7
  * 就在該貼文底下留一條評論「@主人 + 推薦原因」,並記錄至今日日報。
8
8
  * ============================================================================
9
9
  */
10
- import type { InstagramMcpClient } from '@luoyi-dsh/instagram-mcp';
10
+ import type { InstagramMcpClient, InstagramPost } from '@luoyi-dsh/instagram-mcp';
11
11
  import { InstagramScrollConfig } from '../config.js';
12
12
  import { ScrollLedgerManager } from '../lib/ledger.js';
13
13
  export interface ScrollRoundResult {
@@ -22,8 +22,37 @@ export interface ScrollRoundResult {
22
22
  url: string;
23
23
  score: number;
24
24
  comment: string;
25
+ reason: string;
25
26
  }>;
26
27
  message: string;
27
28
  }
29
+ export interface ParsedPostContent {
30
+ rawCaption: string;
31
+ cleanBody: string;
32
+ hashtags: string[];
33
+ mentions: string[];
34
+ tagCount: number;
35
+ tagCharLength: number;
36
+ cleanLength: number;
37
+ isTagSpam: boolean;
38
+ }
39
+ export interface EvaluationResult {
40
+ isWorthy: boolean;
41
+ score: number;
42
+ reason: string;
43
+ commentText: string;
44
+ rejectionReason?: string;
45
+ reviewMethod: 'llm' | 'heuristic';
46
+ }
47
+ /**
48
+ * 正文解析與標籤分離器
49
+ * 徹底區分貼文真正的正文內容與文末堆砌的標籤 (防止標籤農場誤導)
50
+ */
51
+ export declare function parsePostContent(caption?: string): ParsedPostContent;
52
+ /**
53
+ * 嚴密的高精度內容檢驗引擎 (Content Inspection Pipeline)
54
+ * 解決痛點:「不要隨便推薦、要依據用戶喜歡內容、@ 前要檢查貼文內容、不要只看 tag」
55
+ */
56
+ export declare function inspectAndEvaluatePost(ctx: any, post: InstagramPost, config: InstagramScrollConfig): Promise<EvaluationResult>;
28
57
  export declare function executeScrollRound(ctx: any, config: InstagramScrollConfig, mcp: InstagramMcpClient, ledger: ScrollLedgerManager, log?: (msg: string) => void): Promise<ScrollRoundResult>;
29
58
  //# sourceMappingURL=scrollDuty.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scrollDuty.d.ts","sourceRoot":"","sources":["../../src/core/scrollDuty.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAiB,MAAM,0BAA0B,CAAA;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAEtD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAA;IACX,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,KAAK,CAAC;QACrB,MAAM,EAAE,MAAM,CAAA;QACd,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;QACd,GAAG,EAAE,MAAM,CAAA;QACX,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,MAAM,CAAA;KAChB,CAAC,CAAA;IACF,OAAO,EAAE,MAAM,CAAA;CAChB;AAuED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,qBAAqB,EAC7B,GAAG,EAAE,kBAAkB,EACvB,MAAM,EAAE,mBAAmB,EAC3B,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAkB,GACvC,OAAO,CAAC,iBAAiB,CAAC,CA2H5B"}
1
+ {"version":3,"file":"scrollDuty.d.ts","sourceRoot":"","sources":["../../src/core/scrollDuty.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAEtD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAA;IACX,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,KAAK,CAAC;QACrB,MAAM,EAAE,MAAM,CAAA;QACd,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;QACd,GAAG,EAAE,MAAM,CAAA;QACX,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,MAAM,CAAA;QACf,MAAM,EAAE,MAAM,CAAA;KACf,CAAC,CAAA;IACF,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,YAAY,EAAE,KAAK,GAAG,WAAW,CAAA;CAClC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,MAAW,GAAG,iBAAiB,CAkCxE;AAqED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAoM3B;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,qBAAqB,EAC7B,GAAG,EAAE,kBAAkB,EACvB,MAAM,EAAE,mBAAmB,EAC3B,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAkB,GACvC,OAAO,CAAC,iBAAiB,CAAC,CA4M5B"}
@@ -8,76 +8,316 @@
8
8
  * ============================================================================
9
9
  */
10
10
  /**
11
- * 簡易而實用的評估與推薦語產生器
12
- * 結合貼文內文關鍵字權重、互動熱度與語意提示進行評分
11
+ * 正文解析與標籤分離器
12
+ * 徹底區分貼文真正的正文內容與文末堆砌的標籤 (防止標籤農場誤導)
13
13
  */
14
- function evaluatePost(post, config) {
15
- const caption = (post.caption || '').toLowerCase();
16
- const tags = config.interestTags || [];
17
- let score = 50;
18
- // 1. 關鍵字與標籤匹配加分
19
- let hitTags = [];
20
- for (const tag of tags) {
21
- const clean = tag.replace(/^#/, '').toLowerCase().trim();
22
- if (clean && caption.includes(clean)) {
23
- hitTags.push(clean);
24
- score += 12;
14
+ export function parsePostContent(caption = '') {
15
+ const rawCaption = String(caption || '').trim();
16
+ // 提取所有 hashtag 與 mention
17
+ const hashtags = (rawCaption.match(/#[\p{L}\p{N}_]+/gu) || []).map((t) => t.slice(1).toLowerCase());
18
+ const mentions = (rawCaption.match(/@[\p{L}\p{N}._]+/gu) || []).map((m) => m.slice(1));
19
+ // 移除所有 #tag 與 @mention,整理出真正的正文文字
20
+ let cleanBody = rawCaption
21
+ .replace(/#[\p{L}\p{N}_]+/gu, ' ')
22
+ .replace(/@[\p{L}\p{N}._]+/gu, ' ')
23
+ .replace(/[ \t]+/g, ' ')
24
+ .replace(/\n\s*\n+/g, '\n')
25
+ .trim();
26
+ const cleanLength = cleanBody.length;
27
+ const tagCount = hashtags.length;
28
+ const tagCharLength = hashtags.reduce((acc, tag) => acc + tag.length, 0);
29
+ // 判定是否為標籤農場 (Hashtag Spam):
30
+ // 1. 標籤數量超過 12 個
31
+ // 2. 標籤總長度超越正文長度且正文字數小於 40 字
32
+ const isTagSpam = tagCount > 12 || (tagCount >= 6 && tagCharLength > cleanLength && cleanLength < 40);
33
+ return {
34
+ rawCaption,
35
+ cleanBody,
36
+ hashtags,
37
+ mentions,
38
+ tagCount,
39
+ tagCharLength,
40
+ cleanLength,
41
+ isTagSpam,
42
+ };
43
+ }
44
+ /**
45
+ * 調用宿主 LLM 或環境變數中的 DeepSeek / OpenAI 服務進行深度語義內容審查
46
+ */
47
+ async function callLlmInference(ctx, systemPrompt, userPrompt) {
48
+ // 1. 優先嘗試 DSH 宿主注入的 LLM 服務
49
+ const llm = (typeof ctx?.get === 'function' ? ctx.get('llm') : null) || ctx?.llm;
50
+ if (llm) {
51
+ try {
52
+ if (typeof llm.chat === 'function') {
53
+ const res = await llm.chat({
54
+ messages: [
55
+ { role: 'system', content: systemPrompt },
56
+ { role: 'user', content: userPrompt },
57
+ ],
58
+ temperature: 0.3,
59
+ });
60
+ const reply = res?.content || res?.text || (typeof res === 'string' ? res : '');
61
+ if (reply)
62
+ return reply;
63
+ }
64
+ if (typeof llm.complete === 'function') {
65
+ const reply = await llm.complete(`${systemPrompt}\n\n${userPrompt}`);
66
+ if (reply)
67
+ return reply;
68
+ }
69
+ }
70
+ catch (e) {
71
+ console.warn(`[ScrollDuty LLM] 宿主 ctx.llm 調用異常: ${e.message}`);
25
72
  }
26
73
  }
27
- // 2. 互動熱度與品質加分
28
- const likes = post.like_count || 0;
29
- const comments = post.comment_count || 0;
30
- if (likes > 500)
31
- score += 10;
32
- else if (likes > 100)
33
- score += 5;
34
- if (comments > 20)
35
- score += 8;
36
- else if (comments > 5)
37
- score += 4;
38
- // 3. 內文長度加分(有原創詳細說明通常更具乾貨)
39
- if (caption.length > 100)
40
- score += 8;
41
- // 4. 廣告或過濾詞扣分
42
- const spamKeywords = ['互粉', '代購', '博彩', '運彩', '兼職', '抽獎', '免費領'];
43
- for (const kw of spamKeywords) {
44
- if (caption.includes(kw)) {
45
- score -= 35;
46
- }
47
- }
48
- score = Math.min(98, Math.max(20, score));
49
- const isWorthy = score >= (config.minScore || 75);
50
- let reason = '';
51
- let commentText = '';
74
+ // 2. 檢查備援環境變數 (DeepSeek / OpenAI)
75
+ const apiKey = process.env.DEEPSEEK_API_KEY || process.env.OPENAI_API_KEY;
76
+ const baseUrl = process.env.DEEPSEEK_API_BASE || process.env.OPENAI_BASE_URL || 'https://api.deepseek.com';
77
+ if (apiKey) {
78
+ try {
79
+ const resp = await fetch(`${baseUrl}/chat/completions`, {
80
+ method: 'POST',
81
+ headers: {
82
+ 'Content-Type': 'application/json',
83
+ Authorization: `Bearer ${apiKey}`,
84
+ },
85
+ body: JSON.stringify({
86
+ model: process.env.DEEPSEEK_MODEL || 'deepseek-chat',
87
+ messages: [
88
+ { role: 'system', content: systemPrompt },
89
+ { role: 'user', content: userPrompt },
90
+ ],
91
+ temperature: 0.3,
92
+ response_format: { type: 'json_object' },
93
+ }),
94
+ });
95
+ if (resp.ok) {
96
+ const data = (await resp.json());
97
+ return data.choices?.[0]?.message?.content || null;
98
+ }
99
+ }
100
+ catch (err) {
101
+ console.warn(`[ScrollDuty LLM] 外部 API 調用異常: ${err.message}`);
102
+ }
103
+ }
104
+ return null;
105
+ }
106
+ /**
107
+ * 嚴密的高精度內容檢驗引擎 (Content Inspection Pipeline)
108
+ * 解決痛點:「不要隨便推薦、要依據用戶喜歡內容、@ 前要檢查貼文內容、不要只看 tag」
109
+ */
110
+ export async function inspectAndEvaluatePost(ctx, post, config) {
52
111
  const master = (config.masterUsername || '').replace(/^@/, '').trim();
53
- if (isWorthy) {
54
- if (hitTags.length > 0) {
55
- reason = `精準命中主人關注領域 [#${hitTags.join(', #')}],內容高質且社群互動熱絡 (${likes} 讚, ${comments} 則留言)。`;
56
- const hookPhrases = [
57
- '這篇思路與案例很不錯,特別推薦你看一下!',
58
- '發現這個很對你的胃口,覺得對你手邊專案很有幫助!',
59
- '這篇乾貨滿滿,看到覺得不能錯過,推推!',
60
- '這篇分析非常到位,特地 @ 你存起來參考!',
61
- ];
62
- const chosenHook = hookPhrases[Math.floor(Math.random() * hookPhrases.length)];
63
- commentText = master ? `@${master} ${chosenHook}` : `這篇乾貨非常精彩,推薦關注!`;
112
+ const parsed = parsePostContent(post.caption || '');
113
+ const minScore = config.minScore || 80;
114
+ const minLength = config.minCaptionLength || 30;
115
+ const userInterests = config.userInterests ||
116
+ '專注於前沿 AI 技術、開源軟體、全端與前端架構、實用開發工具、優質 UI/UX 設計技巧或實用技術深度解析;喜愛實踐乾貨與原創見解。';
117
+ // === 第 1 關:正文實質內容字數檢驗 (拒絕無內文或純圖廢文) ===
118
+ if (parsed.cleanLength < minLength) {
119
+ return {
120
+ isWorthy: false,
121
+ score: 15,
122
+ reason: '',
123
+ rejectionReason: `正文有效字數不足 (${parsed.cleanLength} 字 < 門檻 ${minLength} 字),資訊量過少無實質乾貨內容。`,
124
+ commentText: '',
125
+ reviewMethod: 'heuristic',
126
+ };
127
+ }
128
+ // === 第 2 關:標籤農場檢查 (拒絕標籤堆砌蹭熱度) ===
129
+ if (parsed.isTagSpam) {
130
+ return {
131
+ isWorthy: false,
132
+ score: 20,
133
+ reason: '',
134
+ rejectionReason: `判定為標籤農場 (包含 ${parsed.tagCount} 個標籤,標籤佔比過高且正文空洞)。`,
135
+ commentText: '',
136
+ reviewMethod: 'heuristic',
137
+ };
138
+ }
139
+ // === 第 3 關:負面詞與廣告過濾 (Negative Keywords / Spam Filter) ===
140
+ const negativeWords = config.negativeKeywords || [];
141
+ const rawLower = parsed.rawCaption.toLowerCase();
142
+ for (const badKw of negativeWords) {
143
+ const cleanKw = badKw.toLowerCase().trim();
144
+ if (cleanKw && rawLower.includes(cleanKw)) {
145
+ return {
146
+ isWorthy: false,
147
+ score: 10,
148
+ reason: '',
149
+ rejectionReason: `命中排除關鍵字/廣告宣傳詞彙 [${cleanKw}]。`,
150
+ commentText: '',
151
+ reviewMethod: 'heuristic',
152
+ };
64
153
  }
65
- else {
66
- reason = `熱門高讚貼文 (${likes} 讚),討論熱烈,具備高參考價值。`;
67
- commentText = master ? `@${master} 看到這篇討論很熱絡,分享給你看看!` : '推薦這篇精彩內容!';
154
+ }
155
+ // === 第 4 關:正文實質主題核驗 (不能只看文末 tag) ===
156
+ const positiveWords = config.positiveKeywords || [];
157
+ const cleanLower = parsed.cleanBody.toLowerCase();
158
+ const hitBodyKeywords = [];
159
+ for (const kw of positiveWords) {
160
+ const cleanKw = kw.toLowerCase().trim();
161
+ if (cleanKw && cleanLower.includes(cleanKw)) {
162
+ hitBodyKeywords.push(cleanKw);
163
+ }
164
+ }
165
+ // 若設定要求「正文必須命中用戶偏好」,且正文未命中任何關鍵字,直接退回
166
+ if (config.requireBodyMatch && hitBodyKeywords.length === 0) {
167
+ return {
168
+ isWorthy: false,
169
+ score: 30,
170
+ reason: '',
171
+ rejectionReason: `正文實質內容未提及主人偏好領域關鍵字 (僅文末標籤包含相關字詞,判定為蹭熱度)。`,
172
+ commentText: '',
173
+ reviewMethod: 'heuristic',
174
+ };
175
+ }
176
+ // === 第 5 關:LLM 深度語義質檢 (如果環境具備 LLM 能力) ===
177
+ const systemPrompt = `你是一位高品味、眼光極為嚴格的私人內容審查特助。
178
+ 主人的核心原則是:「絕對不要隨便推薦、必須切合主人喜歡的內容,在留言 @ 主人之前必須深入檢查正文實質內容,嚴禁只看文末的 tag 就隨意推薦」。
179
+ 主人的內容偏好定義如下:
180
+ """
181
+ ${userInterests}
182
+ """
183
+
184
+ 任務要求:
185
+ 1. 請審查貼文正文是否深度探討主人喜歡的主題,還是只是空泛的標籤農場或蹭流量。
186
+ 2. 評估內容是否具備前沿實踐、技術見解、架構乾貨或優質教學價值。
187
+ 3. 若內容確實極為優秀且深度符合主人喜好,請給出大於等於 ${minScore} 的高分,並撰寫簡短真誠、針對此篇貼文具體乾貨的一句話推坑留言 (不要千篇一律套話)。
188
+ 4. 若品質普通、偏題或僅表面蹭熱度,給予低於 ${minScore} 的分數並給出 rejectionReason。
189
+
190
+ 請嚴格輸出 JSON 格式:
191
+ {
192
+ "isWorthy": boolean,
193
+ "score": number, // 0-100
194
+ "summary": "貼文真正主旨簡介 (30字內)",
195
+ "rejectionReason": "未通過的原因 (若不合格)",
196
+ "reason": "推薦給主人的實質價值說明 (若合格)",
197
+ "hookPhrase": "針對本篇內容亮點量身打造的推坑一句話 (若合格,25字內,真誠具體,嚴禁空洞廢話)"
198
+ }`;
199
+ const userPrompt = `請審查以下 Instagram 貼文:
200
+ - 作者:@${post.user?.username || 'unknown'}
201
+ - 互動數據:${post.like_count || 0} 讚, ${post.comment_count || 0} 則留言
202
+ - 貼文真正正文內容 (已剔除標籤):
203
+ """
204
+ ${parsed.cleanBody.slice(0, 800)}
205
+ """
206
+ - 文末標籤清單:#${parsed.hashtags.join(', #')}
207
+ - 正文命中之領域詞:${hitBodyKeywords.join(', ') || '無'}
208
+
209
+ 請依據審查原則進行嚴格評估並以 JSON 返回。`;
210
+ const llmResponse = await callLlmInference(ctx, systemPrompt, userPrompt);
211
+ if (llmResponse) {
212
+ try {
213
+ const cleanedJson = llmResponse.replace(/^```json\s*/i, '').replace(/\s*```$/i, '').trim();
214
+ const parsedLlm = JSON.parse(cleanedJson);
215
+ const score = Number(parsedLlm.score || 0);
216
+ const isWorthy = Boolean(parsedLlm.isWorthy) && score >= minScore;
217
+ if (isWorthy) {
218
+ const hook = String(parsedLlm.hookPhrase || parsedLlm.reason || '這篇分析非常到位,強烈推薦!').trim();
219
+ const commentText = master ? `@${master} ${hook}` : hook;
220
+ return {
221
+ isWorthy: true,
222
+ score,
223
+ reason: String(parsedLlm.reason || parsedLlm.summary || '內容深度契合主人關注領域且具備乾貨價值。'),
224
+ commentText,
225
+ reviewMethod: 'llm',
226
+ };
227
+ }
228
+ else {
229
+ return {
230
+ isWorthy: false,
231
+ score,
232
+ reason: '',
233
+ rejectionReason: String(parsedLlm.rejectionReason || '內容深度未達主人品味標準或主題不符。'),
234
+ commentText: '',
235
+ reviewMethod: 'llm',
236
+ };
237
+ }
238
+ }
239
+ catch (e) {
240
+ console.warn(`[ScrollDuty] LLM 結果 JSON 解析異常: ${e.message}`);
68
241
  }
69
242
  }
70
- return { isWorthy, score, reason, commentText };
243
+ // === 備援:啟發式嚴密內容質檢 (Heuristic Rule Engine) ===
244
+ // 當宿主無 LLM 或 LLM 調用異常時,依然嚴守品質底線,絕不隨便推薦!
245
+ let heuristicScore = 40; // 底分
246
+ // 正文字數深度加分 (有較長詳細說明通常具備更高乾貨密度)
247
+ if (parsed.cleanLength > 300)
248
+ heuristicScore += 18;
249
+ else if (parsed.cleanLength > 150)
250
+ heuristicScore += 12;
251
+ else if (parsed.cleanLength > 60)
252
+ heuristicScore += 6;
253
+ // 正文實質命中關鍵詞加分
254
+ heuristicScore += Math.min(25, hitBodyKeywords.length * 8);
255
+ // 乾貨排版特徵檢查 (具備條列、步驟或結構化排版)
256
+ if (/[0-9][.、]|👉|✅|🔹|💡|📌|\n- |\n\* /.test(parsed.cleanBody)) {
257
+ heuristicScore += 10;
258
+ }
259
+ // 社群互動數據適度輔助加分 (最多 12 分,避免高讚垃圾貼文)
260
+ const likes = post.like_count || 0;
261
+ const comments = post.comment_count || 0;
262
+ if (likes > 300)
263
+ heuristicScore += 6;
264
+ if (comments > 15)
265
+ heuristicScore += 6;
266
+ heuristicScore = Math.min(96, Math.max(10, heuristicScore));
267
+ const isHeuristicWorthy = heuristicScore >= minScore;
268
+ if (isHeuristicWorthy) {
269
+ const reason = `正文實質深度探討 [${hitBodyKeywords.slice(0, 3).join(', ')}],文字詳實完整 (${parsed.cleanLength} 字),結構條理分明。`;
270
+ const hookPhrases = [
271
+ `這篇關於 ${hitBodyKeywords[0] || '該主題'} 的內容分享非常扎實,特別推薦你看!`,
272
+ `發現這篇乾貨對你的方向很有啟發,特地 @ 你存起來!`,
273
+ `這篇思路與案例分析得很透徹,內容很硬核,推推!`,
274
+ ];
275
+ const chosenHook = hookPhrases[Math.floor(Math.random() * hookPhrases.length)];
276
+ const commentText = master ? `@${master} ${chosenHook}` : `這篇乾貨非常精彩,推薦關注!`;
277
+ return {
278
+ isWorthy: true,
279
+ score: heuristicScore,
280
+ reason,
281
+ commentText,
282
+ reviewMethod: 'heuristic',
283
+ };
284
+ }
285
+ else {
286
+ return {
287
+ isWorthy: false,
288
+ score: heuristicScore,
289
+ reason: '',
290
+ rejectionReason: `內容乾貨密度評分 (${heuristicScore}) 未達嚴選門檻 (${minScore})。`,
291
+ commentText: '',
292
+ reviewMethod: 'heuristic',
293
+ };
294
+ }
71
295
  }
72
296
  export async function executeScrollRound(ctx, config, mcp, ledger, log = console.log) {
73
- log('[ScrollDuty] 🚀 開始替主人刷一輪 Instagram...');
297
+ // 防風控冷卻保護檢查
298
+ if (ledger.isInCooldown()) {
299
+ const rem = ledger.getCooldownRemainingSeconds();
300
+ const reason = ledger.getCooldownReason();
301
+ const msg = `防風控冷卻保護中(剩餘 ${rem} 秒,原因: ${reason}),暫停本輪滾動瀏覽`;
302
+ log(`[ScrollDuty] 🚨 ${msg}`);
303
+ return {
304
+ ok: true,
305
+ totalScanned: 0,
306
+ worthyCount: 0,
307
+ recommendedCount: 0,
308
+ recommendations: [],
309
+ message: msg,
310
+ };
311
+ }
312
+ log('[ScrollDuty] 🚀 開始替主人刷一輪 Instagram (啟動正文內容嚴格審查模式)...');
74
313
  const master = (config.masterUsername || '').replace(/^@/, '').trim();
75
314
  if (!master) {
76
- log('[ScrollDuty] ⚠️ 尚未配置主人帳號 (masterUsername),將僅進行瀏覽紀錄而不留言 @主人。');
315
+ log('[ScrollDuty] ⚠️ 尚未配置主人帳號 (masterUsername),將僅進行瀏覽審核而不留言 @主人。');
77
316
  }
78
317
  const batchSize = Math.max(5, config.batchSize || 15);
318
+ const maxPerRun = config.maxRecommendsPerRun || 1;
79
319
  const candidatePosts = [];
80
- // 1. 抓取時間軸首頁動態 (Feed)
320
+ // 1. 抓取首頁時間軸動態牆 (Feed)
81
321
  try {
82
322
  log(`[ScrollDuty] 正在滾動時間軸動態牆 (抓取上限: ${batchSize})...`);
83
323
  const feedRes = await mcp.igGetTimelineFeed(batchSize);
@@ -88,8 +328,19 @@ export async function executeScrollRound(ctx, config, mcp, ledger, log = console
88
328
  }
89
329
  catch (e) {
90
330
  log(`[ScrollDuty] 獲取時間軸動態異常: ${e.message}`);
331
+ if (/feedback|action block|checkpoint|rate limit/i.test(e.message)) {
332
+ ledger.triggerCooldown(config.cooldownOnBlockMinutes || 30, e.message);
333
+ return {
334
+ ok: false,
335
+ totalScanned: 0,
336
+ worthyCount: 0,
337
+ recommendedCount: 0,
338
+ recommendations: [],
339
+ message: `時間軸獲取異常並觸發風控冷卻: ${e.message}`,
340
+ };
341
+ }
91
342
  }
92
- // 2. 隨機選取一個主人感興趣的標籤進行主題探索 (Explore Tag)
343
+ // 2. 隨機選取一個主人感興趣的標籤進行探索抓取 (Explore Tag)
93
344
  const tags = config.interestTags || [];
94
345
  if (tags.length > 0) {
95
346
  const randomTag = tags[Math.floor(Math.random() * tags.length)].replace(/^#/, '').trim();
@@ -103,14 +354,21 @@ export async function executeScrollRound(ctx, config, mcp, ledger, log = console
103
354
  }
104
355
  catch (e) {
105
356
  log(`[ScrollDuty] 探索標籤異常: ${e.message}`);
357
+ if (/feedback|action block|checkpoint|rate limit/i.test(e.message)) {
358
+ ledger.triggerCooldown(config.cooldownOnBlockMinutes || 30, e.message);
359
+ }
106
360
  }
107
361
  }
108
362
  let totalScanned = 0;
109
363
  let worthyCount = 0;
110
364
  let recommendedCount = 0;
111
365
  const recommendations = [];
112
- // 3. 逐條讀內文進行評估與推薦
366
+ // 3. 逐條讀內文進行深度內容審查與推薦
113
367
  for (const post of candidatePosts) {
368
+ if (recommendedCount >= maxPerRun) {
369
+ log(`[ScrollDuty] 達到本輪推坑上限 (${maxPerRun} 則),結束本輪推薦。`);
370
+ break;
371
+ }
114
372
  const postPk = String(post.pk || post.id || '');
115
373
  if (!postPk)
116
374
  continue;
@@ -118,26 +376,53 @@ export async function executeScrollRound(ctx, config, mcp, ledger, log = console
118
376
  if (ledger.hasSeen(postPk)) {
119
377
  continue;
120
378
  }
379
+ // 模擬人類瀏覽閱讀貼文微延遲
380
+ const minDelay = config.minPostReadDelaySeconds || 3;
381
+ const maxDelay = Math.max(minDelay, config.maxPostReadDelaySeconds || 7);
382
+ const readWaitMs = Math.floor((minDelay + Math.random() * (maxDelay - minDelay)) * 1000);
383
+ await new Promise((r) => setTimeout(r, readWaitMs));
121
384
  totalScanned++;
122
- const evalRes = evaluatePost(post, config);
385
+ const evalRes = await inspectAndEvaluatePost(ctx, post, config);
123
386
  if (evalRes.isWorthy) {
124
387
  worthyCount++;
125
- log(`[ScrollDuty] ⭐ 發現值得內容!作者: @${post.user?.username || 'unknown'}, 評分: ${evalRes.score}/100. 短碼: ${post.code}`);
388
+ log(`[ScrollDuty] ⭐ 發現極高價值內容!審查機制: [${evalRes.reviewMethod.toUpperCase()}], 評分: ${evalRes.score}/100, 作者: @${post.user?.username || 'unknown'}`);
389
+ log(`[ScrollDuty] 推薦原因: ${evalRes.reason}`);
126
390
  // 檢查是否還能推坑 (每日上限控制)
127
391
  const cap = config.dailyRecommendCap || 5;
128
392
  if (ledger.canRecommend(cap) && master) {
129
- log(`[ScrollDuty] 正在貼文下留言 @${master} 進行推薦...`);
393
+ // @ 前進行最後確認檢查 (Pre-mention Verification)
394
+ if (!evalRes.commentText || !evalRes.commentText.includes(master)) {
395
+ log(`[ScrollDuty] ⚠️ 推坑語句缺少 @${master},自動補上主人名稱`);
396
+ evalRes.commentText = `@${master} ${evalRes.commentText || '這篇分析非常到位,特地推薦你看看!'}`;
397
+ }
398
+ log(`[ScrollDuty] 正在貼文下留言推坑: "${evalRes.commentText}"...`);
130
399
  try {
131
400
  const commentRes = await mcp.igPostComment({
132
401
  media_pk: postPk,
133
402
  text: evalRes.commentText,
403
+ jitter_min: 6.0,
404
+ jitter_max: 15.0,
134
405
  });
406
+ if (commentRes?.in_cooldown ||
407
+ (commentRes?.error &&
408
+ /action block|feedback|checkpoint|please wait|rate limit/i.test(commentRes.error))) {
409
+ ledger.triggerCooldown(config.cooldownOnBlockMinutes || 30, commentRes.error || 'Instagram 頻率風控阻擋');
410
+ log(`[ScrollDuty] 🚨 偵測到風控或熔斷保護,停止後續推坑!`);
411
+ ledger.markSeen(postPk, true);
412
+ break;
413
+ }
135
414
  if (commentRes?.ok) {
136
415
  log(`[ScrollDuty] ✅ 成功留言 @${master}!`);
137
416
  recommendedCount++;
138
417
  // 若開啟,順便點讚
139
418
  if (config.likeOnRecommend) {
140
- await mcp.igLikeMedia(postPk).catch(() => { });
419
+ const likeRes = await mcp.igLikeMedia(postPk).catch(() => ({}));
420
+ if (likeRes?.in_cooldown ||
421
+ (likeRes?.error &&
422
+ /action block|feedback|checkpoint|please wait|rate limit/i.test(likeRes.error))) {
423
+ ledger.triggerCooldown(config.cooldownOnBlockMinutes || 30, likeRes.error || 'Instagram 點讚風控阻擋');
424
+ break;
425
+ }
141
426
  }
142
427
  const recItem = {
143
428
  postPk,
@@ -160,6 +445,10 @@ export async function executeScrollRound(ctx, config, mcp, ledger, log = console
160
445
  catch (e) {
161
446
  log(`[ScrollDuty] 留言異常: ${e.message}`);
162
447
  ledger.markSeen(postPk, true);
448
+ if (/feedback|action block|checkpoint|rate limit/i.test(e.message)) {
449
+ ledger.triggerCooldown(config.cooldownOnBlockMinutes || 30, e.message);
450
+ break;
451
+ }
163
452
  }
164
453
  }
165
454
  else {
@@ -168,10 +457,11 @@ export async function executeScrollRound(ctx, config, mcp, ledger, log = console
168
457
  }
169
458
  }
170
459
  else {
460
+ log(`[ScrollDuty] ⏭️ 未通過內容審核: ${evalRes.rejectionReason || '評分未達標準'}`);
171
461
  ledger.markSeen(postPk, false);
172
462
  }
173
463
  }
174
- const msg = `本輪滾動瀏覽完畢!共掃描 ${totalScanned} 則新內容,發現 ${worthyCount} 則值得貼文,成功替主人留評推薦 ${recommendedCount} 則。`;
464
+ const msg = `本輪滾動完畢!共掃描 ${totalScanned} 則內容,經正文與語義嚴格審查,精選 ${worthyCount} 則符合主人偏好,成功留評推薦 ${recommendedCount} 則。`;
175
465
  log(`[ScrollDuty] 🎉 ${msg}`);
176
466
  return {
177
467
  ok: true,
@@ -1 +1 @@
1
- {"version":3,"file":"scrollDuty.js","sourceRoot":"","sources":["../../src/core/scrollDuty.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scrollDuty.js","sourceRoot":"","sources":["../../src/core/scrollDuty.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,8 @@ export interface ScrollLedgerState {
29
29
  scrolledCount: number;
30
30
  recommendedCount: number;
31
31
  };
32
+ cooldownUntil?: number;
33
+ cooldownReason?: string;
32
34
  }
33
35
  export declare class ScrollLedgerManager {
34
36
  private filePath;
@@ -51,5 +53,10 @@ export declare class ScrollLedgerManager {
51
53
  };
52
54
  private appendReport;
53
55
  getTodayReport(): string;
56
+ isInCooldown(): boolean;
57
+ getCooldownRemainingSeconds(): number;
58
+ getCooldownReason(): string;
59
+ triggerCooldown(minutes?: number, reason?: string): void;
60
+ resetCooldown(): void;
54
61
  }
55
62
  //# sourceMappingURL=ledger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../src/lib/ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IAClE,gBAAgB,EAAE,eAAe,EAAE,CAAA;IACnC,UAAU,EAAE;QACV,aAAa,EAAE,MAAM,CAAA;QACrB,gBAAgB,EAAE,MAAM,CAAA;KACzB,CAAA;CACF;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,KAAK,CAAmB;gBAEpB,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAehD,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,IAAI;IAyBL,IAAI,IAAI,IAAI;IAQnB,OAAO,CAAC,aAAa;IAUd,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIhC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,OAAe,GAAG,IAAI;IAUvD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAMlC,oBAAoB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IASjD,aAAa;;uBArGH,MAAM;0BACH,MAAM;;;IA6G1B,OAAO,CAAC,YAAY;IAqBb,cAAc,IAAI,MAAM;CAShC"}
1
+ {"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../src/lib/ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IAClE,gBAAgB,EAAE,eAAe,EAAE,CAAA;IACnC,UAAU,EAAE;QACV,aAAa,EAAE,MAAM,CAAA;QACrB,gBAAgB,EAAE,MAAM,CAAA;KACzB,CAAA;IACD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,KAAK,CAAmB;gBAEpB,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAehD,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,IAAI;IAyBL,IAAI,IAAI,IAAI;IAQnB,OAAO,CAAC,aAAa;IAUd,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIhC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,OAAe,GAAG,IAAI;IAUvD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAMlC,oBAAoB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IASjD,aAAa;;uBAvGH,MAAM;0BACH,MAAM;;;IA+G1B,OAAO,CAAC,YAAY;IAqBb,cAAc,IAAI,MAAM;IAWxB,YAAY,IAAI,OAAO;IAIvB,2BAA2B,IAAI,MAAM;IAKrC,iBAAiB,IAAI,MAAM;IAI3B,eAAe,CAAC,OAAO,SAAK,EAAE,MAAM,SAAK,GAAG,IAAI;IAShD,aAAa,IAAI,IAAI;CAK7B"}