@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.
- package/README.md +35 -5
- package/README.zh-Hant.md +35 -5
- package/client.js +171 -15
- package/dist/config.d.ts +10 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +120 -8
- package/dist/config.js.map +1 -1
- package/dist/core/scrollDuty.d.ts +30 -1
- package/dist/core/scrollDuty.d.ts.map +1 -1
- package/dist/core/scrollDuty.js +353 -63
- package/dist/core/scrollDuty.js.map +1 -1
- package/dist/lib/ledger.d.ts +7 -0
- package/dist/lib/ledger.d.ts.map +1 -1
- package/dist/lib/ledger.js +23 -0
- package/dist/lib/ledger.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,6 +11,22 @@
|
|
|
11
11
|
> Dedicated Instagram feed exploration, AI recommendation, and daily digest plugin for **DeepSeek Harness (DSH)**.
|
|
12
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
13
|
|
|
14
|
+
> [!CAUTION]
|
|
15
|
+
> ### ⚠️ CRITICAL WARNING & DISCLAIMER
|
|
16
|
+
> 1. **Violation of Instagram Terms of Service & Community Guidelines**:
|
|
17
|
+
> This plugin and its automated feed browsing, liking, and commenting routines operate via unofficial APIs, which **expressly violates Instagram / Meta's Terms of Use and Community Guidelines**.
|
|
18
|
+
> 2. **DO NOT USE YOUR PERSONAL / PRIMARY ACCOUNT**:
|
|
19
|
+
> **Never run this plugin using your personal, primary, or business Instagram account!** Automated browsing and repeated comment posting are quickly flagged by Instagram's anti-scraping and bot-detection heuristics, resulting in: **Action Blocks, Challenge Checkpoints, temporary locks, and PERMANENT ACCOUNT SUSPENSION / BANNING**.
|
|
20
|
+
> 3. **Use Dedicated Burner / Alt Accounts & Clean Proxies**:
|
|
21
|
+
> Only run this plugin on disposable secondary accounts (burner/alt accounts) with dedicated residential proxies. Avoid sudden geographic IP changes.
|
|
22
|
+
> 4. **Built-in Anti-Risk Safeguards**:
|
|
23
|
+
> - **Per-Run Action Cap**: Strictly limits recommendations to at most 1 per scroll run (`maxRecommendsPerRun: 1`) to avoid burst posting.
|
|
24
|
+
> - **Humanized Reading Delays**: Injects randomized 3–7s reading delays between scanning candidate posts (`minPostReadDelaySeconds: 3, maxPostReadDelaySeconds: 7`).
|
|
25
|
+
> - **Action Jitter**: Enforces 6–15s randomized delays before executing comments or likes.
|
|
26
|
+
> - **Circuit Breaker Cooldown**: Automatically pauses all exploration for 30 minutes if an Action Block or rate limit is encountered.
|
|
27
|
+
> 5. **Disclaimer**:
|
|
28
|
+
> This project is provided strictly for educational and technical research purposes. The developers and contributors accept **no responsibility or liability** for any account bans, suspensions, or losses resulting from its use. Use entirely at your own risk!
|
|
29
|
+
|
|
14
30
|
---
|
|
15
31
|
|
|
16
32
|
## 🌟 Key Features
|
|
@@ -18,9 +34,13 @@
|
|
|
18
34
|
1. **Automated Feed Browsing (Scroll Duty)**:
|
|
19
35
|
- Periodically polls timeline feeds and configured topic hashtags.
|
|
20
36
|
- Extracts post caption, author, tags, and media metadata.
|
|
21
|
-
2. **
|
|
22
|
-
-
|
|
23
|
-
-
|
|
37
|
+
2. **Deep Content Inspection & User Preference Alignment**:
|
|
38
|
+
- **No Superficial Recommendations**: Abandons simple hashtag-only / high-like criteria; threshold raised to score 80.
|
|
39
|
+
- **Caption & Tag Separation**: Dissects raw captions to separate genuine body text from trailing hashtags and mentions. Posts with substantive body text shorter than `minCaptionLength` (30 chars) are discarded.
|
|
40
|
+
- **Hashtag Spam / Farm Detection**: Flags and drops posts where tags dominate over meaningful content.
|
|
41
|
+
- **Body Topic Verification**: Mandates that master's interest keywords/topics genuinely appear within the post body (`requireBodyMatch`).
|
|
42
|
+
- **Negative / Spam Filtering**: Instantly filters out giveaways, mutual-follows, dropshipping, gambling, emotional clickbait, and superficial selfie/meme posts.
|
|
43
|
+
- **LLM Semantic Review & Tailored Hook**: Evaluates true content substance via LLM or robust heuristic review, synthesizing custom authentic recommendation comments.
|
|
24
44
|
3. **Daily Markdown Digest (`data/reports/YYYY-MM-DD.md`)**:
|
|
25
45
|
- Automatically organizes reviewed posts, summaries, and recommendation trails into clean Markdown daily digests.
|
|
26
46
|
- Viewable directly in the web console.
|
|
@@ -117,10 +137,20 @@ curl -X POST http://127.0.0.1:3080/api/instagram/scroll/config \
|
|
|
117
137
|
| Field | Type | Default | Description |
|
|
118
138
|
| :--- | :--- | :--- | :--- |
|
|
119
139
|
| **`masterUsername`** | string | `""` | Master's Instagram username (mentioned in comments when recommended) |
|
|
120
|
-
| **`
|
|
140
|
+
| **`userInterests`** | string | *Default persona description* | Detailed description of owner's topics, taste, and technical expectations |
|
|
141
|
+
| **`positiveKeywords`** | array | `["ai", "deepseek", ...]` | High-priority positive topic keywords required in post body |
|
|
142
|
+
| **`negativeKeywords`** | array | `["互粉", "代購", "抽獎", ...]` | Negative / spam blacklist words to immediately reject |
|
|
143
|
+
| **`minCaptionLength`** | number | `30` | Minimum character length of genuine post body (excluding hashtags) |
|
|
144
|
+
| **`requireBodyMatch`** | boolean| `true` | Body text must substantiate owner's preferences (rejects tag-only matches) |
|
|
145
|
+
| **`strictContentCheck`**| boolean| `true` | Enables deep content inspection pipeline before commenting |
|
|
146
|
+
| **`interestTags`** | array | `["ai", "deepseek", "coding", "tech", "gadgets"]` | Exploration starting tags (not sole recommendation criteria) |
|
|
121
147
|
| **`personaPrompt`** | string | *Default persona prompt* | Persona prompt guiding post analysis and recommendation copywriting |
|
|
122
|
-
| **`minScore`** | number | `
|
|
148
|
+
| **`minScore`** | number | `80` | Recommendation score threshold (0-100; elevated to avoid spam) |
|
|
123
149
|
| **`dailyRecommendCap`** | number | `5` | Maximum recommendation comments allowed per day |
|
|
150
|
+
| **`maxRecommendsPerRun`**| number | `1` | Max recommendations per duty run to prevent bursting |
|
|
151
|
+
| **`minPostReadDelaySeconds`** | number | `3` | Minimum human reading pacing delay between posts |
|
|
152
|
+
| **`maxPostReadDelaySeconds`** | number | `7` | Maximum human reading pacing delay between posts |
|
|
153
|
+
| **`cooldownOnBlockMinutes`** | number | `30` | Automatic circuit breaker cooldown minutes upon action blocks |
|
|
124
154
|
| **`scrollIntervalMinutes`**| number | `60` | Background exploration duty interval in minutes |
|
|
125
155
|
| **`autoScrollEnabled`** | boolean| `true` | Whether background automated exploration duty is enabled |
|
|
126
156
|
| **`likeOnRecommend`** | boolean| `true` | Automatically like post upon recommending to master |
|
package/README.zh-Hant.md
CHANGED
|
@@ -11,6 +11,22 @@
|
|
|
11
11
|
> **DeepSeek Harness (DSH)** 專屬的 Instagram 動態探索、智慧推坑與日報生成外掛。
|
|
12
12
|
> 具備核心能力:**定時或手動替主人刷一輪 Instagram 首頁動態與主題標籤、逐條閱讀內文評估主人興趣、自動點讚與留言推坑,並自動彙整生成每日 Markdown 探索日報**。
|
|
13
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
|
+
|
|
14
30
|
---
|
|
15
31
|
|
|
16
32
|
## 🌟 核心特性
|
|
@@ -18,9 +34,13 @@
|
|
|
18
34
|
1. **自動動態探索巡查 (Scroll Duty)**:
|
|
19
35
|
- 定期輪詢首頁動態牆 (Timeline Feed) 與指定主題標籤 (Hashtags)。
|
|
20
36
|
- 逐則貼文抓取標題、作者、標籤與完整內文。
|
|
21
|
-
2.
|
|
22
|
-
-
|
|
23
|
-
-
|
|
37
|
+
2. **正文深度審查與用戶偏好推薦 (Content Inspection Pipeline)**:
|
|
38
|
+
- **絕不隨便推薦**:徹底拋棄僅看 tag 與點讚數的粗糙過濾,門檻提高至 80 分。
|
|
39
|
+
- **正文與標籤徹底分離**:自動分離真實正文與文末 `#標籤`,有效字數過短或僅有單一 emoji 者直接判定為無實質內容過濾。
|
|
40
|
+
- **標籤農場攔截**:偵測標籤堆砌蹭熱度(Hashtag Spamming),杜絕空洞蹭流量貼文。
|
|
41
|
+
- **正文主題實質核驗**:正文必須切實探討主人喜愛的領域與關鍵詞,禁止僅在文末掛標籤蹭熱度。
|
|
42
|
+
- **負向廣告與垃圾過濾**:自動排除互粉、代購、抽獎、博彩、微商、心靈雞湯與純自拍娛樂等無效內容。
|
|
43
|
+
- **LLM / 語義深度質檢與客製化推坑詞**:結合主人喜好描述,由 LLM 或深度啟發式引擎審查真實主旨,並針對貼文亮點生成專屬真誠推薦詞,在留言區 `@主人`。
|
|
24
44
|
3. **每日探索日報 (Daily Markdown Report)**:
|
|
25
45
|
- 自動將今日瀏覽之所有精選貼文、摘要與推薦紀錄整理為 Markdown 日報。
|
|
26
46
|
- 儲存於 `data/reports/YYYY-MM-DD.md`,可隨時在 Web 面板查看與回溯。
|
|
@@ -119,10 +139,20 @@ curl -X POST http://127.0.0.1:3080/api/instagram/scroll/config \
|
|
|
119
139
|
| 欄位名稱 | 型別 | 預設值 | 說明 |
|
|
120
140
|
| :--- | :--- | :--- | :--- |
|
|
121
141
|
| **`masterUsername`** | string | `""` | 主人的 Instagram 使用者名稱(達標時在留言區 @主人 推薦) |
|
|
122
|
-
| **`
|
|
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"]` | 探索抓取的主題標籤(僅作為探索起點,非推薦唯一標準) |
|
|
123
149
|
| **`personaPrompt`** | string | *預設人設提示詞* | 評估貼文趣味度與撰寫 @主人 推薦語的人設 Prompt |
|
|
124
|
-
| **`minScore`** | number | `
|
|
150
|
+
| **`minScore`** | number | `80` | 推坑門檻分數(0-100,達標才在貼文下留言推薦,提高門檻避免隨便推薦) |
|
|
125
151
|
| **`dailyRecommendCap`** | number | `5` | 每日向主人推坑留言的上限則數(防止過度打擾與風控) |
|
|
152
|
+
| **`maxRecommendsPerRun`**| number | `1` | 單次滾動瀏覽最多推坑留言則數(避免短時間連發觸發官方風控) |
|
|
153
|
+
| **`minPostReadDelaySeconds`** | number | `3` | 每讀取一則貼文前人造擬真閱讀微延遲最小秒數 |
|
|
154
|
+
| **`maxPostReadDelaySeconds`** | number | `7` | 每讀取一則貼文前人造擬真閱讀微延遲最大秒數 |
|
|
155
|
+
| **`cooldownOnBlockMinutes`** | number | `30` | 遇到 Action Block / 頻率限制時自動熔斷暫停分鐘數 |
|
|
126
156
|
| **`scrollIntervalMinutes`**| number | `60` | 自動巡查刷動態牆的時間週期(分鐘) |
|
|
127
157
|
| **`autoScrollEnabled`** | boolean| `true` | 是否啟用背景定時自動刷動態牆任務 |
|
|
128
158
|
| **`likeOnRecommend`** | boolean| `true` | 決定推薦給主人時是否順便對該貼文點讚 |
|
package/client.js
CHANGED
|
@@ -542,13 +542,33 @@ window.__ModuleLoader__.load({
|
|
|
542
542
|
return {
|
|
543
543
|
masterUsername: cleanStr(c.masterUsername, ''),
|
|
544
544
|
interestTags: cleanArr(c.interestTags, ['ai', 'deepseek', 'coding', 'tech', 'gadgets']),
|
|
545
|
-
|
|
546
|
-
|
|
545
|
+
userInterests: cleanStr(
|
|
546
|
+
c.userInterests,
|
|
547
|
+
'專注於前沿 AI 技術 (LLM, Agent, 開源模型)、全端與前端架構、優質開源專案、高效率開發工具、優質 UI/UX 設計或深度乾貨技術解析。偏好乾貨分享、實踐案例與原創見解,不喜歡空洞無物、純蹭熱度、打廣告或純娛樂搞笑的內容。'
|
|
548
|
+
),
|
|
549
|
+
positiveKeywords: cleanArr(c.positiveKeywords, [
|
|
550
|
+
'ai', 'deepseek', 'agent', 'coding', '技術', '前端', '後端', '架構', '開源', '教學', '程式', '開發', '模型', 'github', 'prompt', '演算法', '工具', '實戰', '乾貨',
|
|
551
|
+
]),
|
|
552
|
+
negativeKeywords: cleanArr(c.negativeKeywords, [
|
|
553
|
+
'互粉', '代購', '博彩', '運彩', '兼職', '抽獎', '免費領', '私訊', '點擊連結', '主頁連結', '減肥', '微商', '外匯', '虛擬幣', '心靈雞湯', '穿搭', '搞笑', '自拍', '八卦', '暴富', '躺平', '加盟',
|
|
554
|
+
]),
|
|
555
|
+
minCaptionLength: cleanNum(c.minCaptionLength, 30),
|
|
556
|
+
requireBodyMatch: cleanBool(c.requireBodyMatch, true),
|
|
557
|
+
strictContentCheck: cleanBool(c.strictContentCheck, true),
|
|
558
|
+
personaPrompt: cleanStr(
|
|
559
|
+
c.personaPrompt,
|
|
560
|
+
'你是一位洞察力敏銳、品味高雅的社群特助。請以極高標準評估這篇 Instagram 貼文是否深度符合主人的興趣偏好。若是具備前沿乾貨、創意見解或高實用價值的精選內容,請給出高分評價並撰寫簡短自然、熱情切題的推坑一句話。'
|
|
561
|
+
),
|
|
562
|
+
minScore: cleanNum(c.minScore, 80),
|
|
547
563
|
dailyRecommendCap: cleanNum(c.dailyRecommendCap, 5),
|
|
548
564
|
scrollIntervalMinutes: cleanNum(c.scrollIntervalMinutes, 60),
|
|
549
565
|
autoScrollEnabled: cleanBool(c.autoScrollEnabled, true),
|
|
550
566
|
likeOnRecommend: cleanBool(c.likeOnRecommend, true),
|
|
551
567
|
batchSize: cleanNum(c.batchSize, 15),
|
|
568
|
+
maxRecommendsPerRun: cleanNum(c.maxRecommendsPerRun, 1),
|
|
569
|
+
minPostReadDelaySeconds: cleanNum(c.minPostReadDelaySeconds, 3),
|
|
570
|
+
maxPostReadDelaySeconds: cleanNum(c.maxPostReadDelaySeconds, 7),
|
|
571
|
+
cooldownOnBlockMinutes: cleanNum(c.cooldownOnBlockMinutes, 30),
|
|
552
572
|
}
|
|
553
573
|
}
|
|
554
574
|
|
|
@@ -563,6 +583,20 @@ window.__ModuleLoader__.load({
|
|
|
563
583
|
const [runningRound, setRunningRound] = useState(false)
|
|
564
584
|
const [msg, setMsg] = useState(null)
|
|
565
585
|
|
|
586
|
+
// 獨立字串狀態:解決 input 鍵入逗號與空格被 React 重新格式化吃掉的問題
|
|
587
|
+
const [tagsInputText, setTagsInputText] = useState('')
|
|
588
|
+
const [positiveWordsText, setPositiveWordsText] = useState('')
|
|
589
|
+
const [negativeWordsText, setNegativeWordsText] = useState('')
|
|
590
|
+
|
|
591
|
+
const parseListFromText = (text, isTag = false) => {
|
|
592
|
+
if (typeof text !== 'string') return []
|
|
593
|
+
return text
|
|
594
|
+
.split(/[,,\n]+/)
|
|
595
|
+
.map((s) => s.trim())
|
|
596
|
+
.map((s) => (isTag ? s.replace(/^#/, '') : s))
|
|
597
|
+
.filter(Boolean)
|
|
598
|
+
}
|
|
599
|
+
|
|
566
600
|
const refresh = async () => {
|
|
567
601
|
try {
|
|
568
602
|
const [cfgRes, statusRes, reportRes, mcpRes] = await Promise.all([
|
|
@@ -573,7 +607,13 @@ window.__ModuleLoader__.load({
|
|
|
573
607
|
.then((r) => r.json())
|
|
574
608
|
.catch(() => null),
|
|
575
609
|
])
|
|
576
|
-
if (cfgRes?.ok)
|
|
610
|
+
if (cfgRes?.ok) {
|
|
611
|
+
const loaded = normalizeScrollConfig(cfgRes.config)
|
|
612
|
+
setCfg(loaded)
|
|
613
|
+
setTagsInputText(loaded.interestTags.join(', '))
|
|
614
|
+
setPositiveWordsText(loaded.positiveKeywords.join(', '))
|
|
615
|
+
setNegativeWordsText(loaded.negativeKeywords.join(', '))
|
|
616
|
+
}
|
|
577
617
|
if (statusRes?.ok) setStatus(statusRes)
|
|
578
618
|
if (reportRes?.ok) setReport(reportRes.report || '')
|
|
579
619
|
if (mcpRes?.ok) setMcpStatus(mcpRes)
|
|
@@ -594,10 +634,19 @@ window.__ModuleLoader__.load({
|
|
|
594
634
|
setSaving(true)
|
|
595
635
|
setMsg(null)
|
|
596
636
|
try {
|
|
597
|
-
const cleanPayload =
|
|
637
|
+
const cleanPayload = {
|
|
638
|
+
...normalizeScrollConfig(cfg),
|
|
639
|
+
interestTags: parseListFromText(tagsInputText, true),
|
|
640
|
+
positiveKeywords: parseListFromText(positiveWordsText, false),
|
|
641
|
+
negativeKeywords: parseListFromText(negativeWordsText, false),
|
|
642
|
+
}
|
|
598
643
|
const res = await jpost('/config', cleanPayload)
|
|
599
644
|
if (res?.ok) {
|
|
600
|
-
|
|
645
|
+
const saved = normalizeScrollConfig(res.config)
|
|
646
|
+
setCfg(saved)
|
|
647
|
+
setTagsInputText(saved.interestTags.join(', '))
|
|
648
|
+
setPositiveWordsText(saved.positiveKeywords.join(', '))
|
|
649
|
+
setNegativeWordsText(saved.negativeKeywords.join(', '))
|
|
601
650
|
setMsg('✅ 滾動推坑設定已成功保存!')
|
|
602
651
|
}
|
|
603
652
|
} catch (e) {
|
|
@@ -895,21 +944,128 @@ window.__ModuleLoader__.load({
|
|
|
895
944
|
h('div', { className: 'ig-scr-hint' }, '發現值得推薦的貼文/影片時,會在留言區 @ 此帳號進行推薦')
|
|
896
945
|
),
|
|
897
946
|
|
|
947
|
+
// 正文實質內容審查開關
|
|
948
|
+
h(
|
|
949
|
+
'div',
|
|
950
|
+
{ className: 'ig-scr-switch' },
|
|
951
|
+
h(
|
|
952
|
+
'div',
|
|
953
|
+
{ className: 'ig-scr-switch-text' },
|
|
954
|
+
h('div', { className: 'ig-scr-switch-name' }, '🛡️ 啟用 @ 前正文內容深度審查'),
|
|
955
|
+
h('div', { className: 'ig-scr-hint' }, '拒絕隨便推薦!留言 @ 主人前深度檢查正文實質乾貨與品質,剔除純圖廢文與空洞標籤')
|
|
956
|
+
),
|
|
957
|
+
h(
|
|
958
|
+
'button',
|
|
959
|
+
{
|
|
960
|
+
className: `ig-scr-toggle ${cfg.strictContentCheck ? 'on' : ''}`,
|
|
961
|
+
onClick: () => updateField('strictContentCheck', !cfg.strictContentCheck),
|
|
962
|
+
},
|
|
963
|
+
h('span', { className: 'ig-scr-toggle-thumb' })
|
|
964
|
+
)
|
|
965
|
+
),
|
|
966
|
+
|
|
967
|
+
// 正文實質命中開關
|
|
968
|
+
h(
|
|
969
|
+
'div',
|
|
970
|
+
{ className: 'ig-scr-switch' },
|
|
971
|
+
h(
|
|
972
|
+
'div',
|
|
973
|
+
{ className: 'ig-scr-switch-text' },
|
|
974
|
+
h('div', { className: 'ig-scr-switch-name' }, '🔍 正文必須實質討論偏好主題 (拒絕僅在 tag 蹭熱度)'),
|
|
975
|
+
h('div', { className: 'ig-scr-hint' }, '關鍵詞必須在正文中真正出現;若僅在文末堆砌 #標籤 則視為標籤農場直接過濾')
|
|
976
|
+
),
|
|
977
|
+
h(
|
|
978
|
+
'button',
|
|
979
|
+
{
|
|
980
|
+
className: `ig-scr-toggle ${cfg.requireBodyMatch ? 'on' : ''}`,
|
|
981
|
+
onClick: () => updateField('requireBodyMatch', !cfg.requireBodyMatch),
|
|
982
|
+
},
|
|
983
|
+
h('span', { className: 'ig-scr-toggle-thumb' })
|
|
984
|
+
)
|
|
985
|
+
),
|
|
986
|
+
|
|
987
|
+
// 主人喜歡的內容風格與偏好詳述
|
|
988
|
+
h(
|
|
989
|
+
'div',
|
|
990
|
+
{ className: 'ig-scr-field' },
|
|
991
|
+
h('label', { className: 'ig-scr-label' }, '💎 主人喜歡的內容風格與領域詳述 (User Interests)'),
|
|
992
|
+
h('textarea', {
|
|
993
|
+
className: 'ig-scr-textarea',
|
|
994
|
+
style: { minHeight: '75px' },
|
|
995
|
+
value: cleanStr(cfg.userInterests),
|
|
996
|
+
placeholder: '詳細描述您喜歡的貼文類型、技術領域、內容風格與乾貨要求...',
|
|
997
|
+
onChange: (e) => updateField('userInterests', e.target.value),
|
|
998
|
+
}),
|
|
999
|
+
h('div', { className: 'ig-scr-hint' }, 'AI 將依據此描述深度比對正文語義,確保推薦完全符合您的個人品味與需求')
|
|
1000
|
+
),
|
|
1001
|
+
|
|
1002
|
+
// 正向關鍵字
|
|
898
1003
|
h(
|
|
899
1004
|
'div',
|
|
900
1005
|
{ className: 'ig-scr-field' },
|
|
901
|
-
h('label', { className: 'ig-scr-label' }, '
|
|
1006
|
+
h('label', { className: 'ig-scr-label' }, '✨ 正文正向領域關鍵字 (Positive Keywords)'),
|
|
902
1007
|
h('input', {
|
|
903
1008
|
className: 'ig-scr-input',
|
|
904
|
-
value:
|
|
905
|
-
placeholder: 'ai, deepseek, coding,
|
|
906
|
-
onChange: (e) =>
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
1009
|
+
value: positiveWordsText,
|
|
1010
|
+
placeholder: 'ai, deepseek, coding, 前端, 架構, 開源, 教學, 工具',
|
|
1011
|
+
onChange: (e) => {
|
|
1012
|
+
const raw = e.target.value
|
|
1013
|
+
setPositiveWordsText(raw)
|
|
1014
|
+
updateField('positiveKeywords', parseListFromText(raw, false))
|
|
1015
|
+
},
|
|
911
1016
|
}),
|
|
912
|
-
h('div', { className: 'ig-scr-hint' }, '
|
|
1017
|
+
h('div', { className: 'ig-scr-hint' }, '正文實質提及這些關鍵詞或相關領域時給予高權重加分')
|
|
1018
|
+
),
|
|
1019
|
+
|
|
1020
|
+
// 負向排除詞
|
|
1021
|
+
h(
|
|
1022
|
+
'div',
|
|
1023
|
+
{ className: 'ig-scr-field' },
|
|
1024
|
+
h('label', { className: 'ig-scr-label' }, '🚫 負向排除關鍵字 (Negative Keywords / Anti-Spam)'),
|
|
1025
|
+
h('input', {
|
|
1026
|
+
className: 'ig-scr-input',
|
|
1027
|
+
value: negativeWordsText,
|
|
1028
|
+
placeholder: '互粉, 代購, 博彩, 抽獎, 微商, 減肥, 穿搭, 搞笑, 自拍',
|
|
1029
|
+
onChange: (e) => {
|
|
1030
|
+
const raw = e.target.value
|
|
1031
|
+
setNegativeWordsText(raw)
|
|
1032
|
+
updateField('negativeKeywords', parseListFromText(raw, false))
|
|
1033
|
+
},
|
|
1034
|
+
}),
|
|
1035
|
+
h('div', { className: 'ig-scr-hint' }, '命中任一排除詞直接判定不合格,杜絕廣告宣傳、抽獎促銷與無意義廢文')
|
|
1036
|
+
),
|
|
1037
|
+
|
|
1038
|
+
h(
|
|
1039
|
+
'div',
|
|
1040
|
+
{ className: 'ig-scr-grid-2' },
|
|
1041
|
+
h(
|
|
1042
|
+
'div',
|
|
1043
|
+
{ className: 'ig-scr-field' },
|
|
1044
|
+
h('label', { className: 'ig-scr-label' }, '🏷️ 探索主題標籤 (Interest Tags)'),
|
|
1045
|
+
h('input', {
|
|
1046
|
+
className: 'ig-scr-input',
|
|
1047
|
+
value: tagsInputText,
|
|
1048
|
+
placeholder: 'ai, deepseek, coding, tech, gadgets',
|
|
1049
|
+
onChange: (e) => {
|
|
1050
|
+
const raw = e.target.value
|
|
1051
|
+
setTagsInputText(raw)
|
|
1052
|
+
updateField('interestTags', parseListFromText(raw, true))
|
|
1053
|
+
},
|
|
1054
|
+
}),
|
|
1055
|
+
h('div', { className: 'ig-scr-hint' }, '探索抓取起點標籤 (非推薦唯一標準,支援空格與中英文逗號)')
|
|
1056
|
+
),
|
|
1057
|
+
h(
|
|
1058
|
+
'div',
|
|
1059
|
+
{ className: 'ig-scr-field' },
|
|
1060
|
+
h('label', { className: 'ig-scr-label' }, '📏 正文有效文字最小長度 (字數)'),
|
|
1061
|
+
h('input', {
|
|
1062
|
+
type: 'number',
|
|
1063
|
+
className: 'ig-scr-input',
|
|
1064
|
+
value: cfg.minCaptionLength ?? 30,
|
|
1065
|
+
onChange: (e) => updateField('minCaptionLength', Number(e.target.value)),
|
|
1066
|
+
}),
|
|
1067
|
+
h('div', { className: 'ig-scr-hint' }, '扣除 #標籤 後的正文字數門檻')
|
|
1068
|
+
)
|
|
913
1069
|
),
|
|
914
1070
|
|
|
915
1071
|
h(
|
|
@@ -1017,7 +1173,7 @@ window.__ModuleLoader__.load({
|
|
|
1017
1173
|
h('input', {
|
|
1018
1174
|
type: 'number',
|
|
1019
1175
|
className: 'ig-scr-input',
|
|
1020
|
-
value: cfg.minScore ??
|
|
1176
|
+
value: cfg.minScore ?? 80,
|
|
1021
1177
|
onChange: (e) => updateField('minScore', Number(e.target.value)),
|
|
1022
1178
|
}),
|
|
1023
1179
|
h('div', { className: 'ig-scr-hint' }, '高於此分數的貼文才會在留言區 @主人')
|
package/dist/config.d.ts
CHANGED
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
export interface InstagramScrollConfig {
|
|
5
5
|
masterUsername?: string;
|
|
6
6
|
interestTags?: string[];
|
|
7
|
+
userInterests?: string;
|
|
8
|
+
positiveKeywords?: string[];
|
|
9
|
+
negativeKeywords?: string[];
|
|
10
|
+
minCaptionLength?: number;
|
|
11
|
+
requireBodyMatch?: boolean;
|
|
12
|
+
strictContentCheck?: boolean;
|
|
7
13
|
personaPrompt?: string;
|
|
8
14
|
minScore?: number;
|
|
9
15
|
dailyRecommendCap?: number;
|
|
@@ -11,6 +17,10 @@ export interface InstagramScrollConfig {
|
|
|
11
17
|
autoScrollEnabled?: boolean;
|
|
12
18
|
likeOnRecommend?: boolean;
|
|
13
19
|
batchSize?: number;
|
|
20
|
+
maxRecommendsPerRun?: number;
|
|
21
|
+
minPostReadDelaySeconds?: number;
|
|
22
|
+
maxPostReadDelaySeconds?: number;
|
|
23
|
+
cooldownOnBlockMinutes?: number;
|
|
14
24
|
}
|
|
15
25
|
export declare const defaultScrollConfig: InstagramScrollConfig;
|
|
16
26
|
export declare function unwrapScrollValue<T>(val: any, fallback: T): T;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/config.js
CHANGED
|
@@ -4,13 +4,66 @@
|
|
|
4
4
|
export const defaultScrollConfig = {
|
|
5
5
|
masterUsername: '',
|
|
6
6
|
interestTags: ['ai', 'deepseek', 'coding', 'tech', 'gadgets'],
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
userInterests: '專注於前沿 AI 技術 (LLM, Agent, 開源模型)、全端與前端架構、優質開源專案、高效率開發工具、優質 UI/UX 設計或深度乾貨技術解析。偏好乾貨分享、實踐案例與原創見解,不喜歡空洞無物、純蹭熱度、打廣告或純娛樂搞笑的內容。',
|
|
8
|
+
positiveKeywords: [
|
|
9
|
+
'ai',
|
|
10
|
+
'deepseek',
|
|
11
|
+
'agent',
|
|
12
|
+
'coding',
|
|
13
|
+
'技術',
|
|
14
|
+
'前端',
|
|
15
|
+
'後端',
|
|
16
|
+
'架構',
|
|
17
|
+
'開源',
|
|
18
|
+
'教學',
|
|
19
|
+
'程式',
|
|
20
|
+
'開發',
|
|
21
|
+
'模型',
|
|
22
|
+
'github',
|
|
23
|
+
'prompt',
|
|
24
|
+
'演算法',
|
|
25
|
+
'工具',
|
|
26
|
+
'實戰',
|
|
27
|
+
'乾貨',
|
|
28
|
+
],
|
|
29
|
+
negativeKeywords: [
|
|
30
|
+
'互粉',
|
|
31
|
+
'代購',
|
|
32
|
+
'博彩',
|
|
33
|
+
'運彩',
|
|
34
|
+
'兼職',
|
|
35
|
+
'抽獎',
|
|
36
|
+
'免費領',
|
|
37
|
+
'私訊',
|
|
38
|
+
'點擊連結',
|
|
39
|
+
'主頁連結',
|
|
40
|
+
'減肥',
|
|
41
|
+
'微商',
|
|
42
|
+
'外匯',
|
|
43
|
+
'虛擬幣',
|
|
44
|
+
'心靈雞湯',
|
|
45
|
+
'穿搭',
|
|
46
|
+
'搞笑',
|
|
47
|
+
'自拍',
|
|
48
|
+
'八卦',
|
|
49
|
+
'暴富',
|
|
50
|
+
'躺平',
|
|
51
|
+
'加盟',
|
|
52
|
+
],
|
|
53
|
+
minCaptionLength: 30,
|
|
54
|
+
requireBodyMatch: true,
|
|
55
|
+
strictContentCheck: true,
|
|
56
|
+
personaPrompt: '你是一位洞察力敏銳、品味高雅的社群特助。請以極高標準評估這篇 Instagram 貼文是否深度符合主人的興趣偏好。若是具備前沿乾貨、創意見解或高實用價值的精選內容,請給出高分評價並撰寫簡短自然、熱情切題的推坑一句話。',
|
|
57
|
+
minScore: 80,
|
|
9
58
|
dailyRecommendCap: 5,
|
|
10
59
|
scrollIntervalMinutes: 60,
|
|
11
60
|
autoScrollEnabled: true,
|
|
12
61
|
likeOnRecommend: true,
|
|
13
62
|
batchSize: 15,
|
|
63
|
+
maxRecommendsPerRun: 1,
|
|
64
|
+
minPostReadDelaySeconds: 3,
|
|
65
|
+
maxPostReadDelaySeconds: 7,
|
|
66
|
+
cooldownOnBlockMinutes: 30,
|
|
14
67
|
};
|
|
15
68
|
export function unwrapScrollValue(val, fallback) {
|
|
16
69
|
if (val === null || val === undefined)
|
|
@@ -26,18 +79,37 @@ export function unwrapScrollValue(val, fallback) {
|
|
|
26
79
|
}
|
|
27
80
|
return val;
|
|
28
81
|
}
|
|
82
|
+
function parseListValue(val, fallback = []) {
|
|
83
|
+
if (Array.isArray(val)) {
|
|
84
|
+
return val.map((s) => String(s || '').trim()).filter(Boolean);
|
|
85
|
+
}
|
|
86
|
+
if (typeof val === 'string') {
|
|
87
|
+
return val.split(/[,,\n]+/).map((s) => s.trim().replace(/^#/, '')).filter(Boolean);
|
|
88
|
+
}
|
|
89
|
+
return fallback;
|
|
90
|
+
}
|
|
29
91
|
export function sanitizeScrollConfig(raw) {
|
|
30
92
|
const c = raw || {};
|
|
31
93
|
return {
|
|
32
94
|
masterUsername: unwrapScrollValue(c.masterUsername, defaultScrollConfig.masterUsername || ''),
|
|
33
|
-
interestTags:
|
|
95
|
+
interestTags: parseListValue(c.interestTags, defaultScrollConfig.interestTags || []),
|
|
96
|
+
userInterests: unwrapScrollValue(c.userInterests, defaultScrollConfig.userInterests || ''),
|
|
97
|
+
positiveKeywords: parseListValue(c.positiveKeywords, defaultScrollConfig.positiveKeywords || []),
|
|
98
|
+
negativeKeywords: parseListValue(c.negativeKeywords, defaultScrollConfig.negativeKeywords || []),
|
|
99
|
+
minCaptionLength: unwrapScrollValue(c.minCaptionLength, defaultScrollConfig.minCaptionLength || 30),
|
|
100
|
+
requireBodyMatch: unwrapScrollValue(c.requireBodyMatch, defaultScrollConfig.requireBodyMatch ?? true),
|
|
101
|
+
strictContentCheck: unwrapScrollValue(c.strictContentCheck, defaultScrollConfig.strictContentCheck ?? true),
|
|
34
102
|
personaPrompt: unwrapScrollValue(c.personaPrompt, defaultScrollConfig.personaPrompt || ''),
|
|
35
|
-
minScore: unwrapScrollValue(c.minScore, defaultScrollConfig.minScore ||
|
|
103
|
+
minScore: unwrapScrollValue(c.minScore, defaultScrollConfig.minScore || 80),
|
|
36
104
|
dailyRecommendCap: unwrapScrollValue(c.dailyRecommendCap, defaultScrollConfig.dailyRecommendCap || 5),
|
|
37
105
|
scrollIntervalMinutes: unwrapScrollValue(c.scrollIntervalMinutes, defaultScrollConfig.scrollIntervalMinutes || 60),
|
|
38
106
|
autoScrollEnabled: unwrapScrollValue(c.autoScrollEnabled, defaultScrollConfig.autoScrollEnabled ?? true),
|
|
39
107
|
likeOnRecommend: unwrapScrollValue(c.likeOnRecommend, defaultScrollConfig.likeOnRecommend ?? true),
|
|
40
108
|
batchSize: unwrapScrollValue(c.batchSize, defaultScrollConfig.batchSize || 15),
|
|
109
|
+
maxRecommendsPerRun: unwrapScrollValue(c.maxRecommendsPerRun, defaultScrollConfig.maxRecommendsPerRun || 1),
|
|
110
|
+
minPostReadDelaySeconds: unwrapScrollValue(c.minPostReadDelaySeconds, defaultScrollConfig.minPostReadDelaySeconds || 3),
|
|
111
|
+
maxPostReadDelaySeconds: unwrapScrollValue(c.maxPostReadDelaySeconds, defaultScrollConfig.maxPostReadDelaySeconds || 7),
|
|
112
|
+
cooldownOnBlockMinutes: unwrapScrollValue(c.cooldownOnBlockMinutes, defaultScrollConfig.cooldownOnBlockMinutes || 30),
|
|
41
113
|
};
|
|
42
114
|
}
|
|
43
115
|
export function buildScrollConfigSchema(z) {
|
|
@@ -48,16 +120,40 @@ export function buildScrollConfigSchema(z) {
|
|
|
48
120
|
.description('主人的 Instagram 使用者名稱 (發現好文時將在留言區 @主人推薦)'),
|
|
49
121
|
interestTags: z
|
|
50
122
|
.array(z.string())
|
|
51
|
-
.default(['ai', 'deepseek', 'coding', 'tech'])
|
|
52
|
-
.description('
|
|
123
|
+
.default(['ai', 'deepseek', 'coding', 'tech', 'gadgets'])
|
|
124
|
+
.description('探索的主題標籤清單 (僅用於初步探索抓取,不作為推薦唯一判斷依據)'),
|
|
125
|
+
userInterests: z
|
|
126
|
+
.string()
|
|
127
|
+
.default(defaultScrollConfig.userInterests)
|
|
128
|
+
.description('主人喜歡的內容風格與領域詳細描述 (AI 將依此深度審查貼文實質內容)'),
|
|
129
|
+
positiveKeywords: z
|
|
130
|
+
.array(z.string())
|
|
131
|
+
.default(defaultScrollConfig.positiveKeywords)
|
|
132
|
+
.description('正文必須討論或偏好的正面核心關鍵字清單'),
|
|
133
|
+
negativeKeywords: z
|
|
134
|
+
.array(z.string())
|
|
135
|
+
.default(defaultScrollConfig.negativeKeywords)
|
|
136
|
+
.description('負向排除關鍵字 (命中時直接拒絕推薦,避免廣告、抽獎或廢文)'),
|
|
137
|
+
minCaptionLength: z
|
|
138
|
+
.number()
|
|
139
|
+
.default(30)
|
|
140
|
+
.description('正文有效文字最小字數要求 (扣除 #標籤 後,過短或無實質內容者直接過濾)'),
|
|
141
|
+
requireBodyMatch: z
|
|
142
|
+
.boolean()
|
|
143
|
+
.default(true)
|
|
144
|
+
.description('正文實質內容必須命中主人偏好主題 (拒絕僅在文末蹭 tag 的貼文)'),
|
|
145
|
+
strictContentCheck: z
|
|
146
|
+
.boolean()
|
|
147
|
+
.default(true)
|
|
148
|
+
.description('啟用嚴格內容審查機制 (結合 LLM / 正文語義深度質檢)'),
|
|
53
149
|
personaPrompt: z
|
|
54
150
|
.string()
|
|
55
151
|
.default(defaultScrollConfig.personaPrompt)
|
|
56
152
|
.description('評估貼文趣味度與撰寫 @主人推薦語的人設提示詞'),
|
|
57
153
|
minScore: z
|
|
58
154
|
.number()
|
|
59
|
-
.default(
|
|
60
|
-
.description('推坑門檻分數 (0-100,達標才在貼文下留言
|
|
155
|
+
.default(80)
|
|
156
|
+
.description('推坑門檻分數 (0-100,達標才在貼文下留言 @主人,避免隨便推薦)'),
|
|
61
157
|
dailyRecommendCap: z
|
|
62
158
|
.number()
|
|
63
159
|
.default(5)
|
|
@@ -78,6 +174,22 @@ export function buildScrollConfigSchema(z) {
|
|
|
78
174
|
.number()
|
|
79
175
|
.default(15)
|
|
80
176
|
.description('每輪滾動瀏覽抓取的貼文筆數 (10-30)'),
|
|
177
|
+
maxRecommendsPerRun: z
|
|
178
|
+
.number()
|
|
179
|
+
.default(1)
|
|
180
|
+
.description('單次滾動瀏覽最多推坑留言則數 (避免短時間連發觸發官方風控)'),
|
|
181
|
+
minPostReadDelaySeconds: z
|
|
182
|
+
.number()
|
|
183
|
+
.default(3)
|
|
184
|
+
.description('每掃描一則貼文前人造擬真閱讀微延遲最小秒數'),
|
|
185
|
+
maxPostReadDelaySeconds: z
|
|
186
|
+
.number()
|
|
187
|
+
.default(7)
|
|
188
|
+
.description('每掃描一則貼文前人造擬真閱讀微延遲最大秒數'),
|
|
189
|
+
cooldownOnBlockMinutes: z
|
|
190
|
+
.number()
|
|
191
|
+
.default(30)
|
|
192
|
+
.description('遇到 Action Block / 頻率限制時自動熔斷暫停分鐘數'),
|
|
81
193
|
});
|
|
82
194
|
}
|
|
83
195
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|