
近年來PC上的通訊軟體大量崛起,從過去的Skype、RC語音,到現在專為遊戲設計的 Discord ,可以自訂自己的頻道,並在玩遊戲時,邀請朋友一起聊天,成為最受年輕人喜愛的語音通訊軟體,而當中也有許多玩家自行建立了機器人來豐富他的頻道,本篇將分享如何創建一個簡單的Discord訊息機器人。
1.新增一個伺服器:
首先要先新建一個Discord伺服器,打開Discord,點選新增伺服器

選擇建立自己的

自訂伺服器名稱並建立

2.前往Discord開法者頁面:
需要先在網頁登入Discord,登入後前往開發者頁面https://discord.com/developers/applications,接著新增一個應用程式。


新增後會看到以下畫面

3.新增機器人:
第二步新增一個機器人,點選左側選單的Bot,然後點擊Reset Token,這組Token是之後連接Bot時要用的,可以先複製存起來。

4.將Bot加入自己的Discord伺服器:
第三步需要將Bot加入自己的Discord伺服器,首先要先到OAuth2頁面,選擇要新增的項目(這裡選擇為Bot),並且選擇Bot的權限,此處以傳送訊息為例,選擇SendMessages,選完後就會看到一串url,將這個url複製後到新分頁開啟。


開啟後會看到以下畫面,選擇一開始建立的伺服器並按繼續。

授權Bot在伺服器裡的權限

接著就會看到Bot已加入伺服器

5.開啟開發人員模式:
在撰寫程式之前,需要先有頻道的ID,預設是看不到的,需要先到設定裡開啟開發人員模式


開啟後到頻道按右鍵,複製頻道ID,先將ID存起來,後續撰寫程式時會用到

6.程式碼:
在開始撰寫之前,需要先安裝兩個Nuget套件,Discord.Net與Discord.Net.WebSocket

接著是程式的部分
// DiscordSocketClient 是用來建立與 Discord 伺服器的連線private static DiscordSocketClient _client;
public static async Task Main(){ _client = new DiscordSocketClient(); // 設定機器人 token,這邊要換成前面步驟3時取得的Token var token = "YOUR TOKEN"; // 使用 LoginAsync登入機器人 await _client.LoginAsync(TokenType.Bot, token);
// 與 Discord 伺服器建立連線 await _client.StartAsync(); // 註冊 Ready 事件處理方法,當機器人成功連接並準備好時會觸發 _client.Ready += SendNotice; // 等待 10 秒鐘,讓機器人完成工作,秒數可自行測試再做更改 await Task.Delay(10000); // 停止機器人,並中斷與 Discord 伺服器的連線 await _client.StopAsync(); // 等待 10 秒鐘,確保機器人完全停止 await Task.Delay(10000);}
// 發送訊息的方法public static async Task SendNotice(){ // 設定頻道的 ID(步驟5時複製的頻道ID),這是用來指定發送訊息的頻道,此ID也可以設定成使用者ID,則機器人會透過私人訊息傳送var id = ulong.Parse("1318139132228141098"); // 呼叫 GetChannel 方法來取得該頻道 var socket = GetChannel(id); // 透過取得的頻道發送訊息 await socket.SendMessageAsync($"TEST Discord");}
// 用來取得頻道的方法,根據傳入的 ID 取得指定頻道private static IMessageChannel GetChannel(ulong id){ // 嘗試從 _client 取得頻道,如果成功會回傳頻道 var channel = _client.GetChannel(id) as IMessageChannel;
// 如果頻道不存在(即為 null),則嘗試以私人訊息傳送 if (channel == null) { // 透過 ID 獲取用戶,如果找不到該用戶,則回傳 null var user = _client.GetUserAsync(id).Result;
// 如果用戶不存在,則回傳 null if (user == null) { return null; }
// 創建並返回用戶的私人訊息頻道 channel = (IMessageChannel)(user.CreateDMChannelAsync().GetAwaiter().GetResult()); }
// 返回取得的頻道 return channel;}
執行後可以看到機器人發送了指定的訊息。

7.結語:
建立Discord,可以透過機器人發送訊息到指定頻道,當然也可以結合其他功能,例如每天從氣象局獲取天氣資料,再透過機器人於每天指定時間傳送訊息到Discord頻道,或是每日搜尋時事後再傳送到頻道,用法可說非常廣泛。
Reference
https://docs.discordnet.dev/guides/getting_started/installing.html?tabs=vs-install%2Ccore2-1