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.jsdiscli
初始設定pip install / npm install、撰寫 bot class、設定 intentspip install discord-cli-agent、設定 token、執行
語言僅 Python / JavaScript任何語言(CLI 或子程序)
事件迴圈你自行管理 asyncio / Node event loopdiscli 內部管理
Intents在程式中設定透過 discli config 或旗標設定
安全機制需自行實作內建權限設定檔、稽核紀錄、速率限制
AI 串接需要自訂整合邏輯原生 JSONL 代理協定
串流自行處理 websocketdiscli listendiscli serve 自動輸出 JSONL
學習門檻中等到較高較低:只要會用終端機即可

程式碼比較

以下示範同一件事:機器人接收訊息後回覆。兩邊做法如下:

import discord
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)
@client.event
async def on_ready():
print(f"Logged in as {client.user}")
@client.event
async 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 工具一樣串接資訊流
  • 安全邊界:權限設定檔可防止代理做出不該做的操作
  • 快速原型:從想法到可用機器人只要幾分鐘
  • 語言自由:用團隊既有的任何語言完成整合