@luoyi-dsh/instagram-scroll 1.0.3 → 1.0.6

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.zh-Hant.md CHANGED
@@ -1,204 +1,73 @@
1
- # DSH Instagram 滾動瀏覽與探索插件 (`@luoyi-dsh/instagram-scroll`)
2
-
3
- <div align="center">
4
-
5
- ![DSH Instagram Scroll Banner](assets/banner.png)
6
-
7
- **[English](README.md) | [繁體中文](README.zh-Hant.md)**
8
-
9
- </div>
10
-
11
- > **DeepSeek Harness (DSH)** 專屬的 Instagram 動態探索、智慧推坑與日報生成外掛。
12
- > 具備核心能力:**定時或手動替主人刷一輪 Instagram 首頁動態與主題標籤、逐條閱讀內文評估主人興趣、自動點讚與留言推坑,並自動彙整生成每日 Markdown 探索日報**。
13
-
14
- > [!CAUTION]
15
- > ### ⚠️ 重要風險警告與免責聲明 (CRITICAL DISCLAIMER)
16
- > 1. **違反 Instagram 社群守則與使用條款**:
17
- > 本插件及其背後的自動化刷動態、自動按讚與自動 @主人推坑留言機制,**明確違反了 Instagram / Meta 的《服務條款 (Terms of Use)》及《社群守則 (Community Guidelines)》**。
18
- > 2. **切勿使用本人主要帳號運行 (DO NOT USE YOUR PRIMARY ACCOUNT)**:
19
- > **強烈嚴禁使用您個人的日常主要帳號、官方認證帳號或重要商業帳號!** Instagram 擁有極為敏銳的反機器人檢測演算法,持續的動態滾動、頻繁讀取及自動留評極易觸發官方風控,導致:**功能限制 (Action Blocked)、強制安全挑戰 (Challenge Checkpoint)、帳號臨時鎖定、甚至永久停權封號 (Permanent Ban)**!
20
- > 3. **測試與備用小號原則**:
21
- > 若需測試本外掛,請務必使用**無重要資料的測試用小號 (Burner / Alt Account)**,並強烈建議配置**優質純淨的住宅代理伺服器 (Residential Proxy)**,切勿在短時間內切換不同國家/地區的 IP。
22
- > 4. **內建防風控安全機制**:
23
- > - **單輪推坑上限**:每輪滾動瀏覽最多僅推薦 1 則內容 (`maxRecommendsPerRun: 1`),杜絕短時間密集推坑。
24
- > - **擬真閱讀微延遲**:每掃描一則貼文前隨機等待 3~7 秒 (`minPostReadDelaySeconds: 3, maxPostReadDelaySeconds: 7`),模擬真人滑動與停留閱讀。
25
- > - **動作抖動延遲**:留言與點讚動作注入 6~15 秒隨機抖動等待 (Jitter)。
26
- > - **風控熔斷保護**:遇到官方 Action Block / 頻率限制異常時,自動觸發 30 分鐘冷卻保護模式,暫停一切自動化推薦。
27
- > 5. **免責宣告**:
28
- > 本專案純屬程式技術研究與開源通訊協定評估用途。使用者因安裝、運行或配置本外掛所導致之任何帳號停權、封禁、資料損失或相關責任,**開發者一概不負任何法律與連帶賠償責任**,使用時請務必審慎評估並自負風險!
29
-
30
- ---
31
-
32
- ## 🌟 核心特性
33
-
34
- 1. **自動動態探索巡查 (Scroll Duty)**:
35
- - 定期輪詢首頁動態牆 (Timeline Feed) 與指定主題標籤 (Hashtags)。
36
- - 逐則貼文抓取標題、作者、標籤與完整內文。
37
- 2. **正文深度審查與用戶偏好推薦 (Content Inspection Pipeline)**:
38
- - **絕不隨便推薦**:徹底拋棄僅看 tag 與點讚數的粗糙過濾,門檻提高至 80 分。
39
- - **正文與標籤徹底分離**:自動分離真實正文與文末 `#標籤`,有效字數過短或僅有單一 emoji 者直接判定為無實質內容過濾。
40
- - **標籤農場攔截**:偵測標籤堆砌蹭熱度(Hashtag Spamming),杜絕空洞蹭流量貼文。
41
- - **正文主題實質核驗**:正文必須切實探討主人喜愛的領域與關鍵詞,禁止僅在文末掛標籤蹭熱度。
42
- - **負向廣告與垃圾過濾**:自動排除互粉、代購、抽獎、博彩、微商、心靈雞湯與純自拍娛樂等無效內容。
43
- - **LLM / 語義深度質檢與客製化推坑詞**:結合主人喜好描述,由 LLM 或深度啟發式引擎審查真實主旨,並針對貼文亮點生成專屬真誠推薦詞,在留言區 `@主人`。
44
- 3. **每日探索日報 (Daily Markdown Report)**:
45
- - 自動將今日瀏覽之所有精選貼文、摘要與推薦紀錄整理為 Markdown 日報。
46
- - 儲存於 `data/reports/YYYY-MM-DD.md`,可隨時在 Web 面板查看與回溯。
47
- 4. **狀態帳本與嚴格去重控制**:
48
- - `data/scroll_ledger.json` 記錄已看貼文 PK 與今日推坑次數,避免重複推坑或重複閱讀,並防止觸發風控。
49
- 5. **DSH Web 瀏覽器端介面 (`client.js`)**:
50
- - 提供直觀動態牆瀑布流預覽、即時手動觸發刷動態按鈕、日報閱讀器與自訂設定面板。
51
-
52
- ---
53
-
54
- ## 📦 安裝方式
55
-
56
- 使用 DSH CLI 安裝插件:
57
-
58
- ```bash
59
- dsh plugin --profile web add @luoyi-dsh/instagram-scroll
60
- ```
61
-
62
- 或透過 npm 安裝:
63
-
64
- ```bash
65
- npm install @luoyi-dsh/instagram-scroll
66
- ```
67
-
68
- ---
69
-
70
- ## 🛠️ 提供之 DSH Tools
71
-
72
- | 工具名稱 | 說明 | 參數 |
73
- | :--- | :--- | :--- |
74
- | **`ig_run_scroll_duty_now`** | 立即手動替主人刷一輪 Instagram 動態與探索,讀取貼文進行評估、點讚與留言推坑 | 無 |
75
- | **`ig_scroll_feed`** | 滾動讀取 Instagram 時間軸最新動態貼文(含作者、讚數、內文摘要) | `limit` (number,預設 15,最大 50) |
76
- | **`ig_explore_topics`** | 依照指定主題或探索標籤滾動閱讀熱門貼文 | `tag` (string,必填), `limit` (number,預設 15) |
77
- | **`ig_like_feed_post`** | 在滾動瀏覽過程中對感興趣的 Instagram 貼文按讚 | `media_pk` (string,必填) |
78
-
79
- ---
80
-
81
- ## 💻 使用範例
82
-
83
- ### 1. DSH AI 自然語言直接調用
84
-
85
- 在 DSH 對話中,主模型可直接以自然語言執行滾動探索或瀏覽:
86
-
87
- ```text
88
- 💬 範例 1:執行一輪完整的動態探索與推坑
89
- 「請立刻替我刷一輪 Instagram 動態牆,看看有沒有適合我的技術新貼文並推薦給我」
90
- -> AI 將調用:ig_run_scroll_duty_now()
91
-
92
- 💬 範例 2:滾動瀏覽首頁動態貼文
93
- 「幫我刷最新 10 則 Instagram 動態」
94
- -> AI 將調用:ig_scroll_feed(limit=10)
95
-
96
- 💬 範例 3:探索特定主題標籤
97
- 「探索 Instagram 上 #deepseek 標籤的熱門貼文」
98
- -> AI 將調用:ig_explore_topics(tag="deepseek", limit=15)
99
- ```
100
-
101
- ---
102
-
103
- ### 2. 透過 HTTP REST API 調用 (DSH Web 路由)
104
-
105
- > 💡 **提示**:DSH Web 預設埠號為 **3080**。
106
-
107
- #### 1. 手動觸發滾動一輪 (`POST /api/instagram/scroll/run`)
108
- ```bash
109
- curl -X POST http://127.0.0.1:3080/api/instagram/scroll/run
110
- ```
111
-
112
- #### 2. 獲取當前滾動狀態與今日統計 (`GET /api/instagram/scroll/status`)
113
- ```bash
114
- curl http://127.0.0.1:3080/api/instagram/scroll/status
115
- ```
116
-
117
- #### 3. 讀取今日探索日報內容 (`GET /api/instagram/scroll/report`)
118
- ```bash
119
- curl http://127.0.0.1:3080/api/instagram/scroll/report
120
- ```
121
-
122
- #### 4. 讀取與更新設定 (`GET / POST /api/instagram/scroll/config`)
123
- ```bash
124
- # 取得設定
125
- curl http://127.0.0.1:3080/api/instagram/scroll/config
126
-
127
- # 更新設定
128
- curl -X POST http://127.0.0.1:3080/api/instagram/scroll/config \
129
- -H "Content-Type: application/json" \
130
- -d '{"masterUsername":"your_username","minScore":80}'
131
- ```
132
-
133
- ---
134
-
135
- ## ⚙️ 設定參數說明 (Settings)
136
-
137
- > 💡 **提示**:本外掛**不用輸入帳號密碼**,會直接沿用依賴的 `@luoyi-dsh/instagram-mcp` 獲取之 Session 與登入狀態。
138
-
139
- | 欄位名稱 | 型別 | 預設值 | 說明 |
140
- | :--- | :--- | :--- | :--- |
141
- | **`masterUsername`** | string | `""` | 主人的 Instagram 使用者名稱(達標時在留言區 @主人 推薦) |
142
- | **`userInterests`** | string | *預設偏好詳述* | 主人喜歡的內容風格與領域詳細描述(供 AI 深度比對正文語義) |
143
- | **`positiveKeywords`** | array | `["ai", "deepseek", ...]` | 正文必須提及或重點加分的領域關鍵字清單 |
144
- | **`negativeKeywords`** | array | `["互粉", "代購", "抽獎", ...]` | 負向排除關鍵字(命中時直接判定不推薦,杜絕廣告與廢文) |
145
- | **`minCaptionLength`** | number | `30` | 正文有效文字最小字數門檻(扣除 #標籤 後過短者直接過濾) |
146
- | **`requireBodyMatch`** | boolean| `true` | 正文實質內容必須命中主人偏好主題(拒絕僅在文末蹭 tag) |
147
- | **`strictContentCheck`**| boolean| `true` | 啟用 @ 前深度正文審查機制(結合 LLM / 正文語義深度質檢) |
148
- | **`interestTags`** | array | `["ai", "deepseek", "coding", "tech", "gadgets"]` | 探索抓取的主題標籤(僅作為探索起點,非推薦唯一標準) |
149
- | **`personaPrompt`** | string | *預設人設提示詞* | 評估貼文趣味度與撰寫 @主人 推薦語的人設 Prompt |
150
- | **`minScore`** | number | `80` | 推坑門檻分數(0-100,達標才在貼文下留言推薦,提高門檻避免隨便推薦) |
151
- | **`dailyRecommendCap`** | number | `5` | 每日向主人推坑留言的上限則數(防止過度打擾與風控) |
152
- | **`maxRecommendsPerRun`**| number | `1` | 單次滾動瀏覽最多推坑留言則數(避免短時間連發觸發官方風控) |
153
- | **`minPostReadDelaySeconds`** | number | `3` | 每讀取一則貼文前人造擬真閱讀微延遲最小秒數 |
154
- | **`maxPostReadDelaySeconds`** | number | `7` | 每讀取一則貼文前人造擬真閱讀微延遲最大秒數 |
155
- | **`cooldownOnBlockMinutes`** | number | `30` | 遇到 Action Block / 頻率限制時自動熔斷暫停分鐘數 |
156
- | **`scrollIntervalMinutes`**| number | `60` | 自動巡查刷動態牆的時間週期(分鐘) |
157
- | **`autoScrollEnabled`** | boolean| `true` | 是否啟用背景定時自動刷動態牆任務 |
158
- | **`likeOnRecommend`** | boolean| `true` | 決定推薦給主人時是否順便對該貼文點讚 |
159
- | **`batchSize`** | number | `15` | 每輪滾動瀏覽抓取的貼文筆數 (10-30) |
160
-
161
- ---
162
-
163
- ## 📁 目錄結構
164
-
165
- ```text
166
- dsh-instagram-scroll/
167
- ├── cordis.patch.yml # DSH bundle patch 宣告
168
- ├── package.json # 模組定義與依賴
169
- ├── tsconfig.json # TypeScript 編譯設定
170
- ├── CHANGELOG.md # 版本更新紀錄
171
- ├── README.md # 英文說明文件
172
- ├── README.zh-Hant.md # 繁體中文說明文件
173
- ├── assets/
174
- │ ├── banner.png # 宣傳橫幅
175
- │ └── zh-Hant.md # 本地化說明文件
176
- ├── client.js # DSH Web 前端面板 (動態瀏覽、手動觸發、日報查看)
177
- ├── data/
178
- │ ├── config.json # 本地設定檔
179
- │ ├── scroll_ledger.json # 瀏覽去重與統計帳本
180
- │ └── reports/ # 每日日報儲存目錄 (YYYY-MM-DD.md)
181
- └── src/
182
- ├── index.ts # Cordis 外掛入口、排程定時器與 Web API
183
- ├── config.ts # Schemastery 設定模型
184
- ├── types.d.ts # 型別宣告
185
- ├── core/
186
- │ └── scrollDuty.ts # 滾動瀏覽、大模型評估、點讚與推坑核心邏輯
187
- ├── lib/
188
- │ ├── hostdeps.ts # DSH 宿主相容層
189
- │ └── ledger.ts # 日報生成與歷史去重帳本管理器
190
- └── tools/
191
- └── scrollTools.ts # 向 DSH Tools 註冊之專用滾動瀏覽工具
192
- ```
193
-
194
- ---
195
-
196
- ## 📜 版本發布紀錄 (Releases)
197
-
198
- 詳細版本演進與更新紀錄,請參閱 [CHANGELOG.md](CHANGELOG.md)。
199
-
200
- ---
201
-
202
- ## 📄 授權條款
203
-
204
- 本專案採用 [MIT License](LICENSE) 開源授權。
1
+ # DSH Instagram 滾動瀏覽與探索插件 (`@luoyi-dsh/instagram-scroll`)
2
+
3
+ <div align="center">
4
+
5
+ ![DSH Instagram Scroll Banner](assets/banner.png)
6
+
7
+ **[English](README.md) | [繁體中文](README.zh-Hant.md) | [操作方法與 Agent 指南](AGENTS.md)**
8
+
9
+ </div>
10
+
11
+ > **DeepSeek Harness (DSH)** 專屬的 Instagram 動態探索、智慧推坑與日報生成外掛。
12
+ > 自動沿用 `@luoyi-dsh/instagram-mcp` 設定之機器人帳號與主人帳號,定時或手動替主人刷 Instagram 首頁動態與模糊搜尋主題、嚴格過濾 AI 生成的影片/動畫/文章 (AIGC)、逐條深度審查正文評估主人興趣、自動點讚與留言 `@主人` 推坑,並自動彙整生成每日 Markdown 探索日報。
13
+
14
+ > [!CAUTION]
15
+ > ### ⚠️ 重要風險警告與免責聲明 (CRITICAL DISCLAIMER)
16
+ > 1. **違反 Instagram 社群守則與使用條款**:本插件採用非官方 API 進行自動化操作,明確違反 Instagram / Meta 的服務條款與社群守則。
17
+ > 2. **切勿使用本人主要帳號運行**:嚴禁使用個人主要帳號或重要商業帳號!請務必使用測試小號並搭配純淨住宅代理。
18
+ > 3. **免責宣告**:本專案純屬技術研究用途,任何帳號停權或損失由使用者自負風險。
19
+
20
+ ---
21
+
22
+ ## 🌟 核心特色
23
+
24
+ 1. **自動沿用 MCP 帳號設定**:
25
+ - 機器人登入帳號與推坑目標主人帳號 (`masterUsername`) 直接從 `@luoyi-dsh/instagram-mcp` 自動讀取與同步,無須重複設定。
26
+ 2. **自動動態牆與模糊關鍵字探索 (Scroll Duty)**:
27
+ - 結合首頁動態牆與多階段模糊搜尋 (`igFuzzySearchPosts`),徹底解決單純標籤搜尋返回 0 則貼文的問題。
28
+ 3. **嚴格排除 AI 生成內容 (AIGC) 與正文深度審查**:
29
+ - 自動攔截 AI 生成影片、AI 動畫、AI 繪圖與 AI 農場文章,並分離正文與 `#標籤`,結合外部訂閱插件 (`dsh-plugin-subscriptions`) AI 額度進行深度語義審查,絕不隨便推坑。
30
+ 4. **每日探索日報 (`data/reports/YYYY-MM-DD.md`)**:
31
+ - 自動將今日瀏覽之精選貼文、摘要與推薦紀錄整理為 Markdown 日報,可隨時於 Web 面板閱讀。
32
+
33
+ ---
34
+
35
+ ## 📦 安裝方式
36
+
37
+ ```bash
38
+ # 使用 DSH CLI 安裝插件
39
+ dsh plugin --profile web add @luoyi-dsh/instagram-scroll
40
+
41
+ # 或透過 npm 安裝
42
+ npm install @luoyi-dsh/instagram-scroll
43
+ ```
44
+
45
+ ---
46
+
47
+ ## 📖 插件操作方法與工具調用說明
48
+
49
+ 完整的 DSH 工具清單、自然語言調用範例、HTTP REST API 端點與設定參數表,請參閱 **[AGENTS.md](AGENTS.md)**。
50
+
51
+ ---
52
+
53
+ ## 📁 目錄結構
54
+
55
+ ```text
56
+ dsh-instagram-scroll/
57
+ ├── cordis.patch.yml # DSH bundle patch 宣告
58
+ ├── package.json # 模組定義與依賴
59
+ ├── tsconfig.json # TypeScript 編譯設定
60
+ ├── AGENTS.md # 插件操作方法與 Agent 調用指南
61
+ ├── CHANGELOG.md # 版本更新紀錄
62
+ ├── README.md # 英文介紹文件
63
+ ├── README.zh-Hant.md # 繁體中文介紹文件 (本檔案)
64
+ ├── client.js # DSH Web 前端面板
65
+ └── src/ # 滾動探索核心、日報帳本管理與工具註冊
66
+ ```
67
+
68
+ ---
69
+
70
+ ## 📜 版本紀錄與授權條款
71
+
72
+ - 詳細版本演進與更新紀錄,請參閱 [CHANGELOG.md](CHANGELOG.md)。
73
+ - 本專案採用 [MIT License](LICENSE) 開源授權。
package/client.js CHANGED
@@ -539,9 +539,13 @@ window.__ModuleLoader__.load({
539
539
 
540
540
  const normalizeScrollConfig = (raw) => {
541
541
  const c = (raw && typeof raw === 'object' && !Array.isArray(raw)) ? raw : {}
542
+ const baseTags = cleanArr(c.interestTags, ['art', 'deepseek', 'coding', 'kemono', 'tech'])
542
543
  return {
543
544
  masterUsername: cleanStr(c.masterUsername, ''),
544
- interestTags: cleanArr(c.interestTags, ['ai', 'deepseek', 'coding', 'tech', 'gadgets']),
545
+ fuzzySearchEnabled: cleanBool(c.fuzzySearchEnabled, true),
546
+ fuzzyKeywords: cleanArr(c.fuzzyKeywords, baseTags),
547
+ tagSearchEnabled: cleanBool(c.tagSearchEnabled, false),
548
+ interestTags: baseTags,
545
549
  userInterests: cleanStr(
546
550
  c.userInterests,
547
551
  '專注於前沿 AI 技術 (LLM, Agent, 開源模型)、全端與前端架構、優質開源專案、高效率開發工具、優質 UI/UX 設計或深度乾貨技術解析。偏好乾貨分享、實踐案例與原創見解,不喜歡空洞無物、純蹭熱度、打廣告或純娛樂搞笑的內容。'
@@ -550,7 +554,7 @@ window.__ModuleLoader__.load({
550
554
  'ai', 'deepseek', 'agent', 'coding', '技術', '前端', '後端', '架構', '開源', '教學', '程式', '開發', '模型', 'github', 'prompt', '演算法', '工具', '實戰', '乾貨',
551
555
  ]),
552
556
  negativeKeywords: cleanArr(c.negativeKeywords, [
553
- '互粉', '代購', '博彩', '運彩', '兼職', '抽獎', '免費領', '私訊', '點擊連結', '主頁連結', '減肥', '微商', '外匯', '虛擬幣', '心靈雞湯', '穿搭', '搞笑', '自拍', '八卦', '暴富', '躺平', '加盟',
557
+ '互粉', '代購', '博彩', '運彩', '兼職', '抽獎', '免費領', '私訊', '點擊連結', '主頁連結', '減肥', '微商', '外匯', '虛擬幣', '心靈雞湯', '穿搭', '搞笑', '自拍', '八卦', '暴富', '躺平', '加盟', 'AI生成', 'AI影片', 'AI動畫', 'AI繪圖', 'AI文章', 'AIGC', 'Midjourney', 'Stable Diffusion', 'Sora', 'Runway', 'Kling', '可靈', '即夢', 'AI配音', 'AI美女',
554
558
  ]),
555
559
  minCaptionLength: cleanNum(c.minCaptionLength, 30),
556
560
  requireBodyMatch: cleanBool(c.requireBodyMatch, true),
@@ -584,6 +588,7 @@ window.__ModuleLoader__.load({
584
588
  const [msg, setMsg] = useState(null)
585
589
 
586
590
  // 獨立字串狀態:解決 input 鍵入逗號與空格被 React 重新格式化吃掉的問題
591
+ const [fuzzyWordsText, setFuzzyWordsText] = useState('')
587
592
  const [tagsInputText, setTagsInputText] = useState('')
588
593
  const [positiveWordsText, setPositiveWordsText] = useState('')
589
594
  const [negativeWordsText, setNegativeWordsText] = useState('')
@@ -610,6 +615,7 @@ window.__ModuleLoader__.load({
610
615
  if (cfgRes?.ok) {
611
616
  const loaded = normalizeScrollConfig(cfgRes.config)
612
617
  setCfg(loaded)
618
+ setFuzzyWordsText(loaded.fuzzyKeywords.join(', '))
613
619
  setTagsInputText(loaded.interestTags.join(', '))
614
620
  setPositiveWordsText(loaded.positiveKeywords.join(', '))
615
621
  setNegativeWordsText(loaded.negativeKeywords.join(', '))
@@ -636,6 +642,7 @@ window.__ModuleLoader__.load({
636
642
  try {
637
643
  const cleanPayload = {
638
644
  ...normalizeScrollConfig(cfg),
645
+ fuzzyKeywords: parseListFromText(fuzzyWordsText, true),
639
646
  interestTags: parseListFromText(tagsInputText, true),
640
647
  positiveKeywords: parseListFromText(positiveWordsText, false),
641
648
  negativeKeywords: parseListFromText(negativeWordsText, false),
@@ -644,6 +651,7 @@ window.__ModuleLoader__.load({
644
651
  if (res?.ok) {
645
652
  const saved = normalizeScrollConfig(res.config)
646
653
  setCfg(saved)
654
+ setFuzzyWordsText(saved.fuzzyKeywords.join(', '))
647
655
  setTagsInputText(saved.interestTags.join(', '))
648
656
  setPositiveWordsText(saved.positiveKeywords.join(', '))
649
657
  setNegativeWordsText(saved.negativeKeywords.join(', '))
@@ -689,11 +697,23 @@ window.__ModuleLoader__.load({
689
697
  const rawAccount =
690
698
  status?.mcpAccount ||
691
699
  status?.loginStatus?.username ||
700
+ mcpStatus?.botUsername ||
692
701
  mcpStatus?.loginStatus?.username ||
693
702
  (mcpStatus?.loginStatus?.message?.match(/@([^\s)]+)/)?.[1]) ||
694
703
  (isMcpConnected ? '已連線' : '')
695
704
 
696
- const displayAccount = rawAccount ? rawAccount.replace(/^@/, '') : ''
705
+ let cachedMcpAccounts = {}
706
+ try {
707
+ cachedMcpAccounts = JSON.parse(localStorage.getItem('dsh_ig_mcp_accounts') || '{}') || {}
708
+ } catch {}
709
+ const displayAccount = (cachedMcpAccounts.username || rawAccount || '').replace(/^@/, '')
710
+ const displayMaster = (
711
+ cachedMcpAccounts.masterUsername ||
712
+ mcpStatus?.masterUsername ||
713
+ status?.masterUsername ||
714
+ cfg.masterUsername ||
715
+ ''
716
+ ).replace(/^@/, '')
697
717
 
698
718
  return h(
699
719
  'div',
@@ -714,7 +734,7 @@ window.__ModuleLoader__.load({
714
734
  h(
715
735
  'div',
716
736
  { className: 'ig-scr-brand-sub', style: { display: 'flex', alignItems: 'center', gap: '8px' } },
717
- cfg.masterUsername ? `目標主人: @${cfg.masterUsername.replace(/^@/, '')}` : '尚未綁定主人帳號',
737
+ displayMaster ? `目標主人 (繼承自 MCP): @${displayMaster}` : '尚未於 MCP 設定主人帳號',
718
738
  h('span', { style: { color: 'rgba(255, 255, 255, 0.2)' } }, '|'),
719
739
  isMcpConnected
720
740
  ? h(
@@ -905,7 +925,7 @@ window.__ModuleLoader__.load({
905
925
  h('div', { className: 'ig-scr-section-desc' }, '設定主人的 Instagram 帳號名與感興趣的標籤領域,AI 將依此進行嚴格內容篩選。')
906
926
  ),
907
927
 
908
- // MCP Session 來源提示
928
+ // MCP Session 與主人帳號來源提示 (直接繼承自 MCP,無需重複輸入)
909
929
  h(
910
930
  'div',
911
931
  {
@@ -913,37 +933,32 @@ window.__ModuleLoader__.load({
913
933
  background: 'rgba(59, 130, 246, 0.06)',
914
934
  border: '1px solid rgba(59, 130, 246, 0.2)',
915
935
  borderRadius: '8px',
916
- padding: '10px 14px',
936
+ padding: '12px 14px',
917
937
  fontSize: '12px',
918
938
  color: '#93c5fd',
919
939
  display: 'flex',
920
- alignItems: 'center',
921
- gap: '8px',
940
+ flexDirection: 'column',
941
+ gap: '6px',
922
942
  },
923
943
  },
924
- h(Icon.Sparkles, { size: 14 }),
925
944
  h(
926
- 'span',
927
- null,
928
- isMcpConnected
929
- ? `已沿用 @luoyi-dsh/instagram-mcp 的登入會話 (@${displayAccount || '已授權'}),本外掛無需填寫帳密。`
930
- : '本外掛無需輸入帳密,直接沿用依賴的 dsh-instagram-mcp 獲取之 Session。目前 MCP 尚未登入,請先至 MCP 面板完成登入。'
945
+ 'div',
946
+ { style: { display: 'flex', alignItems: 'center', gap: '8px', fontWeight: 600 } },
947
+ h(Icon.Sparkles, { size: 14 }),
948
+ h(
949
+ 'span',
950
+ null,
951
+ '機器人與主人帳號已統一由 dsh-instagram-mcp 管理,本外掛無需重複輸入'
952
+ )
953
+ ),
954
+ h(
955
+ 'div',
956
+ { style: { display: 'flex', flexWrap: 'wrap', gap: '16px', color: '#e2e8f0', paddingLeft: '22px' } },
957
+ h('span', null, `🤖 機器人帳號: ${displayAccount ? `@${displayAccount}` : '尚未於 MCP 設定'}`),
958
+ h('span', null, `🎯 主人帳號 (推坑 @ 對象): ${displayMaster ? `@${displayMaster}` : '尚未於 MCP 設定'}`)
931
959
  )
932
960
  ),
933
961
 
934
- h(
935
- 'div',
936
- { className: 'ig-scr-field' },
937
- h('label', { className: 'ig-scr-label' }, '🎯 主人 Instagram 帳號 (Master Username)'),
938
- h('input', {
939
- className: 'ig-scr-input',
940
- value: cleanStr(cfg.masterUsername),
941
- placeholder: '例如 your_main_account (可不帶 @)',
942
- onChange: (e) => updateField('masterUsername', e.target.value.replace(/^@/, '').trim()),
943
- }),
944
- h('div', { className: 'ig-scr-hint' }, '發現值得推薦的貼文/影片時,會在留言區 @ 此帳號進行推薦')
945
- ),
946
-
947
962
  // 正文實質內容審查開關
948
963
  h(
949
964
  'div',
@@ -1035,13 +1050,70 @@ window.__ModuleLoader__.load({
1035
1050
  h('div', { className: 'ig-scr-hint' }, '命中任一排除詞直接判定不合格,杜絕廣告宣傳、抽獎促銷與無意義廢文')
1036
1051
  ),
1037
1052
 
1053
+ // 模糊搜尋探索開關 (預設開啟)
1054
+ h(
1055
+ 'div',
1056
+ { className: 'ig-scr-switch' },
1057
+ h(
1058
+ 'div',
1059
+ { className: 'ig-scr-switch-text' },
1060
+ h('div', { className: 'ig-scr-switch-name' }, '🔎 啟用模糊搜尋抓取貼文 (Fuzzy Search — 推薦)'),
1061
+ h('div', { className: 'ig-scr-hint' }, '結合 Instagram 綜合關鍵字 SERP、Reels 搜尋與相關創作者貼文,解決單純 Tags 搜尋一直抓到 0 則貼文的問題')
1062
+ ),
1063
+ h(
1064
+ 'button',
1065
+ {
1066
+ className: `ig-scr-toggle ${cfg.fuzzySearchEnabled !== false ? 'on' : ''}`,
1067
+ onClick: () => updateField('fuzzySearchEnabled', !(cfg.fuzzySearchEnabled !== false)),
1068
+ },
1069
+ h('span', { className: 'ig-scr-toggle-thumb' })
1070
+ )
1071
+ ),
1072
+
1073
+ h(
1074
+ 'div',
1075
+ { className: 'ig-scr-field', style: { opacity: cfg.fuzzySearchEnabled !== false ? 1 : 0.6 } },
1076
+ h('label', { className: 'ig-scr-label' }, '🔎 模糊搜尋關鍵字 (Fuzzy Search Keywords)'),
1077
+ h('input', {
1078
+ className: 'ig-scr-input',
1079
+ value: fuzzyWordsText,
1080
+ placeholder: 'ai, deepseek, coding, tech, gadgets',
1081
+ onChange: (e) => {
1082
+ const raw = e.target.value
1083
+ setFuzzyWordsText(raw)
1084
+ updateField('fuzzyKeywords', parseListFromText(raw, true))
1085
+ },
1086
+ }),
1087
+ h('div', { className: 'ig-scr-hint' }, '每輪滾動時隨機挑選關鍵字進行綜合模糊搜尋抓取貼文 (支援逗號分隔)')
1088
+ ),
1089
+
1090
+ // 主題標籤搜尋開關 (保留功能,用按鈕開關,預設關閉)
1091
+ h(
1092
+ 'div',
1093
+ { className: 'ig-scr-switch' },
1094
+ h(
1095
+ 'div',
1096
+ { className: 'ig-scr-switch-text' },
1097
+ h('div', { className: 'ig-scr-switch-name' }, '🏷️ 啟用主題標籤搜尋 (Tags Search — 保留備用)'),
1098
+ h('div', { className: 'ig-scr-hint' }, '預設關閉(因 IG 官方常限制公開 Hashtag API 返回 0 則貼文);保留此設定,可隨時點擊按鈕開關')
1099
+ ),
1100
+ h(
1101
+ 'button',
1102
+ {
1103
+ className: `ig-scr-toggle ${cfg.tagSearchEnabled ? 'on' : ''}`,
1104
+ onClick: () => updateField('tagSearchEnabled', !cfg.tagSearchEnabled),
1105
+ },
1106
+ h('span', { className: 'ig-scr-toggle-thumb' })
1107
+ )
1108
+ ),
1109
+
1038
1110
  h(
1039
1111
  'div',
1040
1112
  { className: 'ig-scr-grid-2' },
1041
1113
  h(
1042
1114
  'div',
1043
- { className: 'ig-scr-field' },
1044
- h('label', { className: 'ig-scr-label' }, '🏷️ 探索主題標籤 (Interest Tags)'),
1115
+ { className: 'ig-scr-field', style: { opacity: cfg.tagSearchEnabled ? 1 : 0.6 } },
1116
+ h('label', { className: 'ig-scr-label' }, '🏷️ 探索主題標籤 (Interest Tags — 開啟上方按鈕時生效)'),
1045
1117
  h('input', {
1046
1118
  className: 'ig-scr-input',
1047
1119
  value: tagsInputText,
@@ -1052,7 +1124,7 @@ window.__ModuleLoader__.load({
1052
1124
  updateField('interestTags', parseListFromText(raw, true))
1053
1125
  },
1054
1126
  }),
1055
- h('div', { className: 'ig-scr-hint' }, '探索抓取起點標籤 (非推薦唯一標準,支援空格與中英文逗號)')
1127
+ h('div', { className: 'ig-scr-hint' }, '保留之主題標籤清單 (支援空格與中英文逗號)')
1056
1128
  ),
1057
1129
  h(
1058
1130
  'div',
package/dist/config.d.ts CHANGED
@@ -3,6 +3,9 @@
3
3
  */
4
4
  export interface InstagramScrollConfig {
5
5
  masterUsername?: string;
6
+ fuzzySearchEnabled?: boolean;
7
+ fuzzyKeywords?: string[];
8
+ tagSearchEnabled?: boolean;
6
9
  interestTags?: string[];
7
10
  userInterests?: string;
8
11
  positiveKeywords?: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,qBAAqB;IACpC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IAEvB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAE5B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAChC;AAED,eAAO,MAAM,mBAAmB,EAAE,qBAiEjC,CAAA;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAW7D;AAYD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,GAAG,qBAAqB,CAuBpE;AAED,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,GAAG,OA+E7C"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,qBAAqB;IACpC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IAEvB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAE5B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAChC;AAED,eAAO,MAAM,mBAAmB,EAAE,qBAoFjC,CAAA;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAW7D;AAYD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,GAAG,qBAAqB,CA2BpE;AAED,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,GAAG,OA2F7C"}
package/dist/config.js CHANGED
@@ -3,10 +3,14 @@
3
3
  */
4
4
  export const defaultScrollConfig = {
5
5
  masterUsername: '',
6
- interestTags: ['ai', 'deepseek', 'coding', 'tech', 'gadgets'],
7
- userInterests: '專注於前沿 AI 技術 (LLM, Agent, 開源模型)、全端與前端架構、優質開源專案、高效率開發工具、優質 UI/UX 設計或深度乾貨技術解析。偏好乾貨分享、實踐案例與原創見解,不喜歡空洞無物、純蹭熱度、打廣告或純娛樂搞笑的內容。',
6
+ fuzzySearchEnabled: true,
7
+ fuzzyKeywords: ['art', 'deepseek', 'coding', 'kemono', 'tech'],
8
+ tagSearchEnabled: false,
9
+ interestTags: ['art', 'deepseek', 'coding', 'kemono', 'tech'],
10
+ userInterests: '專注於真實人類原創手繪藝術 (插畫、Kemono、角色設計)、前沿軟體技術 (LLM 架構、Agent、開源專案)、全端與前端開發、高效率工具或深度技術解析。偏好真實人類原創作品與實踐乾貨,嚴格排除任何 AI 生成的影片、AI 動畫、AI 繪圖/算圖或 AI 生成的農場文章!',
8
11
  positiveKeywords: [
9
- 'ai',
12
+ 'art',
13
+ 'kemono',
10
14
  'deepseek',
11
15
  'agent',
12
16
  'coding',
@@ -49,6 +53,21 @@ export const defaultScrollConfig = {
49
53
  '暴富',
50
54
  '躺平',
51
55
  '加盟',
56
+ 'AI生成',
57
+ 'AI影片',
58
+ 'AI動畫',
59
+ 'AI繪圖',
60
+ 'AI文章',
61
+ 'AIGC',
62
+ 'Midjourney',
63
+ 'Stable Diffusion',
64
+ 'Sora',
65
+ 'Runway',
66
+ 'Kling',
67
+ '可靈',
68
+ '即夢',
69
+ 'AI配音',
70
+ 'AI美女',
52
71
  ],
53
72
  minCaptionLength: 30,
54
73
  requireBodyMatch: true,
@@ -90,9 +109,13 @@ function parseListValue(val, fallback = []) {
90
109
  }
91
110
  export function sanitizeScrollConfig(raw) {
92
111
  const c = raw || {};
112
+ const parsedTags = parseListValue(c.interestTags, defaultScrollConfig.interestTags || []);
93
113
  return {
94
114
  masterUsername: unwrapScrollValue(c.masterUsername, defaultScrollConfig.masterUsername || ''),
95
- interestTags: parseListValue(c.interestTags, defaultScrollConfig.interestTags || []),
115
+ fuzzySearchEnabled: unwrapScrollValue(c.fuzzySearchEnabled, defaultScrollConfig.fuzzySearchEnabled ?? true),
116
+ fuzzyKeywords: parseListValue(c.fuzzyKeywords, parsedTags.length > 0 ? parsedTags : (defaultScrollConfig.fuzzyKeywords || [])),
117
+ tagSearchEnabled: unwrapScrollValue(c.tagSearchEnabled, defaultScrollConfig.tagSearchEnabled ?? false),
118
+ interestTags: parsedTags,
96
119
  userInterests: unwrapScrollValue(c.userInterests, defaultScrollConfig.userInterests || ''),
97
120
  positiveKeywords: parseListValue(c.positiveKeywords, defaultScrollConfig.positiveKeywords || []),
98
121
  negativeKeywords: parseListValue(c.negativeKeywords, defaultScrollConfig.negativeKeywords || []),
@@ -118,10 +141,22 @@ export function buildScrollConfigSchema(z) {
118
141
  .string()
119
142
  .default('')
120
143
  .description('主人的 Instagram 使用者名稱 (發現好文時將在留言區 @主人推薦)'),
144
+ fuzzySearchEnabled: z
145
+ .boolean()
146
+ .default(true)
147
+ .description('是否啟用模糊搜尋探索貼文 (預設開啟,解決單純 Tags 搜尋抓到 0 則貼文的問題)'),
148
+ fuzzyKeywords: z
149
+ .array(z.string())
150
+ .default(['ai', 'deepseek', 'coding', 'tech', 'gadgets'])
151
+ .description('模糊搜尋關鍵字清單 (結合綜合 SERP、Reels 搜尋與相關創作者貼文)'),
152
+ tagSearchEnabled: z
153
+ .boolean()
154
+ .default(false)
155
+ .description('是否啟用主題標籤 #Tag 搜尋 (預設關閉,保留並可用按鈕隨時開關)'),
121
156
  interestTags: z
122
157
  .array(z.string())
123
158
  .default(['ai', 'deepseek', 'coding', 'tech', 'gadgets'])
124
- .description('探索的主題標籤清單 (僅用於初步探索抓取,不作為推薦唯一判斷依據)'),
159
+ .description('探索的主題標籤清單 (保留設定,當開啟 Tags 搜尋按鈕時使用)'),
125
160
  userInterests: z
126
161
  .string()
127
162
  .default(defaultScrollConfig.userInterests)
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}