DSH Discord 帳號助理
by Raxytw
README.md
# DSH Discord 帳號助理與 MCP 插件 (`@luoyi-dsh/discord-plugin`)

> 專為 **Discord 使用者個人帳號(User Account / Selfbot)** 量身打造的智慧助理與 Model Context Protocol (MCP) 服務外掛。
> 支援 DeepSeek Harness (DSH) 系統生態,具備「**被提及/引用/私訊智慧代回**」與「**群組即時穿插搭話**」雙大主動運作引擎,並提供文字訊息、圖片、文件檔案、貼圖與表情反應等全功能 13 項 MCP 操作工具集。
---
## 🚀 安裝方式
支援以下兩種安裝方式,可依您的使用情境選擇:
### 方式 1:透過 DSH 插件指令安裝(推薦)
```bash
dsh plugin --profile web add @luoyi-dsh/discord-plugin
```
### 方式 2:透過 NPM 安裝
```bash
npm install @luoyi-dsh/discord-plugin
```
---
## 🌟 核心特色
1. **使用者個人帳號驅動 (User Account / Selfbot)**:
- 使用使用者授權 Token (Authorization Token),非官方機器人 Bot Token。
- 保持真人帳號身分在線(支援在線、閒置、請勿打擾、隱身)。
- 支援 HTTP / SOCKS5 代理伺服器連線。
2. **智慧代回引擎 (Mention, Quote & DM Assistant)**:
- **被 @提及 或引用回覆**:主動收集近期上下文對話,推理後以帳號身分友善代回。
- **私訊 (Direct Message) 雙向應答**:收到私訊時自動研判並回覆。
- **Round Cap 防死循環上限**:限制單一對象連續回覆輪數,避免機器人間無窮遞迴。
3. **群組穿插搭話 (Autonomous Co-Chatting)**:
- **即時 Gateway 監聽**:維護各頻道之滾動對話緩衝區 (Buffer)。
- **智慧插嘴機制**:綜合關鍵字興趣、提問探測、隨機率與頻道獨立冷卻時間,自然融入大家的話題。
- **`[NO_REPLY]` 自覺放棄**:由模型自發判斷若對話過於嚴肅或私密則自動放棄插話。
4. **防封號安全機制 (Anti-Ban Protections)**:
- **擬真人打字指示 (`sendTyping`)**:發送前模擬真人正在輸入中。
- **隨機 Jitter 延遲**:模擬真人思考與打字所需之 2~5 秒隨機間隔。
- **黑白名單與每日發言配額限制**:防止超量互動引發風控。
5. **DSH Web 瀏覽器端高質感設定介面 (`client.js`)**:
- 遵循 `.agents/skills/design-taste-frontend` 規範,具備連線狀態卡片、Token 編輯、即時測試發送器與今日互動統計。
---
## 📁 模組目錄架構
本外掛採用完全解耦的執行期動態初始化架構,不依賴任何隨套件分發的靜態資料檔:
```text
dsh-discord-plugin/
├── assets/
│ └── banner.png # 專案橫幅圖示
├── client.js # DSH Web 前端面板 (連線、代回、穿插閒聊、即時測試)
├── cordis.patch.yml # DSH bundle patch 外掛宣告
├── package.json # 模組定義 (discord.js-selfbot-v13, @modelcontextprotocol/sdk)
├── tsconfig.json # TypeScript ES2022 / NodeNext 編譯設定
├── data/ # 【執行期動態建立,不進 Git / NPM】
│ ├── config.json # 本地設定檔 (初次啟動自動產生)
│ └── ledger.json # 去重、Round Cap 輪數、每日統計帳本 (自動初始化)
└── src/
├── index.ts # Cordis 外掛入口、Gateway 監聽調度與 REST API
├── config.ts # Schemastery 設定模型與預設值過濾
├── types.ts # 型態宣告 (連線狀態、訊息緩衝、配置參數)
├── mcp-server.ts # 獨立 MCP Stdio 伺服器入口
├── lib/
│ ├── discordClient.ts # Selfbot 核心控制器 (WebSocket 連線、發言、發圖、發貼圖)
│ ├── ledger.ts # 狀態帳本與冷卻時間管理器
│ ├── llm.ts # 統一 LLM 調用 (DSH ctx.llm 優先 + 外部 API 備援)
│ └── hostdeps.ts # DSH 宿主相容層
├── duty/
│ ├── mentionReply.ts # 被 @ 提及、引用回覆與私訊智慧代回任務
│ └── autoChat.ts # 群組即時穿插搭話任務 (Co-Chatting)
└── tools/
└── discordTools.ts # 13 項 Discord MCP 標準操作工具集
```
---
## 🛠️ 13 項 Discord MCP 標準操作工具清單
| 工具名稱 | 類型 | 說明 | 主要參數 |
| :--- | :--- | :--- | :--- |
| **`discord_check_status`** | 狀態查詢 | 檢查目前使用者帳號連線狀態、用戶資訊、Ping 延遲與今日互動統計。 | 無 |
| **`discord_login`** | 帳號認證 | 連線或切換使用者 Token (支援 Proxy)。 | `token` (必填), `proxy_url` (選填) |
| **`discord_send_message`** | 發送文字 | **傳文字/簡訊**:發送訊息至指定頻道 ID 或使用者 ID(發送私訊)。 | `channel_id`, `content`, `simulate_typing` |
| **`discord_reply_message`**| 指定回覆 | **引用回覆**:以 Discord 引用格式指定回覆特定訊息 ID。 | `channel_id`, `message_id`, `content`, `mention` |
| **`discord_send_image`** | 發送圖片 | **傳圖片**:發送圖片(支援本機檔案絕對/相對路徑或網路圖片 URL,支援圖說)。 | `channel_id`, `image_path_or_url`, `caption` |
| **`discord_send_file`** | 發送附件 | **傳文件**:發送 PDF、Word、程式碼檔案、ZIP 壓縮檔等文件附件。 | `channel_id`, `file_path`, `content` |
| **`discord_send_sticker`** | 發送貼圖 | **發貼圖**:在頻道中發送指定貼圖 (Sticker)。 | `channel_id`, `sticker_id` |
| **`discord_add_reaction`** | 表情反應 | 為指定訊息添加 Emoji 表情反應(👍、❤️、🔥 等)。 | `channel_id`, `message_id`, `emoji` |
| **`discord_get_messages`** | 訊息讀取 | **讀取聊天訊息**:獲取特定頻道或私訊對話之最新歷史紀錄。 | `channel_id`, `limit` (預設 15,最大 50) |
| **`discord_list_guilds`** | 伺服器查詢 | 列出此帳號已加入的所有伺服器清單。 | 無 |
| **`discord_list_channels`**| 頻道查詢 | 列出伺服器內所有可發言的文字頻道清單。 | `guild_id` (選填) |
| **`discord_list_dms`** | 私訊查詢 | 列出最近開啟之私訊對象清單。 | 無 |
| **`discord_search_stickers`**| 貼圖搜尋 | 搜尋此帳號加入之伺服器內可用的貼圖清單。 | `query` (選填關鍵字) |
---
## 💻 工具調用方式 (How to Call Tools)
本插件提供 **4 種靈活的調用方式**:
### 方式一:在 DSH / AI 對話中自然語言調用(最常用)
只要在 DSH 提示詞中以自然語言發出指令,主模型便會自動比對並調用對應的 MCP 工具:
```text
💬 範例 1:發送文字訊息 / 簡訊
「請幫我傳送一則 Discord 訊息到頻道 123456789012345678,內容是:『大家好,我已經上線了!』」
-> AI 將自動調用:discord_send_message(channel_id="123456789012345678", content="大家好,我已經上線了!")
💬 範例 2:傳送本機或網路圖片
「請幫我把圖片 C:/photos/banner.png 傳到 Discord 頻道 123456789012345678,附帶圖說:『新版本架構圖』」
-> AI 將自動調用:discord_send_image(channel_id="123456789012345678", image_path_or_url="C:/photos/banner.png", caption="新版本架構圖")
💬 範例 3:傳送文件 / PDF 檔案
「請將 C:/documents/report.pdf 文件傳送給 Discord 頻道 123456789012345678」
-> AI 將自動調用:discord_send_file(channel_id="123456789012345678", file_path="C:/documents/report.pdf", content="今日測試報告")
💬 範例 4:讀取頻道歷史訊息並總結
「請幫我查看 Discord 頻道 123456789012345678 最近 15 則訊息,並告訴我大家剛才在討論什麼?」
-> AI 將自動調用:discord_get_messages(channel_id="123456789012345678", limit=15) -> 閱讀後向您總結討論重點
💬 範例 5:指定回覆與貼圖表情
「請回覆訊息 998877665544332211 說:『收到!馬上處理』,順便在該訊息按個 👍」
-> AI 將自動調用:
1. discord_reply_message(channel_id="...", message_id="998877665544332211", content="收到!馬上處理")
2. discord_add_reaction(channel_id="...", message_id="998877665544332211", emoji="👍")
```
---
### 方式二:標準 MCP 協議 (JSON-RPC) 調用
若在 Claude Desktop、Cursor、Gemini 或以程式透過 Stdio 連線時,發送標準的 `tools/call` JSON 請求:
#### 1. 發送文字訊息 (`discord_send_message`)
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "discord_send_message",
"arguments": {
"channel_id": "123456789012345678",
"content": "哈囉!這是一則來自 MCP 的自動化發言。",
"simulate_typing": true
}
}
}
```
#### 2. 發送圖片 (`discord_send_image`)
```json
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "discord_send_image",
"arguments": {
"channel_id": "123456789012345678",
"image_path_or_url": "C:/images/screenshot.png",
"caption": "截圖說明"
}
}
}
```
#### 3. 發送文件/附件 (`discord_send_file`)
```json
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "discord_send_file",
"arguments": {
"channel_id": "123456789012345678",
"file_path": "C:/data/export.zip",
"content": "導出的資料壓縮包"
}
}
}
```
#### 4. 發送貼圖 (`discord_send_sticker`)
```json
{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "discord_send_sticker",
"arguments": {
"channel_id": "123456789012345678",
"sticker_id": "749054660769218631"
}
}
}
```
#### 5. 讀取聊天紀錄 (`discord_get_messages`)
```json
{
"jsonrpc": "2.0",
"id": 5,
"method": "tools/call",
"params": {
"name": "discord_get_messages",
"arguments": {
"channel_id": "123456789012345678",
"limit": 10
}
}
}
```
---
### 方式三:透過 HTTP REST API 調用 (DSH Web 路由)
> 💡 **提示**:DSH Web 預設埠為 **3080**。若啟動時帶了 `--port` 參數,請改用實際埠號。
#### 1. 發送文字 / 圖片 / 文件 / 貼圖 (`POST /api/discord/send`)
- **發送文字**:
```bash
curl -X POST http://127.0.0.1:3080/api/discord/send \
-H "Content-Type: application/json" \
-d '{
"channelId": "123456789012345678",
"type": "text",
"content": "透過 REST API 發送的訊息"
}'
```
- **發送圖片**:
```bash
curl -X POST http://127.0.0.1:3080/api/discord/send \
-H "Content-Type: application/json" \
-d '{
"channelId": "123456789012345678",
"type": "image",
"imagePath": "C:/images/test.png",
"content": "附帶圖片說明"
}'
```
- **發送貼圖**:
```bash
curl -X POST http://127.0.0.1:3080/api/discord/send \
-H "Content-Type: application/json" \
-d '{
"channelId": "123456789012345678",
"type": "sticker",
"stickerId": "749054660769218631"
}'
```
#### 2. 獲取特定頻道訊息歷史 (`GET /api/discord/messages`)
```bash
curl "http://127.0.0.1:3080/api/discord/messages?channelId=123456789012345678&limit=15"
```
#### 3. 獲取當前連線狀態與今日發言統計 (`GET /api/discord/status`)
```bash
curl http://127.0.0.1:3080/api/discord/status
```
---
### 方式四:在 TypeScript / Node.js 程式碼中調用
在其他 DSH 外掛或自訂模組中,直接引入單例客戶端執行操作:
```typescript
import { getSharedDiscordClient } from '@luoyi-dsh/discord-plugin'
const client = getSharedDiscordClient()
if (client && client.isReady) {
// 1. 發送訊息
await client.sendMessage('123456789012345678', 'Hello World!')
// 2. 發送圖片
await client.sendImage('123456789012345678', 'C:/pic.png', '看這張圖')
// 3. 讀取最近歷史訊息
const history = await client.getMessages('123456789012345678', 10)
console.log('歷史訊息:', history.messages)
}
```
---
## 🔌 獨立 MCP 伺服器 (Stdio) 配置
本外掛支援作為獨立 MCP Stdio 服務運行,可直接配置於 Claude Desktop、Cursor、Gemini 或 Antigravity 中:
在 `claude_desktop_config.json` 中配置:
```json
{
"mcpServers": {
"discord": {
"command": "npx",
"args": ["-y", "@luoyi-dsh/discord-plugin"],
"env": {
"DISCORD_USER_TOKEN": "您的_DISCORD_USER_TOKEN"
}
}
}
}
```
---
## 🎨 DSH Web 設置面板 (`client.js`)
本插件提供符合 `.agents/skills/design-taste-frontend` 規範的 DSH 瀏覽器端設定面板:
- **極致防風控與隱私保護**:Token 遮罩切換、發言模擬打字開關、隨機 Jitter 延遲設定。
- **高資訊密度與精緻排版**:1px 邊框、全語意狀態膠囊(在線 Emerald / 警告 Amber / 離線 Rose)。
- **即時連線狀態與 KPI 指標**:Avatar 頭像、即時在線狀態點、今日提及代回 / 群聊穿插 / 私訊代回統計進度條。
- **即時控制台**:在介面中直接選取伺服器與頻道,立即發送文字、圖片、文件與貼圖。
### 如何開啟設定面板
啟動 DSH Web(`dsh web`,預設網址 `http://127.0.0.1:3080`)後,可透過以下入口進入:
1. **左側一級導航**:點選設定側邊欄的 **「Discord」** 專屬面板。
2. **外掛程式管理**:進入「外掛程式 (Plugins)」卡片列表,點擊 **「Discord 帳號助理」**。
3. **頂部頁籤**:於外掛程式設定頁頂部切換至 **「Discord」** 頁籤。
---
## ⚙️ 詳細設定參數說明 (Settings)
可於 DSH Web 設定面板或 `data/config.json` 中配置:
### 1. 帳號與連線
- **`userToken`**:Discord 使用者授權 Token(非機器人 Token)。
- **`proxyUrl`**:代理伺服器 URL(例如 `http://127.0.0.1:7890`,選填)。
- **`status`**:在線狀態(`online` 在線、`idle` 閒置、`dnd` 請勿打擾、`invisible` 隱身)。
- **`autoStart`**:DSH 啟動時是否自動連線(預設 `true`)。
### 2. 提及與私訊代回 (Mention & DM Assistant)
- **`mentionReplyEnabled`**:是否自動回覆被 @ 提及或引用回覆(預設 `true`)。
- **`dmReplyEnabled`**:是否自動代回私訊 (DM)(預設 `true`)。
- **`replyQuote`**:回覆時是否保留 Discord 引用格式(預設 `true`)。
- **`roundCapPerUser`**:單一對象連續回覆輪數上限(預設 `5` 輪,徹底防死循環)。
- **`maxDailyMentionReplies`**:每日被提及回覆上限(預設 `60` 則)。
- **`maxDailyDmReplies`**:每日私訊代回上限(預設 `60` 則)。
- **`mentionPersonaPrompt`**:提及回覆時的人設 Prompt。
- **`dmPersonaPrompt`**:私訊代回時的人設 Prompt。
### 3. 群組穿插搭話 (Autonomous Co-Chatting)
- **`coChatEnabled`**:是否啟用群組主動穿插閒聊(預設 `true`)。
- **`coChatProbability`**:搭話觸發基礎機率(`0~100%`,預設 `25%`)。
- **`coChatCooldownSeconds`**:同頻道連續搭話冷卻時間(秒,預設 `60` 秒)。
- **`coChatMinHistoryMessages`**:發言前最少累積之歷史訊息數(預設 `3` 則)。
- **`interestKeywords`**:興趣關鍵字清單(命中時提高搭話率 +35%,預設 `["ai", "遊戲", "code", "bug", "吃什麼", "伺服器"]`)。
- **`maxDailyCoChats`**:每日主動穿插聊天上限(預設 `80` 則)。
- **`coChatPersonaPrompt`**:群聊搭話風格 Prompt(支援 `[NO_REPLY]` 判定)。
- **`monitoredChannelIds`**:指定監聽頻道 ID 清單(留空代表監聽有權限的所有文字頻道)。
### 4. 防封號與擬真輸入安全
- **`simulateTyping`**:發送前是否模擬真人正在輸入中 (`sendTyping`)(預設 `true`)。
- **`jitterMinSeconds`** / **`jitterMaxSeconds`**:擬真輸入隨機延遲下限/上限(預設 `2~5` 秒)。
- **`blacklistUserIds`**:黑名單用戶 ID 清單。
- **`whitelistUserIds`**:白名單用戶 ID 清單(非空時僅回覆名單內成員)。
- **`blacklistChannelIds`**:黑名單頻道 ID 清單。
---
## 🔑 如何獲取 Discord 使用者 Token
1. 使用電腦瀏覽器(如 Chrome / Edge)登入 [Discord 網頁版](https://discord.com/app)。
2. 按鍵盤 `F12` 或右鍵點選「檢查」開啟**開發者工具**,切換到 **Network (網路)** 標籤頁。
3. 在任意伺服器發送一則訊息或點擊左側頻道清單。
4. 在 Network 請求列表中點選任意 Discord API 請求(例如 `messages` 或 `typing`)。
5. 查看 **Headers (標頭)** -> **Request Headers**,找到 **`authorization`** 欄位。
6. 複製該欄位完整字串(請妥善保管,勿外洩給他人)。
---
## 📄 授權條款
本專案採用 [MIT License](LICENSE) 授權發布。
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues