Discord.jsで転送機能(message.forward)を実装した話
2025-04-10
azblob://2025/04/04/eyecatch/2025-04-04-introduction-and-discord-forward-000.png

こんにちは。2025年4月に株式会社FIXERへ入社した 山際涼太 です。

今回はDiscord.jsを用いたDiscordアプリ(旧Bot)を用いて、最新の機能であるメッセージ転送機能(message.forward)を実装した話をしたいと思います。

転送機能とは

メッセージの転送機能とは、2024年10月ごろにDiscordで実装された、任意のメッセージやメディアを選んで、別の場所に送ることができる機能です。

Discord | メッセージの転送 (画像もリンク先より)

この機能を用いることで、他のサーバーやチャンネルで共有された話題や画像を簡単に、フレンドや他のサーバーのチャンネルなどへ簡単に転送できるようになっています。

転送したメッセージの画像例

message.forwardについて

まず簡単にDiscord内のアプリ(旧Bot)についてです。Discordにはサーバーの機能を拡張したり、ユーザ体験を向上させる機能として、アプリを追加することができます。

このアプリの開発に用いられるのが、JavaScriptのNode.jsを用いたDiscord.jsというライブラリです。このDiscord.jsに2025年2月11日にv14.18.0として追加されたのがmessage.forward機能です。
message.forwardでは、特定のメッセージを取得した後、チャンネルを指定することで、そのチャンネルに取得したメッセージを転送することができます。

コード例

今回は、アプリのサポートサーバーで自動投稿している内容を、アプリを追加しているサーバーやユーザーに対するDMで簡単に見ることができるようにしたいと考え、以下のように実装しました。

Javascriptconst { MessageFlags ... } = require('discord.js');
const client = require('./../client.js');

// タイプとチャンネルIDの組み合わせ *1
const forwardChannelIds = {
	type1: 'CHANNEL_ID1',
	type2: 'CHANNEL_ID2',
	...
}

/** コマンド、その他実装は省略 **/

// メッセージの転送を行う関数
const forwardLatestMessage = async (interaction, type) => {
	const sourceChannelId = forwardChannelIds[type]; // 転送元チャンネルIDの取得
	if (!sourceChannelId) return await interaction.editReply({ content: '指定された転送元チャンネルが見つかりませんでした', flags: [MessageFlags.Ephemeral] })
	
	try {
		const sourceChannel = await client.channels.fetch(sourceChannelId);
		if (!sourceChannel) return await interaction.editReply({ content: '転送元チャンネルの取得に失敗しました', flags: [MessageFlags.Ephemeral] });
		
		const messages = await sourceChannel.messages.fetch({ limit: 2 }); // チャンネルの最新2メッセージを取得 *2
		const latestMessage = messages.filter(msg => !msg.system).first(); // システムメッセージを除いた最新のメッセージを取得
		if (!latestMessage) return await interaction.editReply({ content: '転送可能なメッセージが見つかりません', flags: [MessageFlags.Ephemeral] });
		
		await latestMessage.forward(interaction.channel); // コマンドを実行したチャンネルに最新メッセージを転送
		await interaction.editReply('転送に成功しました');
	} catch {
		console.error('メッセージ転送中のエラー:', error);
		await interaction.editReply({ content: 'メッセージの転送に失敗しました', flags: [MessageFlags.Ephemeral] });
	}
}

// 呼び出し例(コマンドのexecute内を想定)
const type = interaction.options.getString('type');
await forwardLatestMessage(interaction, tyep);

*1 アプリのコマンドとして、タイプを受け取って、該当するチャンネルから投稿を転送する機能のため

*2 チャンネルでピン止めを行う場合があるため、2メッセージ取得し、システムメッセージ(「ピン止めしました」という内容)を除外している

まとめ

このように、discord.jsの最新機能を用いることで、現在では簡単に転送機能を実装できます。
是非皆さんも試してみてくださいね!

過去の方法を用いた、転送機能の実装例はこちら
 ▶ GaiXerに聞いてみた | discord.jsでメッセージの転送機能を実装してください

azblob://2025/04/10/eyecatch/2025-04-10-stock-prediction-using-lstm-intro-000.jpg
2025/04/11
Others