你好 Khabrovites!
今天您將看到一篇文章,向您展示如何在 .NET Core 上使用 C# 創建機器人以及如何在遠程服務器上運行它。
文章將包括背景、準備階段、編寫邏輯和將機器人傳輸到遠程服務器。
底
這一切都始於我在 Discord 服務器上度過的一個不眠的秋夜。 自從我最近加入他,我開始上下研究他。 找到文本頻道“職位空缺”後,我開始感興趣,打開它,發現我不感興趣的報價是:
“程序員(機器人開發者)
要求:
- 編程語言知識;
- 自學能力。
Пожелания:
- 理解他人代碼的能力;
- DISCORD 功能的知識。
目標:
- 機器人開發;
- 機器人的支持和維護。
你的好處:
- 有機會支持和影響你喜歡的項目;
- 獲得在團隊中工作的經驗;
- 展示和提高現有技能的機會。
這立即引起了我的興趣。 是的,他們沒有為這項工作付費,但他們沒有要求您承擔任何義務,並且在投資組合中不會是多餘的。 因此,我寫信給服務器管理員,他讓我寫一個機器人來顯示《坦克世界》中玩家的統計數據。
準備階段
迪斯科
在我們開始編寫我們的機器人之前,我們需要為 Discord 創建它。 你需要:
- 登錄 Discord 帳戶
鏈接 - 在“應用程序”選項卡中,單擊“新建應用程序”按鈕並為機器人命名
- 通過登錄您的機器人並在“設置”列表中找到“機器人”選項卡來獲取機器人令牌
- 將令牌保存在某處
戰爭遊戲
此外,您需要在 Wargaming 中創建一個應用程序以訪問 Wargaming API。 在這裡,一切都很簡單:
- 登錄您的 Wargaming 帳戶
通過此鏈接 - 我們轉到“我的應用程序”並單擊“添加新應用程序”按鈕,給出應用程序的名稱並選擇其類型
- 保存應用程序 ID
軟體
已經有了選擇的自由。 有人用Visual Studio,有人用Rider,有人實力一般,用Vim寫代碼(畢竟真正的程序員只會用鍵盤,對吧?)。 但是,為了不實現 Discord API,您可以使用非官方的 C# 庫“DSharpPlus”。 您可以從 NuGet 或通過自己從存儲庫構建源來安裝它。
對於那些不知道或忘記如何從 NuGet 安裝應用程序的人。Visual Studio 說明
- 轉到選項卡項目 - 管理 NuGet 包;
- 單擊評論並在搜索字段中輸入“DSharpPlus”;
- 選擇並安裝框架;
- 利潤!
準備階段結束,可以繼續寫bot了。
寫邏輯
我們不會考慮應用程序的整個邏輯,我只會展示如何使用機器人攔截消息,以及如何使用 Wargaming API。
通過 static async Task MainTask(string[] args); 使用 Discord 機器人進行工作
要調用此函數,您需要在 Main 中註冊
MainTask(args).ConfigureAwait(false).GetAwaiter().GetResult();
接下來,您需要初始化您的機器人:
discord = new DiscordClient(new DiscordConfiguration
{
Token = token,
TokenType = TokenType.Bot,
UseInternalLogHandler = true,
LogLevel = LogLevel.Debug
});
其中 token 是您的機器人的令牌。
然後,通過 lambda,我們編寫機器人應該執行的必要命令:
discord.MessageCreated += async e =>
{
string message = e.Message.Content;
if (message.StartsWith("&"))
{
await e.Message.RespondAsync(“Hello, ” + e.Author.Username);
}
};
e.Author.Username 獲取用戶暱稱的位置。
這樣,當您發送任何以 & 開頭的消息時,機器人會向您打招呼。
在此函數的末尾,您必須編寫 await discord.ConnectAsync(); 並等待 Task.Delay(-1);
這將允許您在後台執行命令而不佔用主線程。
現在我們需要處理 Wargaming API。 這裡的一切都很簡單 - 編寫 CURL 請求,以 JSON 字符串的形式獲得響應,從那裡提取必要的數據並對它們執行操作。
使用 WargamingAPI 的示例
public Player FindPlayer(string searchNickname)
{
//https://api.worldoftanks.ru/wot/account/list/?application_id=y0ur_a@@_id_h3r3search=nickname
urlRequest = resourceMan.GetString("url_find_player") + appID + "&search=" + searchNickname;
Player player = null;
string resultResponse = GetResponse(urlRequest);
dynamic parsed = JsonConvert.DeserializeObject(resultResponse);
string status = parsed.status;
if (status == "ok")
{
int count = parsed.meta.count;
if (count > 0)
{
player = new Player
{
Nickname = parsed.data[0].nickname,
Id = parsed.data[0].account_id
};
}
else
{
throw new PlayerNotFound("Игрок не найден");
}
}
else
{
string error = parsed.error.message;
if (error == "NOT_ENOUGH_SEARCH_LENGTH")
{
throw new PlayerNotFound("Минимум три символа требуется");
}
else if (error == "INVALID_SEARCH")
{
throw new PlayerNotFound("Неверный поиск");
}
else if (error == "SEARCH_NOT_SPECIFIED")
{
throw new PlayerNotFound("Пустой никнейм");
}
else
{
throw new Exception("Something went wrong.");
}
}
return player;
}
注意力! 絕對不建議以明文形式存儲所有令牌和應用程序 ID! 至少,當此類令牌進入全球網絡時,Discord 會禁止此類令牌,並且最多時,機器人開始被攻擊者使用。
部署到 VPS - 服務器
一旦你完成了這個機器人,它需要託管在一個持續運行 24/7 的服務器上。 這是因為當您的應用程序運行時,機器人也在運行。 一旦您關閉應用程序,您的機器人也會睡著。
這個世界上存在許多 VPS 服務器,包括 Windows 和 Linux,但是,在大多數情況下,託管在 Linux 上要便宜得多。
在 Discord 服務器上,我被告知 vscale.io,我立即在 Ubuntu 上創建了一個虛擬服務器並上傳了機器人。 我不會描述這個網站是如何工作的,但會直接進入機器人設置。
首先,您需要安裝必要的軟件來運行我們用 .NET Core 編寫的機器人。
接下來,您需要將機器人上傳到 Git 服務,如 GitHub 等,並將其克隆到 VPS 服務器,或者通過其他方式下載您的機器人。 請注意,您將只有一個控制台,沒有 GUI。 完全沒有。
下載機器人後,您需要運行它。 為此,您需要:
- 恢復所有依賴項:dotnet restore
- 構建應用程序:dotnet build name_project.sln -c Release
- 轉到構建的 DLL;
- dotnet 文件名.dll
恭喜! 你的機器人正在運行。 然而,不幸的是,殭屍程序佔據了控制台,退出 VPS 服務器並不容易。 此外,如果服務器重新啟動,您將必須以新方式啟動機器人。 有幾種方法可以擺脫這種情況。 所有這些都與服務器啟動時的啟動有關:
- 將運行腳本添加到/etc/init.d
- 創建將在啟動時運行的服務。
我看不出詳細討論它們有什麼意義,互聯網上對所有內容都進行了足夠詳細的描述。
發現
我很高興接受了這個任務。 這是我的第一次機器人開發經歷,我很高興我在 C# 和 Linux 方面獲得了新知識。
鏈接到 Discord 服務器。
謝謝你的關注!
來源: www.habr.com