
近年來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