Как в Discord.js сделать, чтобы бот пересылал моё сообщение?

Мне нужно, чтобы бот пересылал моё сообщение, когда я ввожу определённую команду.
  • 17 марта 2026 г. 9:01
Ответы на вопрос 2
Ниже — несколько простых вариантов на discord.js (v14). Выберите тот, который вам подходит: переслать предыдущее своё сообщение в другой канал, либо переслать текст, который вы передаёте в команде.

Общие требования:
- В package.json discord.js v14.
- Включите Intent Message Content (в настройках бота в Developer Portal) и у клиента укажите GatewayIntentBits.MessageContent.
- У бота должны быть права на чтение/публикацию в целевом канале (VIEW_CHANNEL, SEND_MESSAGES).

1) Переслать предыдущее ваше сообщение (команда-перехватчик, префикс !)

```js
const { Client, GatewayIntentBits } = require('discord.js');
const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.MessageContent
  ]
});

const PREFIX = '!';

client.on('messageCreate', async message => {
  if (message.author.bot) return;
  if (!message.content.startsWith(PREFIX)) return;

  const [cmd, targetChannelId] = message.content.slice(PREFIX.length).trim().split(/\s+/);

  if (cmd === 'forward') {
    // если не указан ID канала, используем текущий
    const channelId = targetChannelId || message.channel.id;

    // получаем канал-цель (попробуем кэш, иначе fetch)
    let target = message.guild.channels.cache.get(channelId);
    if (!target) {
      try {
        target = await client.channels.fetch(channelId);
      } catch {
        return message.reply('Не могу найти указанный канал.');
      }
    }

    if (!target || !target.isTextBased()) return message.reply('Цель — не текстовый канал.');

    // ищем предыдущее сообщение от автора в текущем канале (последние 10)
    const msgs = await message.channel.messages.fetch({ limit: 10 });
    const prev = msgs.filter(m => m.author.id === message.author.id && m.id !== message.id).first();
    if (!prev) return message.reply('Не найдено предыдущего сообщения от вас в этом канале.');

    // соберём файлы (attachments)
    const files = Array.from(prev.attachments.values()).map(a => a.url);

    // опционально добавим подпись, кто автор оригинала
    const content = prev.content || '';

    await target.send({ content: `Переслано от ${message.author.tag}:\n${content}`, files });
    return message.reply('Сообщение переслано.');
  }
});

client.login('ВАШ_ТОКЕН');
```

Пояснения:
- Команда: `!forward [channelId]`. Если channelId не указан — пересылает в тот же канал.
- Код ищет предыдущее сообщение от того же пользователя в текущем канале и отправляет его текст и вложения в целевой канал.
- Для пересылки embed'ов надо отдельно их копировать (prev.embeds).

2) Переслать текст, который вы передаёте командой (простая пересылка)

```js
// те же импорты и client
if (cmd === 'sendto') {
  const channelId = targetChannelId || message.channel.id;
  const text = message.content.split(/\s+/).slice(2).join(' '); // после !sendto <channelId> <текст>
  if (!text) return message.reply('Укажите текст для пересылки.');
  const target = await client.channels.fetch(channelId).catch(() => null);
  if (!target || !target.isTextBased()) return message.reply('Неверный канал.');
  await target.send({ content: `${message.author.tag} просил переслать:\n${text}` });
  return message.reply('Переслано.');
}
```

3) Что делать, если нужно переслать конкретное сообщение по ID (в другом канале)
- Используйте client.channels.fetch(channelId).then(ch => ch.messages.fetch(messageId)) — получите сообщение и отправьте его содержимое/вложения в нужный канал.

Важно:
- Без включённого Message Content Intent бот не сможет читать содержание сообщений (если вы не используете только slash-команды и interaction options).
- При пересылке файлов можно передавать URL в files, но если вложение приватное — убедитесь, что бот может получить доступ.
- Копирование embed'ов: prev.embeds можно передать в send({ embeds: prev.embeds }) — но иногда нужно реконструировать embed, если он нестандартен.

Если скажете точнее:
- как вы вызываете команду (префикс или slash),
- куда пересылать (в тот же канал, другой канал, DM),
- что именно пересылать (только текст, с вложениями, embed),
— я дам готовый пример под ваш случай.
Ага, а попытки где? Или готовое решение хотите получить? <br/> <br/> <b>UPD:</b> <br/> <pre><code class="javascript">const Discord = require('discord.js');
const client = new Discord.Client();
const env = require('./env.json');

const store = new Map();
const commands = new Map([
    ['reply', message =&gt; {
        if (store.has(message.channel.guild.id)) {
            const guild = store.get(message.channel.guild.id);

            if (guild.has(message.channel.id)) {
                const channel = guild.get(message.channel.id);

                message.delete();

                if (channel.has(message.author.id)) {
                    message.channel.send(`${message.author.username}: ${channel.get(message.author.id)}`);
                }
            }
        }
    }]
]);
const prefix = '!';

client.on('ready', () =&gt; {
    console.log(`Бот ${client.user.tag} запущен`);
});

client.on('message', message =&gt; {
    if (message.content.startsWith(prefix)) {
        const command = message.content.slice(prefix.length);

        if (commands.has(command)) {
            commands.get(command)(message);
        }
    } else {
        const guild = store.has(message.channel.guild.id)
            ? store.get(message.channel.guild.id)
            : new Map();
        const channel = guild.has(message.channel.id)
            ? guild.get(message.channel.id)
            : new Map();
        channel.set(message.author.id, message.content);
        guild.set(message.channel.id, channel);
        store.set(message.channel.guild.id, guild);
    }
});

client.login(env.token);</code></pre>
Похожие вопросы