LoginSignup
11
6

More than 1 year has passed since last update.

Node.jsでDiscordBotを作るのに苦戦した話

Last updated at Posted at 2021-09-04

はじめに

こちらの記事は私のサイトでも閲覧できます。内容は同じですがよければご覧ください。

導入

私はしばらくの間、Discord Botを開発していました。
私はPythonの経験があるのではじめはDiscord.pyを使ってBotを開発していましたが、どうやらDiscord.pyのサポートが終了するということで今回Discord.jsに乗り換えることにしたわけです。

追記
discord.pyのサポートは一旦打ち切られましたが、結局継続することになったらしいです。まあ、サポートされるなら無理に乗り換える必要はなさそうです。
これは余談ですが、PythonでDiscord Bot作るならdiscord.pyの派生ライブラリである、pycordを使うのをおすすめします。discord.pyはスラッシュコマンドに対応していませんが、pycordは対応しています。discord.pyから乗り換える場合でもコードの書き換え量はそこまで多くないです。

Node.jsとDiscord.jsの記事は比較的少なく、2つのポイントで大変苦戦しましたので備忘録として残しておきます。

1. 環境構築で苦戦

まず私がDiscord.jsを動かす環境をつくるにあたって、Qiitaのこちらの記事「Discord.js でボットを作る ~発言させるまで~」を参考にしました。
これをコピペしてLinux上で実行すれば移行なんて簡単。と思っていたのですが…

これ、うまくはいかないんですよねぇ。

エラーに悩む

記事通りにNode.js,npm,discord.jsをインストールしたのにエラーが出るんです。しかも調べてもよい記事がありません!これは困った。。。

悩みに悩んでかかぽ鯖で質問しました。

...すると衝撃的な事実が発覚しました。それはなんと、、、

discord.jsはnode.jsはv14以上、npmはv7以上必要

だったのです!!discord.jsの仕様書を見ればよかったのかもしれませんが、これはトリックですよね。

Linux標準リポジトリのものは最新バージョンではない

私は、Ubuntu Serverに

sudo apt install node.js npm

と実行し、最新版を入れていたつもりでした。

しかしこれでインストールされるのはNodeはv10、npmはv6なんです(2021/09/04時点)。

2021/09/04時点での最新バージョンはNodeはv16.8、npmはv7.21です。

__Linuxの標準リポジトリのものは最新バージョンであるとは限らない__ので注意してください。

Discord.js
動作環境
標準リポジトリ
最新バージョン
公式リポジトリ
最新バージョン
Node.js v14以上 v10 v16.8
npm v7以上 v6 v7.21

動作環境が適切か確認することが大切です。

解決策: 公式のリポジトリから最新のNode.jsとnpmを入れる

では、以下のようにコマンドを実行して最新版をいれていきましょう!

# 公式のリポジトリを追加
$ curl -sL https://deb.nodesource.com/setup_16.x | sudo bash -

# パッケージの更新
$ sudo apt update

# インストール
$ sudo apt install -y node npm

これで最新バージョンが入りました。

$ node -v
16.8.0

$ npm -v
7.21.0

ここまでが初めに躓いた部分です。

2. 再度エラーに悩む

正直原因は上記のものだと思っていたのでこれで解決するだろうと思い、この記事を参考に以下のコードを保存しました。

main.js
const Discord = require('discord.js');

const client = new Discord.Client();

const token = 'アクセストークン';

client.on('ready', () => {
    console.log('ready...');
});

client.login(token);

...エラーが出ました。またか。。。今度も何が原因なのかわかりません。

ということで再度かかぽ鯖にて質問するとりすりす氏(@TwoSquirrels)から

new Discord.Client();

を以下のように変更するとよいとアドバイスをいただきました。

new Discord.Client({ intents: [Discord.Intents.FLAGS.GUILDS] });

Intentsを指定していなかったことが原因でした

結果

なんと動きました!!!!!

感動です。
Node.jsとDiscord.jsでBotがログインできました。

  • 追記

あとはこちらの記事を参考にすればDiscord.pyからDiscord.jsへの移行は簡単です。自分の環境でも動作することを確認しました。かなり詳しく書かれているのでわかりやすいと思います。

まとめ

今回は以下の2点で見事躓きました。

  • Node.js, npm の導入
  • Intentsの指定

これは備忘録として残します。

助けていただいた方には本当に感謝しています。ありがとうございました。

11
6
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
6