こんにちは。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でメッセージの転送機能を実装してください