@luoyi-dsh/instagram-scroll 1.0.0 → 1.0.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 +172 -158
- package/README.zh-Hant.md +174 -0
- package/client.js +111 -25
- package/cordis.patch.yml +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -9
- package/dist/index.js.map +1 -1
- package/dist/lib/ledger.js +6 -6
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -1,158 +1,172 @@
|
|
|
1
|
-
# DSH Instagram
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
|
|
22
|
-
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
```bash
|
|
39
|
-
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
💬
|
|
67
|
-
|
|
68
|
-
-> AI
|
|
69
|
-
|
|
70
|
-
💬
|
|
71
|
-
|
|
72
|
-
-> AI
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
|
118
|
-
|
|
|
119
|
-
| **`
|
|
120
|
-
| **`
|
|
121
|
-
| **`
|
|
122
|
-
| **`
|
|
123
|
-
| **`
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
├──
|
|
137
|
-
├──
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
1
|
+
# DSH Instagram Scroll Feed & Exploration Plugin (`@luoyi-dsh/instagram-scroll`)
|
|
2
|
+
|
|
3
|
+
<div align="center">
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
**[English](README.md) | [繁體中文](README.zh-Hant.md)**
|
|
8
|
+
|
|
9
|
+
</div>
|
|
10
|
+
|
|
11
|
+
> Dedicated Instagram feed exploration, AI recommendation, and daily digest plugin for **DeepSeek Harness (DSH)**.
|
|
12
|
+
> Core capabilities: **Automatically or manually browse Instagram timeline feeds and topic hashtags on behalf of the user, evaluate post relevance against the owner's interests using LLMs, like and leave authentic recommendation comments, and aggregate highlights into daily Markdown reports**.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 🌟 Key Features
|
|
17
|
+
|
|
18
|
+
1. **Automated Feed Browsing (Scroll Duty)**:
|
|
19
|
+
- Periodically polls timeline feeds and configured topic hashtags.
|
|
20
|
+
- Extracts post caption, author, tags, and media metadata.
|
|
21
|
+
2. **LLM Evaluation & Smart Recommendation**:
|
|
22
|
+
- Analyzes post relevance and scores content (0-100) based on master's interest prompt.
|
|
23
|
+
- Automatically likes posts and writes authentic recommendation comments mentioning master (`@masterUsername`) when score meets criteria (default > 75).
|
|
24
|
+
3. **Daily Markdown Digest (`data/reports/YYYY-MM-DD.md`)**:
|
|
25
|
+
- Automatically organizes reviewed posts, summaries, and recommendation trails into clean Markdown daily digests.
|
|
26
|
+
- Viewable directly in the web console.
|
|
27
|
+
4. **State Ledger & Deduplication**:
|
|
28
|
+
- `data/scroll_ledger.json` keeps track of inspected media PKs and daily quotas to prevent repetitive actions and avoid rate limits.
|
|
29
|
+
5. **DSH Web Control Panel (`client.js`)**:
|
|
30
|
+
- Provides an intuitive feed waterfall preview, manual duty execution button, daily report reader, and settings inspector.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 📦 Installation
|
|
35
|
+
|
|
36
|
+
Install via DSH Plugin CLI:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
dsh plugin --profile web add @luoyi-dsh/instagram-scroll
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Or via standard npm:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
npm install @luoyi-dsh/instagram-scroll
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 🛠️ Provided DSH Tools
|
|
51
|
+
|
|
52
|
+
| Tool Name | Description | Parameters |
|
|
53
|
+
| :--- | :--- | :--- |
|
|
54
|
+
| **`ig_run_scroll_duty_now`** | Trigger an immediate exploration duty cycle (evaluate posts, like & recommend) | None |
|
|
55
|
+
| **`ig_scroll_feed`** | Read timeline feed posts (author, like count, caption excerpt) | `limit` (number, default 15, max 50) |
|
|
56
|
+
| **`ig_explore_topics`** | Explore popular posts under a specific topic or hashtag | `tag` (string, required), `limit` (number, default 15) |
|
|
57
|
+
| **`ig_like_feed_post`** | Like an Instagram post during browsing | `media_pk` (string, required) |
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 💻 Usage Examples
|
|
62
|
+
|
|
63
|
+
### 1. Natural Language Invocation in DSH Chat
|
|
64
|
+
|
|
65
|
+
```text
|
|
66
|
+
💬 Example 1: Run full exploration and recommendation duty
|
|
67
|
+
"Please check my Instagram feed right now and recommend any interesting technical posts."
|
|
68
|
+
-> AI calls: ig_run_scroll_duty_now()
|
|
69
|
+
|
|
70
|
+
💬 Example 2: Read timeline posts
|
|
71
|
+
"Browse the latest 10 posts on my Instagram feed."
|
|
72
|
+
-> AI calls: ig_scroll_feed(limit=10)
|
|
73
|
+
|
|
74
|
+
💬 Example 3: Explore a hashtag
|
|
75
|
+
"Explore top posts under #deepseek on Instagram."
|
|
76
|
+
-> AI calls: ig_explore_topics(tag="deepseek", limit=15)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
### 2. Via HTTP REST API (DSH Web Routes)
|
|
82
|
+
|
|
83
|
+
> 💡 **Tip**: Default DSH Web port is **3080**.
|
|
84
|
+
|
|
85
|
+
#### 1. Manually Trigger Duty Cycle (`POST /api/instagram/scroll/run`)
|
|
86
|
+
```bash
|
|
87
|
+
curl -X POST http://127.0.0.1:3080/api/instagram/scroll/run
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
#### 2. Get Current Status & Daily Stats (`GET /api/instagram/scroll/status`)
|
|
91
|
+
```bash
|
|
92
|
+
curl http://127.0.0.1:3080/api/instagram/scroll/status
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
#### 3. Read Today's Markdown Digest (`GET /api/instagram/scroll/report`)
|
|
96
|
+
```bash
|
|
97
|
+
curl http://127.0.0.1:3080/api/instagram/scroll/report
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
#### 4. Read & Update Configuration (`GET / POST /api/instagram/scroll/config`)
|
|
101
|
+
```bash
|
|
102
|
+
# Read config
|
|
103
|
+
curl http://127.0.0.1:3080/api/instagram/scroll/config
|
|
104
|
+
|
|
105
|
+
# Update config
|
|
106
|
+
curl -X POST http://127.0.0.1:3080/api/instagram/scroll/config \
|
|
107
|
+
-H "Content-Type: application/json" \
|
|
108
|
+
-d '{"masterUsername":"your_username","minScore":80}'
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## ⚙️ Configuration Parameters (Settings)
|
|
114
|
+
|
|
115
|
+
> 💡 **Tip**: No need to configure Instagram credentials here; it automatically inherits session state from `@luoyi-dsh/instagram-mcp`.
|
|
116
|
+
|
|
117
|
+
| Field | Type | Default | Description |
|
|
118
|
+
| :--- | :--- | :--- | :--- |
|
|
119
|
+
| **`masterUsername`** | string | `""` | Master's Instagram username (mentioned in comments when recommended) |
|
|
120
|
+
| **`interestTags`** | array | `["ai", "deepseek", "coding", "tech"]` | Topic hashtags and keywords matching the owner's interest |
|
|
121
|
+
| **`personaPrompt`** | string | *Default persona prompt* | Persona prompt guiding post analysis and recommendation copywriting |
|
|
122
|
+
| **`minScore`** | number | `75` | Recommendation score threshold (0-100) |
|
|
123
|
+
| **`dailyRecommendCap`** | number | `5` | Maximum recommendation comments allowed per day |
|
|
124
|
+
| **`scrollIntervalMinutes`**| number | `60` | Background exploration duty interval in minutes |
|
|
125
|
+
| **`autoScrollEnabled`** | boolean| `true` | Whether background automated exploration duty is enabled |
|
|
126
|
+
| **`likeOnRecommend`** | boolean| `true` | Automatically like post upon recommending to master |
|
|
127
|
+
| **`batchSize`** | number | `15` | Number of posts inspected per scroll duty round (10-30) |
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 📁 Directory Structure
|
|
132
|
+
|
|
133
|
+
```text
|
|
134
|
+
dsh-instagram-scroll/
|
|
135
|
+
├── cordis.patch.yml # DSH bundle patch manifest
|
|
136
|
+
├── package.json # Module definitions and dependencies
|
|
137
|
+
├── tsconfig.json # TypeScript compiler configuration
|
|
138
|
+
├── CHANGELOG.md # Version release notes
|
|
139
|
+
├── README.md # English documentation (This file)
|
|
140
|
+
├── README.zh-Hant.md # Traditional Chinese documentation
|
|
141
|
+
├── assets/
|
|
142
|
+
│ ├── banner.png # Promotional banner
|
|
143
|
+
│ └── zh-Hant.md # Localized documentation
|
|
144
|
+
├── client.js # DSH Web UI panel
|
|
145
|
+
├── data/ # [Runtime generated, ignored in Git]
|
|
146
|
+
│ ├── config.json # Local configuration
|
|
147
|
+
│ ├── scroll_ledger.json # Deduplication and quota ledger
|
|
148
|
+
│ └── reports/ # Daily reports folder (YYYY-MM-DD.md)
|
|
149
|
+
└── src/
|
|
150
|
+
├── index.ts # Cordis plugin entrypoint and Web API
|
|
151
|
+
├── config.ts # Schemastery config schema
|
|
152
|
+
├── types.d.ts # Type definitions
|
|
153
|
+
├── core/
|
|
154
|
+
│ └── scrollDuty.ts # Scroll duty execution, LLM evaluation, likes & comments
|
|
155
|
+
├── lib/
|
|
156
|
+
│ ├── hostdeps.ts # DSH runtime compatibility layer
|
|
157
|
+
│ └── ledger.ts # Daily digest and history ledger manager
|
|
158
|
+
└── tools/
|
|
159
|
+
└── scrollTools.ts # Dedicated DSH tools registration
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 📜 Releases & Changelog
|
|
165
|
+
|
|
166
|
+
For detailed release history and changes, please refer to [CHANGELOG.md](CHANGELOG.md).
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## 📄 License
|
|
171
|
+
|
|
172
|
+
This project is licensed under the [MIT License](LICENSE).
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
# DSH Instagram 滾動瀏覽與探索插件 (`@luoyi-dsh/instagram-scroll`)
|
|
2
|
+
|
|
3
|
+
<div align="center">
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
**[English](README.md) | [繁體中文](README.zh-Hant.md)**
|
|
8
|
+
|
|
9
|
+
</div>
|
|
10
|
+
|
|
11
|
+
> **DeepSeek Harness (DSH)** 專屬的 Instagram 動態探索、智慧推坑與日報生成外掛。
|
|
12
|
+
> 具備核心能力:**定時或手動替主人刷一輪 Instagram 首頁動態與主題標籤、逐條閱讀內文評估主人興趣、自動點讚與留言推坑,並自動彙整生成每日 Markdown 探索日報**。
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 🌟 核心特性
|
|
17
|
+
|
|
18
|
+
1. **自動動態探索巡查 (Scroll Duty)**:
|
|
19
|
+
- 定期輪詢首頁動態牆 (Timeline Feed) 與指定主題標籤 (Hashtags)。
|
|
20
|
+
- 逐則貼文抓取標題、作者、標籤與完整內文。
|
|
21
|
+
2. **LLM 價值評估與推坑 (AI Recommendation)**:
|
|
22
|
+
- 由大語言模型依據主人的興趣 Prompt 深度分析貼文內容與價值評分。
|
|
23
|
+
- 若達標(預設 > 75 分),自動在貼文下點讚並留言 `@目標用戶` 附上真誠自然的推薦語。
|
|
24
|
+
3. **每日探索日報 (Daily Markdown Report)**:
|
|
25
|
+
- 自動將今日瀏覽之所有精選貼文、摘要與推薦紀錄整理為 Markdown 日報。
|
|
26
|
+
- 儲存於 `data/reports/YYYY-MM-DD.md`,可隨時在 Web 面板查看與回溯。
|
|
27
|
+
4. **狀態帳本與嚴格去重控制**:
|
|
28
|
+
- `data/scroll_ledger.json` 記錄已看貼文 PK 與今日推坑次數,避免重複推坑或重複閱讀,並防止觸發風控。
|
|
29
|
+
5. **DSH Web 瀏覽器端介面 (`client.js`)**:
|
|
30
|
+
- 提供直觀動態牆瀑布流預覽、即時手動觸發刷動態按鈕、日報閱讀器與自訂設定面板。
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 📦 安裝方式
|
|
35
|
+
|
|
36
|
+
使用 DSH CLI 安裝插件:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
dsh plugin --profile web add @luoyi-dsh/instagram-scroll
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
或透過 npm 安裝:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
npm install @luoyi-dsh/instagram-scroll
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 🛠️ 提供之 DSH Tools
|
|
51
|
+
|
|
52
|
+
| 工具名稱 | 說明 | 參數 |
|
|
53
|
+
| :--- | :--- | :--- |
|
|
54
|
+
| **`ig_run_scroll_duty_now`** | 立即手動替主人刷一輪 Instagram 動態與探索,讀取貼文進行評估、點讚與留言推坑 | 無 |
|
|
55
|
+
| **`ig_scroll_feed`** | 滾動讀取 Instagram 時間軸最新動態貼文(含作者、讚數、內文摘要) | `limit` (number,預設 15,最大 50) |
|
|
56
|
+
| **`ig_explore_topics`** | 依照指定主題或探索標籤滾動閱讀熱門貼文 | `tag` (string,必填), `limit` (number,預設 15) |
|
|
57
|
+
| **`ig_like_feed_post`** | 在滾動瀏覽過程中對感興趣的 Instagram 貼文按讚 | `media_pk` (string,必填) |
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 💻 使用範例
|
|
62
|
+
|
|
63
|
+
### 1. DSH AI 自然語言直接調用
|
|
64
|
+
|
|
65
|
+
在 DSH 對話中,主模型可直接以自然語言執行滾動探索或瀏覽:
|
|
66
|
+
|
|
67
|
+
```text
|
|
68
|
+
💬 範例 1:執行一輪完整的動態探索與推坑
|
|
69
|
+
「請立刻替我刷一輪 Instagram 動態牆,看看有沒有適合我的技術新貼文並推薦給我」
|
|
70
|
+
-> AI 將調用:ig_run_scroll_duty_now()
|
|
71
|
+
|
|
72
|
+
💬 範例 2:滾動瀏覽首頁動態貼文
|
|
73
|
+
「幫我刷最新 10 則 Instagram 動態」
|
|
74
|
+
-> AI 將調用:ig_scroll_feed(limit=10)
|
|
75
|
+
|
|
76
|
+
💬 範例 3:探索特定主題標籤
|
|
77
|
+
「探索 Instagram 上 #deepseek 標籤的熱門貼文」
|
|
78
|
+
-> AI 將調用:ig_explore_topics(tag="deepseek", limit=15)
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
### 2. 透過 HTTP REST API 調用 (DSH Web 路由)
|
|
84
|
+
|
|
85
|
+
> 💡 **提示**:DSH Web 預設埠號為 **3080**。
|
|
86
|
+
|
|
87
|
+
#### 1. 手動觸發滾動一輪 (`POST /api/instagram/scroll/run`)
|
|
88
|
+
```bash
|
|
89
|
+
curl -X POST http://127.0.0.1:3080/api/instagram/scroll/run
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
#### 2. 獲取當前滾動狀態與今日統計 (`GET /api/instagram/scroll/status`)
|
|
93
|
+
```bash
|
|
94
|
+
curl http://127.0.0.1:3080/api/instagram/scroll/status
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
#### 3. 讀取今日探索日報內容 (`GET /api/instagram/scroll/report`)
|
|
98
|
+
```bash
|
|
99
|
+
curl http://127.0.0.1:3080/api/instagram/scroll/report
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
#### 4. 讀取與更新設定 (`GET / POST /api/instagram/scroll/config`)
|
|
103
|
+
```bash
|
|
104
|
+
# 取得設定
|
|
105
|
+
curl http://127.0.0.1:3080/api/instagram/scroll/config
|
|
106
|
+
|
|
107
|
+
# 更新設定
|
|
108
|
+
curl -X POST http://127.0.0.1:3080/api/instagram/scroll/config \
|
|
109
|
+
-H "Content-Type: application/json" \
|
|
110
|
+
-d '{"masterUsername":"your_username","minScore":80}'
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## ⚙️ 設定參數說明 (Settings)
|
|
116
|
+
|
|
117
|
+
> 💡 **提示**:本外掛**不用輸入帳號密碼**,會直接沿用依賴的 `@luoyi-dsh/instagram-mcp` 獲取之 Session 與登入狀態。
|
|
118
|
+
|
|
119
|
+
| 欄位名稱 | 型別 | 預設值 | 說明 |
|
|
120
|
+
| :--- | :--- | :--- | :--- |
|
|
121
|
+
| **`masterUsername`** | string | `""` | 主人的 Instagram 使用者名稱(達標時在留言區 @主人 推薦) |
|
|
122
|
+
| **`interestTags`** | array | `["ai", "deepseek", "coding", "tech"]` | 主人感興趣的主題標籤或領域關鍵字清單 |
|
|
123
|
+
| **`personaPrompt`** | string | *預設人設提示詞* | 評估貼文趣味度與撰寫 @主人 推薦語的人設 Prompt |
|
|
124
|
+
| **`minScore`** | number | `75` | 推坑門檻分數(0-100,達標才在貼文下留言推薦) |
|
|
125
|
+
| **`dailyRecommendCap`** | number | `5` | 每日向主人推坑留言的上限則數(防止過度打擾與風控) |
|
|
126
|
+
| **`scrollIntervalMinutes`**| number | `60` | 自動巡查刷動態牆的時間週期(分鐘) |
|
|
127
|
+
| **`autoScrollEnabled`** | boolean| `true` | 是否啟用背景定時自動刷動態牆任務 |
|
|
128
|
+
| **`likeOnRecommend`** | boolean| `true` | 決定推薦給主人時是否順便對該貼文點讚 |
|
|
129
|
+
| **`batchSize`** | number | `15` | 每輪滾動瀏覽抓取的貼文筆數 (10-30) |
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## 📁 目錄結構
|
|
134
|
+
|
|
135
|
+
```text
|
|
136
|
+
dsh-instagram-scroll/
|
|
137
|
+
├── cordis.patch.yml # DSH bundle patch 宣告
|
|
138
|
+
├── package.json # 模組定義與依賴
|
|
139
|
+
├── tsconfig.json # TypeScript 編譯設定
|
|
140
|
+
├── CHANGELOG.md # 版本更新紀錄
|
|
141
|
+
├── README.md # 英文說明文件
|
|
142
|
+
├── README.zh-Hant.md # 繁體中文說明文件
|
|
143
|
+
├── assets/
|
|
144
|
+
│ ├── banner.png # 宣傳橫幅
|
|
145
|
+
│ └── zh-Hant.md # 本地化說明文件
|
|
146
|
+
├── client.js # DSH Web 前端面板 (動態瀏覽、手動觸發、日報查看)
|
|
147
|
+
├── data/
|
|
148
|
+
│ ├── config.json # 本地設定檔
|
|
149
|
+
│ ├── scroll_ledger.json # 瀏覽去重與統計帳本
|
|
150
|
+
│ └── reports/ # 每日日報儲存目錄 (YYYY-MM-DD.md)
|
|
151
|
+
└── src/
|
|
152
|
+
├── index.ts # Cordis 外掛入口、排程定時器與 Web API
|
|
153
|
+
├── config.ts # Schemastery 設定模型
|
|
154
|
+
├── types.d.ts # 型別宣告
|
|
155
|
+
├── core/
|
|
156
|
+
│ └── scrollDuty.ts # 滾動瀏覽、大模型評估、點讚與推坑核心邏輯
|
|
157
|
+
├── lib/
|
|
158
|
+
│ ├── hostdeps.ts # DSH 宿主相容層
|
|
159
|
+
│ └── ledger.ts # 日報生成與歷史去重帳本管理器
|
|
160
|
+
└── tools/
|
|
161
|
+
└── scrollTools.ts # 向 DSH Tools 註冊之專用滾動瀏覽工具
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## 📜 版本發布紀錄 (Releases)
|
|
167
|
+
|
|
168
|
+
詳細版本演進與更新紀錄,請參閱 [CHANGELOG.md](CHANGELOG.md)。
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## 📄 授權條款
|
|
173
|
+
|
|
174
|
+
本專案採用 [MIT License](LICENSE) 開源授權。
|
package/client.js
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
15
|
window.__ModuleLoader__.load({
|
|
16
|
-
id: 'dsh
|
|
16
|
+
id: '@luoyi-dsh/instagram-scroll',
|
|
17
17
|
factory: (require) => {
|
|
18
18
|
const React = require('react')
|
|
19
19
|
const h = React.createElement
|
|
@@ -556,6 +556,7 @@ window.__ModuleLoader__.load({
|
|
|
556
556
|
const [tab, setTab] = useState('feed')
|
|
557
557
|
const [cfg, setCfg] = useState(normalizeScrollConfig({}))
|
|
558
558
|
const [status, setStatus] = useState(null)
|
|
559
|
+
const [mcpStatus, setMcpStatus] = useState(null)
|
|
559
560
|
const [report, setReport] = useState('')
|
|
560
561
|
const [loading, setLoading] = useState(true)
|
|
561
562
|
const [saving, setSaving] = useState(false)
|
|
@@ -564,14 +565,18 @@ window.__ModuleLoader__.load({
|
|
|
564
565
|
|
|
565
566
|
const refresh = async () => {
|
|
566
567
|
try {
|
|
567
|
-
const [cfgRes, statusRes, reportRes] = await Promise.all([
|
|
568
|
-
jget('/config'),
|
|
569
|
-
jget('/status'),
|
|
570
|
-
jget('/report'),
|
|
568
|
+
const [cfgRes, statusRes, reportRes, mcpRes] = await Promise.all([
|
|
569
|
+
jget('/config').catch(() => null),
|
|
570
|
+
jget('/status').catch(() => null),
|
|
571
|
+
jget('/report').catch(() => null),
|
|
572
|
+
fetch('/api/instagram/mcp/status', { credentials: 'same-origin' })
|
|
573
|
+
.then((r) => r.json())
|
|
574
|
+
.catch(() => null),
|
|
571
575
|
])
|
|
572
576
|
if (cfgRes?.ok) setCfg(normalizeScrollConfig(cfgRes.config))
|
|
573
577
|
if (statusRes?.ok) setStatus(statusRes)
|
|
574
578
|
if (reportRes?.ok) setReport(reportRes.report || '')
|
|
579
|
+
if (mcpRes?.ok) setMcpStatus(mcpRes)
|
|
575
580
|
} catch (e) {
|
|
576
581
|
setMsg(`讀取狀態失敗: ${e.message}`)
|
|
577
582
|
} finally {
|
|
@@ -625,6 +630,22 @@ window.__ModuleLoader__.load({
|
|
|
625
630
|
const daily = status?.dailyStats || {}
|
|
626
631
|
const recommendedItems = daily.recommendedItems || []
|
|
627
632
|
|
|
633
|
+
const isMcpConnected = Boolean(
|
|
634
|
+
status?.mcpReady ||
|
|
635
|
+
status?.loginStatus?.ok ||
|
|
636
|
+
mcpStatus?.mcpReady ||
|
|
637
|
+
mcpStatus?.loginStatus?.ok
|
|
638
|
+
)
|
|
639
|
+
|
|
640
|
+
const rawAccount =
|
|
641
|
+
status?.mcpAccount ||
|
|
642
|
+
status?.loginStatus?.username ||
|
|
643
|
+
mcpStatus?.loginStatus?.username ||
|
|
644
|
+
(mcpStatus?.loginStatus?.message?.match(/@([^\s)]+)/)?.[1]) ||
|
|
645
|
+
(isMcpConnected ? '已連線' : '')
|
|
646
|
+
|
|
647
|
+
const displayAccount = rawAccount ? rawAccount.replace(/^@/, '') : ''
|
|
648
|
+
|
|
628
649
|
return h(
|
|
629
650
|
'div',
|
|
630
651
|
{ className: 'ig-scr-root' },
|
|
@@ -643,8 +664,22 @@ window.__ModuleLoader__.load({
|
|
|
643
664
|
h('div', { className: 'ig-scr-brand-title' }, 'Instagram 滾動探索與主人推坑'),
|
|
644
665
|
h(
|
|
645
666
|
'div',
|
|
646
|
-
{ className: 'ig-scr-brand-sub' },
|
|
647
|
-
cfg.masterUsername ?
|
|
667
|
+
{ className: 'ig-scr-brand-sub', style: { display: 'flex', alignItems: 'center', gap: '8px' } },
|
|
668
|
+
cfg.masterUsername ? `目標主人: @${cfg.masterUsername.replace(/^@/, '')}` : '尚未綁定主人帳號',
|
|
669
|
+
h('span', { style: { color: 'rgba(255, 255, 255, 0.2)' } }, '|'),
|
|
670
|
+
isMcpConnected
|
|
671
|
+
? h(
|
|
672
|
+
'span',
|
|
673
|
+
{ style: { color: '#34d399', fontSize: '11px', display: 'inline-flex', alignItems: 'center', gap: '4px' } },
|
|
674
|
+
h('span', { style: { width: '6px', height: '6px', borderRadius: '50%', background: '#10b981' } }),
|
|
675
|
+
`MCP 會話: @${displayAccount || '已連線'}`
|
|
676
|
+
)
|
|
677
|
+
: h(
|
|
678
|
+
'span',
|
|
679
|
+
{ style: { color: '#fbbf24', fontSize: '11px', display: 'inline-flex', alignItems: 'center', gap: '4px' } },
|
|
680
|
+
h('span', { style: { width: '6px', height: '6px', borderRadius: '50%', background: '#f59e0b' } }),
|
|
681
|
+
'等待 MCP 登入'
|
|
682
|
+
)
|
|
648
683
|
)
|
|
649
684
|
)
|
|
650
685
|
),
|
|
@@ -652,7 +687,8 @@ window.__ModuleLoader__.load({
|
|
|
652
687
|
'button',
|
|
653
688
|
{
|
|
654
689
|
className: 'ig-scr-btn primary',
|
|
655
|
-
disabled: runningRound,
|
|
690
|
+
disabled: runningRound || !isMcpConnected,
|
|
691
|
+
title: !isMcpConnected ? '等待 FastMCP 連線就緒後即可刷動態' : '立即替主人刷一輪動態',
|
|
656
692
|
onClick: runNow,
|
|
657
693
|
},
|
|
658
694
|
h(Icon.Play, { size: 12 }),
|
|
@@ -820,6 +856,32 @@ window.__ModuleLoader__.load({
|
|
|
820
856
|
h('div', { className: 'ig-scr-section-desc' }, '設定主人的 Instagram 帳號名與感興趣的標籤領域,AI 將依此進行嚴格內容篩選。')
|
|
821
857
|
),
|
|
822
858
|
|
|
859
|
+
// MCP Session 來源提示
|
|
860
|
+
h(
|
|
861
|
+
'div',
|
|
862
|
+
{
|
|
863
|
+
style: {
|
|
864
|
+
background: 'rgba(59, 130, 246, 0.06)',
|
|
865
|
+
border: '1px solid rgba(59, 130, 246, 0.2)',
|
|
866
|
+
borderRadius: '8px',
|
|
867
|
+
padding: '10px 14px',
|
|
868
|
+
fontSize: '12px',
|
|
869
|
+
color: '#93c5fd',
|
|
870
|
+
display: 'flex',
|
|
871
|
+
alignItems: 'center',
|
|
872
|
+
gap: '8px',
|
|
873
|
+
},
|
|
874
|
+
},
|
|
875
|
+
h(Icon.Sparkles, { size: 14 }),
|
|
876
|
+
h(
|
|
877
|
+
'span',
|
|
878
|
+
null,
|
|
879
|
+
isMcpConnected
|
|
880
|
+
? `已沿用 @luoyi-dsh/instagram-mcp 的登入會話 (@${displayAccount || '已授權'}),本外掛無需填寫帳密。`
|
|
881
|
+
: '本外掛無需輸入帳密,直接沿用依賴的 dsh-instagram-mcp 獲取之 Session。目前 MCP 尚未登入,請先至 MCP 面板完成登入。'
|
|
882
|
+
)
|
|
883
|
+
),
|
|
884
|
+
|
|
823
885
|
h(
|
|
824
886
|
'div',
|
|
825
887
|
{ className: 'ig-scr-field' },
|
|
@@ -1013,47 +1075,71 @@ window.__ModuleLoader__.load({
|
|
|
1013
1075
|
const slots = (typeof ctx.get === 'function' ? ctx.get('slots') : undefined) || ctx.slots
|
|
1014
1076
|
if (!slots) return
|
|
1015
1077
|
|
|
1016
|
-
|
|
1017
|
-
|
|
1078
|
+
// 1. 左側一級專屬導航槽位 (settings.section)
|
|
1079
|
+
const registerSection = () => {
|
|
1080
|
+
try {
|
|
1018
1081
|
slots.register(
|
|
1019
1082
|
{
|
|
1020
1083
|
name: 'settings.section',
|
|
1021
1084
|
id: 'instagram-scroll',
|
|
1022
|
-
order:
|
|
1023
|
-
label: 'Instagram
|
|
1085
|
+
order: 36,
|
|
1086
|
+
label: 'Instagram 滾動',
|
|
1024
1087
|
},
|
|
1025
1088
|
() => h(ScrollPanel)
|
|
1026
1089
|
)
|
|
1027
|
-
)
|
|
1028
|
-
|
|
1090
|
+
} catch (e) {
|
|
1091
|
+
console.error('[@luoyi-dsh/instagram-scroll] 註冊 settings.section 異常:', e)
|
|
1092
|
+
}
|
|
1093
|
+
}
|
|
1094
|
+
if (typeof slots.inject === 'function') {
|
|
1095
|
+
slots.inject('settings.section', registerSection)
|
|
1096
|
+
} else if (typeof slots.register === 'function') {
|
|
1097
|
+
registerSection()
|
|
1098
|
+
}
|
|
1029
1099
|
|
|
1030
|
-
|
|
1031
|
-
|
|
1100
|
+
// 2. 外掛程式頁面頂部頁籤 (settings.plugins.tab)
|
|
1101
|
+
const registerTab = () => {
|
|
1102
|
+
try {
|
|
1032
1103
|
slots.register(
|
|
1033
1104
|
{
|
|
1034
1105
|
name: 'settings.plugins.tab',
|
|
1035
1106
|
id: 'instagram-scroll',
|
|
1036
|
-
order:
|
|
1037
|
-
label: 'Instagram
|
|
1107
|
+
order: 36,
|
|
1108
|
+
label: 'Instagram 滾動',
|
|
1038
1109
|
},
|
|
1039
1110
|
() => h(ScrollPanel)
|
|
1040
1111
|
)
|
|
1041
|
-
)
|
|
1042
|
-
|
|
1112
|
+
} catch (e) {
|
|
1113
|
+
console.error('[@luoyi-dsh/instagram-scroll] 註冊 settings.plugins.tab 異常:', e)
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
1116
|
+
if (typeof slots.inject === 'function') {
|
|
1117
|
+
slots.inject('settings.plugins.tab', registerTab)
|
|
1118
|
+
} else if (typeof slots.register === 'function') {
|
|
1119
|
+
registerTab()
|
|
1120
|
+
}
|
|
1043
1121
|
|
|
1044
|
-
|
|
1045
|
-
|
|
1122
|
+
// 3. 外掛程式卡片列表槽位 (plugins.item)
|
|
1123
|
+
const registerItem = () => {
|
|
1124
|
+
try {
|
|
1046
1125
|
slots.register(
|
|
1047
1126
|
{
|
|
1048
1127
|
name: 'plugins.item',
|
|
1049
1128
|
id: 'instagram-scroll',
|
|
1050
|
-
order:
|
|
1129
|
+
order: 36,
|
|
1051
1130
|
label: 'Instagram 滾動探索與推坑',
|
|
1052
1131
|
},
|
|
1053
1132
|
() => h(ScrollPanel)
|
|
1054
1133
|
)
|
|
1055
|
-
)
|
|
1056
|
-
|
|
1134
|
+
} catch (e) {
|
|
1135
|
+
console.error('[@luoyi-dsh/instagram-scroll] 註冊 plugins.item 異常:', e)
|
|
1136
|
+
}
|
|
1137
|
+
}
|
|
1138
|
+
if (typeof slots.inject === 'function') {
|
|
1139
|
+
slots.inject('plugins.item', registerItem)
|
|
1140
|
+
} else if (typeof slots.register === 'function') {
|
|
1141
|
+
registerItem()
|
|
1142
|
+
}
|
|
1057
1143
|
},
|
|
1058
1144
|
}
|
|
1059
1145
|
},
|
package/cordis.patch.yml
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,OAAO,EAAgD,qBAAqB,EAAwB,MAAM,aAAa,CAAA;AAMvH,eAAO,MAAM,IAAI,qBAAqB,CAAA;AACtC,eAAO,MAAM,MAAM,UAAyB,CAAA;AAG5C,eAAO,MAAM,MAAM,KAAqC,CAAA;AAoBxD,wBAAgB,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,GAAE,OAAO,CAAC,qBAAqB,CAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,OAAO,EAAgD,qBAAqB,EAAwB,MAAM,aAAa,CAAA;AAMvH,eAAO,MAAM,IAAI,qBAAqB,CAAA;AACtC,eAAO,MAAM,MAAM,UAAyB,CAAA;AAG5C,eAAO,MAAM,MAAM,KAAqC,CAAA;AAoBxD,wBAAgB,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,GAAE,OAAO,CAAC,qBAAqB,CAAM,QAoN9E;;;;;;;AAED,wBAKC"}
|
package/dist/index.js
CHANGED
|
@@ -19,7 +19,7 @@ import { buildScrollConfigSchema, defaultScrollConfig, sanitizeScrollConfig } fr
|
|
|
19
19
|
import { loadSchemastery } from './lib/hostdeps.js';
|
|
20
20
|
import { ScrollLedgerManager } from './lib/ledger.js';
|
|
21
21
|
import { executeScrollRound } from './core/scrollDuty.js';
|
|
22
|
-
import { getSharedMcpClient } from '@luoyi-dsh/instagram-mcp';
|
|
22
|
+
import { getSharedMcpClient, getSharedMcpService } from '@luoyi-dsh/instagram-mcp';
|
|
23
23
|
export const name = 'instagram-scroll';
|
|
24
24
|
export const inject = ['webServer', 'tools'];
|
|
25
25
|
const zInstance = await loadSchemastery();
|
|
@@ -162,10 +162,19 @@ export function apply(ctx, userConfig = {}) {
|
|
|
162
162
|
}
|
|
163
163
|
// 讀取今日狀態與推坑數據
|
|
164
164
|
if (req.method === 'GET' && pathname === '/api/instagram/scroll/status') {
|
|
165
|
-
const
|
|
165
|
+
const svc = getSharedMcpService() || globalThis.__DSH_INSTAGRAM_MCP__;
|
|
166
|
+
const client = getMcpClient() || svc?.client;
|
|
167
|
+
const mcpLogin = svc?.loginStatus || null;
|
|
168
|
+
const isReady = Boolean(client && client.ready);
|
|
169
|
+
const account = mcpLogin?.username ||
|
|
170
|
+
(mcpLogin?.message?.match(/@([^\s)]+)/)?.[1]) ||
|
|
171
|
+
(isReady ? '已連線' : '');
|
|
166
172
|
return sendJson(res, 200, {
|
|
167
173
|
ok: true,
|
|
168
|
-
mcpReady:
|
|
174
|
+
mcpReady: isReady,
|
|
175
|
+
inheritedSession: true,
|
|
176
|
+
loginStatus: mcpLogin || (isReady ? { ok: true, message: 'FastMCP 運行中', username: account } : null),
|
|
177
|
+
mcpAccount: account,
|
|
169
178
|
dailyStats: ledger.getDailyStats(),
|
|
170
179
|
});
|
|
171
180
|
}
|
|
@@ -191,23 +200,28 @@ export function apply(ctx, userConfig = {}) {
|
|
|
191
200
|
sendJson(res, 500, { ok: false, error: err.message });
|
|
192
201
|
}
|
|
193
202
|
};
|
|
203
|
+
globalThis.__DSH_IG_SCROLL_HANDLER__ = handleRequest;
|
|
194
204
|
const webServer = (typeof ctx.get === 'function' ? ctx.get('webServer') : undefined) || ctx.webServer;
|
|
195
|
-
if (globalThis.__DSH_IG_SCROLL_ROUTES_REGISTERED__) {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
205
|
+
if (!globalThis.__DSH_IG_SCROLL_ROUTES_REGISTERED__ && webServer) {
|
|
206
|
+
const routeDispatcher = (req, res) => {
|
|
207
|
+
const activeHandler = globalThis.__DSH_IG_SCROLL_HANDLER__;
|
|
208
|
+
if (typeof activeHandler === 'function') {
|
|
209
|
+
return activeHandler(req, res);
|
|
210
|
+
}
|
|
211
|
+
return handleRequest(req, res);
|
|
212
|
+
};
|
|
199
213
|
try {
|
|
200
214
|
if (typeof webServer.register === 'function') {
|
|
201
215
|
webServer.register({
|
|
202
216
|
kind: 'prefix',
|
|
203
217
|
path: '/api/instagram/scroll',
|
|
204
|
-
handler:
|
|
218
|
+
handler: routeDispatcher,
|
|
205
219
|
});
|
|
206
220
|
globalThis.__DSH_IG_SCROLL_ROUTES_REGISTERED__ = true;
|
|
207
221
|
log('✅ 已註冊 DSH 官方路由: /api/instagram/scroll');
|
|
208
222
|
}
|
|
209
223
|
else if (webServer.router) {
|
|
210
|
-
webServer.router.all('/api/instagram/scroll/*',
|
|
224
|
+
webServer.router.all('/api/instagram/scroll/*', routeDispatcher);
|
|
211
225
|
globalThis.__DSH_IG_SCROLL_ROUTES_REGISTERED__ = true;
|
|
212
226
|
}
|
|
213
227
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAyB,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACvH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAA2B,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/ledger.js
CHANGED
|
@@ -107,12 +107,12 @@ export class ScrollLedgerManager {
|
|
|
107
107
|
}
|
|
108
108
|
appendReport(item) {
|
|
109
109
|
const reportPath = join(this.reportsDir, `${this.state.date}.md`);
|
|
110
|
-
const line = `### [${item.author}](${item.url}) (評分: ${item.score}/100)
|
|
111
|
-
- **推薦原因**:${item.reason}
|
|
112
|
-
- **@主人留言**:\`${item.commentText}\`
|
|
113
|
-
- **時間**:${item.timestamp}
|
|
114
|
-
|
|
115
|
-
---
|
|
110
|
+
const line = `### [${item.author}](${item.url}) (評分: ${item.score}/100)
|
|
111
|
+
- **推薦原因**:${item.reason}
|
|
112
|
+
- **@主人留言**:\`${item.commentText}\`
|
|
113
|
+
- **時間**:${item.timestamp}
|
|
114
|
+
|
|
115
|
+
---
|
|
116
116
|
`;
|
|
117
117
|
try {
|
|
118
118
|
let content = '';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@luoyi-dsh/instagram-scroll",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "DeepSeek Harness (DSH) Instagram 動態滾動瀏覽與探索插件:提供動態牆無限滾動、探索摘要與即時互動能力",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"dsh",
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
},
|
|
20
20
|
"client": {
|
|
21
21
|
"platform": "web",
|
|
22
|
+
"immediately": true,
|
|
22
23
|
"inject": [
|
|
23
24
|
"@deepseek-ai/dsh-client-ui-settings",
|
|
24
25
|
"@deepseek-ai/dsh-client-ui-settings-plugins"
|