VPS サーバーにデプロイして .NET Core 上に Discord ボットを作成する

VPS サーバーにデプロイして .NET Core 上に Discord ボットを作成する

こんにちは、ハブロビ人です!

今日は、.NET Core 上で C# を使用してボットを作成する方法と、それをリモート サーバーで実行する方法を説明する記事を紹介します。

この記事は、背景、準備段階、ロジックの作成、ボットのリモート サーバーへの転送で構成されます。

この記事が多くの初心者に役立つことを願っています。

背景

それはすべて、Discord サーバーで過ごした眠れぬ秋の夜から始まりました。 私は最近彼に加わって以来、彼のことを徹底的に研究し始めました。 テキストチャンネル「Vacacies」を見つけて興味を持ち、それを開いたところ、興味のないオファーの中に次のようなものがあることがわかりました。

「プログラマー(ボット開発者)」
要件:

  • プログラミング言語の知識。
  • 自ら学ぶ能力。

Пожелания:

  • 他の人のコードを理解する能力。
  • DISCORD 機能の知識。

目的:

  • ボット開発。
  • ボットのサポートとメンテナンス。

あなたのメリット:

  • 好きなプロジェクトをサポートし、影響を与える機会。
  • チームで働く経験を積む。
  • 既存のスキルを実証し、向上させる機会。


これにはすぐに興味を持ちました。 はい、彼らはこの仕事にお金を払っていませんが、あなたに義務を要求していませんし、ポートフォリオに余分なものは含まれません。 そこで、サーバー管理者に手紙を書き、World of Tanks でプレイヤーの統計を表示するボットを作成するように依頼しました。

予備段階

VPS サーバーにデプロイして .NET Core 上に Discord ボットを作成する
ディスクロッド
ボットの作成を開始する前に、Discord 用にボットを作成する必要があります。 必要なものは次のとおりです。

  1. Discordアカウントにログインする リンク
  2. [アプリケーション] タブで、[新しいアプリケーション] ボタンをクリックし、ボットに名前を付けます。
  3. ボットにログインし、「設定」リストで「ボット」タブを見つけてボット トークンを取得します。
  4. トークンをどこかに保存します

Wargaming

また、Wargaming API にアクセスするには、Wargaming でアプリケーションを作成する必要があります。 ここでも、すべてがシンプルです。

  1. Wargaming アカウントにログインします このリンクから
  2. 「マイアプリケーション」に移動し、「新しいアプリケーションを追加」ボタンをクリックして、アプリケーションの名前を指定し、そのタイプを選択します。
  3. アプリケーションIDの保存

ソフトウェア

選択の自由はすでにあります。 Visual Studio を使用する人、Rider を使用する人、一般的に強力な人がいて、Vim でコードを作成します (結局のところ、本物のプログラマーはキーボードしか使用しませんよね?)。 ただし、Discord APIを実装しない場合は、非公式C#ライブラリ「DSharpPlus」を利用することができます。 NuGet からインストールすることも、リポジトリからソースを自分でビルドすることによってもインストールできます。

NuGet からアプリケーションをインストールする方法がわからない、または忘れてしまった人向け。Visual Studio の手順

  1. [プロジェクト] - [NuGet パッケージの管理] タブに移動します。
  2. レビューをクリックし、検索フィールドに「DSharpPlus」と入力します。
  3. フレームワークを選択してインストールします。
  4. 利益!

準備段階が終了したので、ボットの作成に進むことができます。

ロジックを書く

VPS サーバーにデプロイして .NET Core 上に Discord ボットを作成する

アプリケーションのロジック全体については考慮しません。ボットによるメッセージの傍受を処理する方法と、Wargaming API を処理する方法のみを示します。

Discord ボットの操作は、静的非同期タスク MainTask(string[] args); を通じて行われます。
この関数を呼び出すには、Main で登録する必要があります

MainTask(args).ConfigureAwait(false).GetAwaiter().GetResult();

次に、ボットを初期化する必要があります。

discord = new DiscordClient(new DiscordConfiguration
{
    Token = token,
    TokenType = TokenType.Bot,
    UseInternalLogHandler = true,
    LogLevel = LogLevel.Debug
});

ここで、token はボットのトークンです。
次に、ラムダを通じて、ボットが実行する必要があるコマンドを記述します。

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 - サーバーへの展開

VPS サーバーにデプロイして .NET Core 上に Discord ボットを作成する

ボットの使用が完了したら、24 時間年中無休で稼働しているサーバー上でボットをホストする必要があります。 これは、アプリケーションの実行中にボットも実行されるためです。 アプリケーションをオフにするとすぐに、ボットもスリープ状態になります。

この世界には多くのVPSサーバーがあります。 Windowsそう Linuxしかし、ほとんどの場合、 Linux 設置費用がはるかに安い。

Discordサーバーでvscale.ioを勧められたので、すぐにその上に仮想サーバーを作成しました。 Ubuntu そしてボットをアップロードしました。このサイトの仕組みについては説明しませんが、ボットの設定方法に直接進みます。

まず、.NET Core で書かれたボットを実行するために必要なソフトウェアをインストールする必要があります。 その方法はここで説明されています.

次に、ボットを GitHub などの Git サービスにアップロードし、VPS サーバーに複製するか、他の方法でボットをダウンロードする必要があります。 コンソールのみが存在し、GUI は存在しないことに注意してください。 まったく。

ボットをダウンロードしたら、それを実行する必要があります。 このためには、次のものが必要です。

  • すべての依存関係を復元します: dotnet list
  • アプリケーションのビルド: dotnet build name_project.sln -c Release
  • ビルドされた DLL に移動します。
  • ドットネットファイル名.dll

おめでとう! ボットが実行されています。 ただし、残念ながらボットがコンソールを占有しており、VPS サーバーから終了するのは簡単ではありません。 また、サーバーを再起動する場合は、新しい方法でボットを起動する必要があります。 この状況から抜け出す方法はいくつかあります。 それらはすべてサーバー起動時の起動に関連しています。

  • 実行スクリプトを/etc/init.dに追加
  • 起動時に実行するサービスを作成します。

それらについて詳しく説明することに意味はないと思います。すべてはインターネット上で十分に詳細に説明されています。

所見

このタスクを引き受けてよかったです。ボット開発は初めての経験でしたが、C#とプログラミングに関する新しい知識を得ることができてよかったです。 Linux.

Discordサーバーへのリンクです。 Wargaming ゲームをプレイする人向け。
Discord ボットが配置されているリポジトリへのリンク。
DSharpPlus リポジトリへのリンク。
ありがとうございました!

出所: habr.com

DDoS 保護機能を備えた信頼性の高いサイト用ホスティング、VPS VDS サーバーを購入する 🔥 DDoS攻撃対策付きの信頼性の高いウェブサイトホスティング、VPS/VDSサーバーを購入しましょう | ProHoster