記事投稿日:
   最終更新日:

はじめに

image

この記事はQiitaでも閲覧できます。こちら

※内容は同じです。

導入

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

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

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

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-get install -y node npm

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

$ node -v
16.8.0

$ npm -v
7.21.0

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

2. 再度エラーに悩む

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

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] });

結果

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

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

まとめ

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

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

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