discli 與 Discord 函式庫
discord.py 與 discord.js 是目前建置 Discord 機器人最常用的兩套函式庫,成熟且有大型社群支援。discli 的定位不同:它不是你匯入到程式的函式庫,而是一個可直接執行的獨立工具。
它們是什麼
discord.py 是 async 的 Python 函式庫,包裝 Discord API。你需要寫一個 Python 程式、定義事件處理器,並長時間執行。discord.js 是 Node.js 生態下對應的 JavaScript 函式庫。兩者都能提供對每個 API endpoint 的完整精細控制。
discli 則是 CLI 工具與代理協定。你透過命令列或雙向 JSONL 串流與 Discord 互動,沒有函式庫匯入、沒有自己維護 event loop,也不受特定語言鎖定。
discord.py / discord.js 的優勢
- 完整 API 覆蓋:每個 endpoint、每個物件、每種事件都能操作
- 精細控制:自定義快取、shard 策略、語音連線
- 龐大生態:大量擴充套件、教學與 StackOverflow 解答
- 生產實績:服務數百萬使用者、覆蓋成千上萬伺服器的 bot 常見於成熟專案
discli 的差異
- 無樣板程式:傳送一則訊息只需一個指令,不需 30 行初始化程式
- 語言無關:只要能啟動子程序或讀寫 JSONL 的任何語言都能用
- 內建安全機制:預設有權限設定檔、稽核紀錄與速率限制
- 雙模式使用:可做一次性 CLI 指令,也可做代理常駐伺服器
- AI 原生設計:JSONL 代理協定從一開始就以 LLM 工具使用為核心
比較表
| 面向 | discord.py / discord.js | discli |
|---|---|---|
| 初始設定 | pip install / npm install、撰寫 bot class、設定 intents | pip install discord-cli-agent、設定 token、執行 |
| 語言 | 僅 Python / JavaScript | 任何語言(CLI 或子程序) |
| 事件迴圈 | 你自行管理 asyncio / Node event loop | discli 內部管理 |
| Intents | 在程式中設定 | 透過 discli config 或旗標設定 |
| 安全機制 | 需自行實作 | 內建權限設定檔、稽核紀錄、速率限制 |
| AI 串接 | 需要自訂整合邏輯 | 原生 JSONL 代理協定 |
| 串流 | 自行處理 websocket | discli listen 或 discli serve 自動輸出 JSONL |
| 學習門檻 | 中等到較高 | 較低:只要會用終端機即可 |
程式碼比較
以下示範同一件事:機器人接收訊息後回覆。兩邊做法如下:
import discord
intents = discord.Intents.default()intents.message_content = True
client = discord.Client(intents=intents)
@client.eventasync def on_ready(): print(f"Logged in as {client.user}")
@client.eventasync def on_message(message): if message.author == client.user: return if message.content.startswith("!hello"): await message.channel.send("Hello from discord.py!")
client.run("YOUR_BOT_TOKEN")這段 Python 需要 16 行匯入、intent 設定、client class、兩個 async 事件處理器與一個阻塞的 run() 呼叫。實際機器人通常還會再加錯誤處理、cog、指令框架等。
import subprocess, json
proc = subprocess.Popen( ["discli", "serve", "--events", "messages"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True,)
for line in proc.stdout: event = json.loads(line) if event.get("type") == "message_create": content = event["data"].get("content", "") if content.startswith("!hello"): action = { "action": "message_send", "channel": event["data"]["channel_id"], "content": "Hello from discli!", } proc.stdin.write(json.dumps(action) + "\n") proc.stdin.flush()沒有 Discord 專屬匯入、沒有 async/await、沒有 intent 物件。這個模式可直接套用到 Node.js、Go、Rust、Ruby,甚至是 bash script。
何時選擇 discord.py 或 discord.js
Tip
當你需要對 Discord API 本體做深度控制時,discord.py / discord.js 通常是更合適的選擇。
以下情境建議使用函式庫:
- 豐富 embeds、按鈕、下拉選單、modal:完整元件建構 API
- 語音與音訊:連接語音頻道、播放音訊、錄製
- 複雜有狀態機制:對話樹、跨步驟精靈、長時間狀態機
- Webhook 與 OAuth2 流程:使用者導向驗證與整合
- 極大規模需求:跨 10,000+ 伺服器的分 shard 快取策略
何時選擇 discli
以下情境建議使用 discli:
- 與 Discord 互動的 AI 代理:JSONL 協定就是為此設計
- Bash 腳本與 CI/CD:可像一般 Unix 工具一樣串接資訊流
- 安全邊界:權限設定檔可防止代理做出不該做的操作
- 快速原型:從想法到可用機器人只要幾分鐘
- 語言自由:用團隊既有的任何語言完成整合