你好 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 服务器。
谢谢你!
来源: habr.com