11
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

常時稼動Discordボットを完全無料で作ってみた話

Last updated at Posted at 2024-10-21

Herokuの無料枠が無くなった今、どのホスティングサービスを使う?

Discordボットなど、Herokuの無料枠を利用して公開していた方は多いと思います。
そんな中、2022年の8月25日にHeroku DynosやHeroku Postgresなどの無料プランの廃止がアナウンスされました。
私は当時Discordボットなどを公開していなかったので影響はなかったのですが、動的サイトなどを公開したいと考えていたので、どうしようかと考えていました。いろいろ探したサービスなどあまりピンとこず、導入も大変そうだなぁと諦めていました。

それから月日が経ち、最近Deno Deployに出会いました。

そもそもDeno Deployとは?

Hassle-free platform for serverless JavaScript applications
引用: Deno Deploy公式サイト

翻訳すると
サーバーレスJavaScriptアプリケーションのための手間いらずのプラットフォーム
となります。

つまり、JavaScriptアプリケーションを簡単に公開できるプラットフォームとなっています。

DenoでDiscordボットの作成

DenoでDiscordのボットを作成するために、今回はDiscordenoを使っていきます。

開発環境

開発環境は以下のとおりです。

開発環境
名前 バージョン
Deno 2.0.2
TypeScript 5.6.2
Discordeno 18.0.1

Discordボットの準備

実際にコードを書いていく前に、ボットの準備しましょう。

Discord Developer Portalにアクセスします。
アクセスしたら、画面右上にあるNew Applicationを押してボットの準備をしましょう。
Discord Developer Portalトップ画面
そうしたら、出てきたフォームに名前を入力し、

By clicking Create, you agree...

にチェックを入れて利用規約開発者ポリシーに同意して、
Createをクリックし、ボットを作成しましょう!

Discordボットのトークンの取得

ボットの作成ができたら、左のサイドメニューからBotを選択し、Reset Tokenを押してください。

Discord Developer Portal内のBot画面

Reset Bot's Token?
Your bot will stop working until you update the token in your bot's code.

とでてきますが、本当にリセットするの?と言われているだけなので、Yes, do it! を押しましょう。
そしたらトークンが表示され、コピーできるのでコピーしましょう。

ボットのトークンは第三者に知られないようしてください。
Botが乗っ取られます。

また、この画面を更新するとトークンが見えなくなってしまうので、どこかにメモしていてください。

Discord Developer Portalからトークンの取得

同じ画面で少し下に下がると、ボットの権限を設定する項目があるので、必要に応じて設定しましょう。
今回は管理者権限、Administratorを設定しています。
Discordボットの権限設定

Discordボットをサーバーに招待しよう!

はじめに、招待リンクの準備をしましょう!
左のメニューからInstallatioを選択しGuild Installの項目まで移動してください。
そしたら、SCOPESbotを追加し、PERMISSIONSにはAdministratorBot Permissionと同じものに設定し、Saveしましょう!

Guild Install画面

次にInstall Linkをコピーし、招待します。
招待リンク

サーバーを選んで認証と押すことで招待が完了です!
Discordボット 招待画面

サンプルコードの実行

以下のリポジトリのコードをダウンロードし、実行してみましょう!

ダウンロードしたコードで、先ほど取得したトークンを設定しましょう。
.env内の、<YOUR_TOKEN_HERE>の箇所を取得したトークンに設定してください。

.env
BOT_TOKEN = <YOUR_TOKEN_HERE>

そしたら、次のコマンド

deno task start

で実行してください。
ボットがオンラインになっていたら成功です!

ボットの画像

簡単なスラッシュコマンドの実装

こちらもサンプルを用意しております。

実装したhello_worldコマンドを実行すると、こんにちはと表示されるはずです。

コマンドの実行結果

Deno Deployにデプロイ

まずデプロイするために、DiscordボットのコードをGithubリポジトリにアップロードしてください。
次に、Deno Deployにアクセスし、New Projectから先ほどアップロードしたリポジトリを選択します。
Deno Deploy プロジェクト作成画面 1

次に、少し下のほうにある、Project Configurationから
Project Nameからプロジェクト名を設定し、
Entrypointmain.tsに設定してください。
(ボットの起動をindex.tsなどに設定している方はそちらにしてください)

Deno Deploy プロジェクト作成画面 2

それらが済みましたら、Deploy Projectでプロジェクトのデプロイが完了します!

BOT_TOKENの設定

そのままデプロイすると、以下のようにエラーが発生します。

Deno Deploy Build Logs

これはmain.tsの11行目、

main.ts
const BotToken: string = Deno.env.get("BOT_TOKEN")!;

の部分で取得している環境変数のBOT_TOKENがDeno Deployでは設定されていないからです。
この画面のままですと、環境変数を設定できないので、Account Overviewに戻り当該のプロジェクトを選択します。
そうしてでてきた画面の右上、Settingsを選択してください。

プロジェクトの画面

少し下にスクロールすると、Environment Variablesがあるので、Add Variableを押し、
KeyBOT_TOKENVALUEには.envに設定していた自身のトークンを設定してください。
その後、Save (1 new) を押して環境変数の設定は完了です!
スクリーンショット 2024-10-21 15.23.10.png

デプロイが成功すると、Botがオンラインになるのを確認してください!

ボットの画像

Discordボットの常時起動

Deno Deployは、双方向通信を維持できないため、5分ほどでボットがオフラインになります。
なので、ボットがオフラインになるまでに継続的にリクエストを送り続けます。

Deno Cronの使用

そもそもDeno Cronは、スケジュールされたジョブを簡単に作成できるものです。

main.tsの一番下の行に次のコードを追加します。

main.ts
Deno.cron("Continuous Request", "*/2 * * * *", () => {
    console.log("running...");
});

このコードは2分毎にコンソールにrunning...と出力するだけのものですが、これを実行するだけで、Discordボットはオフラインにならなくなります。
コードを追加したら、リポジトリを更新しておいてください。
更新すると、プロジェクトのLatest Deploymentsに最新の状態に更新されているはずです。

Latest Deployments

おめでとうございます!これで、Discordボットの常時稼働ができました!

(今の所2分毎でオフラインになりませんが、もう少し間隔を空けることも可能かもしれません。)

参考にさせていただいた記事

11
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?