前言
Discord Bot,相信有在用 Discord 社群的人都對於 Discord Bot 有一定的理解。你可以看到有些用戶的旁邊有一個【應用】
這個就是 Discord Bot,他不是一個真正的使用者,而是一串程式驅動的虛擬使用者,他可以做到發訊息、加入語音頻道、給身份組、自動封鎖違規使用者等功能。
在這個專案中我是使用 python 來寫 Discord Bot 的核心,並且使用家裡的樹莓派當作伺服器來 24 小時運行 Discord Bot 服務。Discord Bot 的連線方式是 WebSocket Gateway,也就是程式主動連線到 Discord 的伺服器操作機器人。這樣就不用架設公開伺服器也可以跑。
如果對於這種社群媒體的機器人或自動回復功能有興趣,我會很推薦使用 Discord Bot 做為初次架設練手。它的功能很多,並且是免費的,架設起來也不困難,適合搓一點個人用途的小專案。另外 Telegram Bot 也是一個選擇,他的開發比起 Discord Bot 更簡單,但功能更少一點,由於我沒有開發過 Telegram 所以這裡先簡單帶過。
專案架構
這個專案是由 main.py 作為主要進入點,並且由各種的核心功能 ( core ) 和 插件 ( cogs ) 組成,專案的架構大致長這樣:
project_root/
│
├── main.py # 主程式
├── cogs/ # 各種小功能
├── core/ # 放置一些核心功能,例如 Gemini API,或著經驗計算系統
└── data/ # 放置機器人用的資料
詳細的程式架構可以翻我的 Github 看看 :D
各種功能解釋
總體來說這個 Bot 我寫了不少功能,我拿三個功能出來講:
AI 對話
我想在這個伺服器串接一個 Gemini 的 API 讓使用者可以跟 AI 對話 ( 至於為什麼是用 Gemini 的 API,因為它是免費的 :D )。雖然除了跟 AI 對話,這個 API 還有很多功能,這個我稍後會提及。
我在 core/gemini_client.py 中放置了對接 Gemini API 的核心功能,並且在 cogs/ai_chat.py 寫了和 AI 對話的邏輯。具體來說會傳送一段對話給予 AI ( 這個我們叫做 prompt ),讓 AI 回傳一個對話。但回傳對話需要給予 AI 一些提示,例如叫他用以下方式回傳。
{
"response" : "回覆使用者的對話",
"memory" : "修改 / 新增使用者的記憶到 data 中"
}
就可以在回覆使用者的同時新增對於他的記憶,這樣就不會說說完下一句就遺忘上面那一句了。
此外, AI 對話也可以有人格,讓他以各種個性回覆,總得來說目前有 4 個個性:
default:友善助手 — 活潑、幽默、豪邁且不拘小節的友善助手
professional:專業顧問 — 嚴謹博學的高知識份子,認真回答問題並確保對方能理解
scholar:淫夢學術分子 — 自詡對「學術」(淫夢梗文化)有深厚造詣的研究者,滿口經典語錄、動不動就大喜、時不時臭人一波
zhouli:合乎周禮 — 把使用者的話改寫成一本正經、略顯荒唐的「周禮白話翻譯腔」;要求「釋禮」時再翻回人話
我自認在 scholar 這個人格我沒有寫得很好,他不怎麼臭。
然後 zhouli 人格是從 【 B 站 AI 創造公開賽 】 的 【合乎周禮生成器】 擷取的,加上這個 skill 之後確實就「合乎周禮」了。
每日猜字謎
這點也是基於上面的 AI 對話呈現的,我在 data 下面建立了高達 2000 多題的人物資料庫
"cs_scientist": {
"description": "資工與科技領域:計算機科學奠基者、著名程式語言創始人及對資訊工業有重大貢獻的人物。",
"name": "資工領域的科學家",
"pool": [
"艾倫圖靈", "馮紐曼", "葛麗絲霍普", "克勞德香農", "林納斯托瓦茲",
"提姆柏內茲李", "比爾蓋茲", "賈伯斯", "約翰麥卡錫", "肯湯普遜",
"丹尼斯里奇", "詹姆斯高斯林", "安德魯卡內基", "戈登摩爾", "謝爾蓋布林",
"賴利佩吉", "馬克祖克柏", "黃仁勳", "蘇姿丰", "張忠謀"
]
},
....
每天出題時會隨機從字謎中出一個,並且請 AI 生成三個提示,依照提示來出題。
使用者在回答完題目之後,如果正確則會發出恭喜貼文表示你答對了,反之則使用表情符號表示錯誤。
這個顯著增加了伺服器活躍度阿 ( 大喜
自動封鎖詐騙帳號
Discord 常常會有詐騙帳號的出現,這時我們就要狠狠地封禁他 ( 意味深
這個功能的邏輯其實相當簡單,因為詐騙機器人通常是在每一個頻道裡面發送詐騙訊息,所以可以特地挑選一個陷阱頻道,當有任何人在裡面發訊息自動 ban 他,這樣就可以抓到詐騙機器人了。
不過現在的詐騙機器人好像更高明,例如我見過只針對語音區的詐騙機器人,這點得更小心才行 ouo。
結論
這個機器人還有一些功能,例如經驗等級、自動過濾敏感言論等等,礙於篇幅這裡就不展開來講了。
總之,我認為寫一個自己的 Discord 群組機器人,比起去用外面現成的,可以更加強化自己群組給他人帶來的印象 / 功能,因為可以自己寫一些獨特的功能 ( 例如猜字謎、AI 對話系統都是其他群組沒出現的 )。除此之外 Discord Bot 開發起來也簡單不少,讓我可以專心想說我該如何規劃我的程式架構。
未來規劃的話,有空可以把我的資料轉移到 sql 儲存,之後就看我想到甚麼功能再加吧。
留言
登入後即可留言
![[ Discord Bot ] 基於樹梅派搭建的伺服器機器人](/_next/image?url=%2Fapi%2Fuploads%2F1787718854877-dk6qvdpdqju.png&w=3840&q=75)