Какая может быть причина ошибки при отправке сообщения через бота в Telegram в личные сообщения?

У меня есть код, который предназначен для отправки сообщений через кнопку вызова техподдержки в личные сообщения сотруднику техподдержки, однако он работает некорректно. Когда сообщение состоит исключительно из текста, оно передается правильно, но если к тексту добавляется вложение, то пересылаются только вложения, а текст не передается. Можно ли выяснить причину этой проблемы и как её решить? <br/> <pre><code class="javascript">import { BotService } from "./bot.service";
import { InjectBot, Start, Update, On } from "nestjs-telegraf";
import { Telegraf, Context } from "telegraf";
import { Message } from 'telegraf/typings/core/types/typegram';

interface SessionData {
    waitingForSupportMessage?: boolean;
    userMessageId?: number;
    userId?: number;
}

interface MyContext extends Context {
    session?: SessionData;
}

@Update()
export class BotController {
    private readonly supportChatId = **********; // ID техподдержки

    constructor(
        @InjectBot() private readonly bot: Telegraf&lt;MyContext&gt;,
        private readonly botService: BotService,
    ) {
        console.log("Bot initialized");
    }

    @Start()
    async startCommand(ctx: MyContext) {
        console.log("Команда /start получена");
        const photoUrl = "https://***orto.ru/images/Logo.png";
        const caption =
            "Все с доставкой";

        const options = {
            reply_markup: {
                inline_keyboard: [
                    [{ text: "Site / Сайт", url: "https://***orto.ru/ru" }],
                    [{ text: "Technical support / Техническая поддержка", callback_data: "support_request" }],
                ],
            },
        };

        await ctx.telegram.sendPhoto(ctx.chat.id, photoUrl, {
            caption: caption,
            ...options,
    
  • 3 февраля 2025 г. 10:14
Ответы на вопрос 2
Ваша проблема, связанная с отправкой сообщений через бота в Telegram, может быть вызвана несколькими факторами. Исходя из вашего описания, когда сообщение включает вложения, текст не отправляется, а только вложения. Это может происходить из-за особенностей структуры ваших запросов и методов API Telegram.

### Возможные причины:

1. **Метод отправки сообщений**:
   - Telegram API не позволяет отправлять текст и вложения одним запросом, если они не являются частью одной функции (например, оформление изображения с заголовком). Вам нужно убедиться, что вы используете правильные методы для отправки текста и вложений (например, `sendMessage` для текста и `sendPhoto` для изображений).

2. **Проблема с формированием сообщения**:
   - Если вы пытаетесь отправить текст как часть вложений, Telegram может игнорировать текст, если это не явно указано. Для начала попробуйте сначала отправить текст, а потом вложение, чтобы убедиться, что оба сообщения доставляются.

3. **Некорректная работа с опциями**:
   - Убедитесь, что вы правильно передаете параметры в метод отправки, и что они соответствуют разработанному API. Например, если вы используете `sendPhoto`, текстовое содержимое (caption) должно быть передано правильно.

### Решение:

Вы можете попробовать изменить логику вашего кода для отправки сообщений следующим образом:

1. Сначала отправьте текст с помощью метода `sendMessage`, а затем отправьте вложения.

```javascript
// Пример отправки сообщения с вложением
await ctx.telegram.sendMessage(this.supportChatId, "Сообщение от пользователя: " + userMessage);

// Затем отправьте файл
await ctx.telegram.sendPhoto(this.supportChatId, {
    url: photoUrl,
    caption: caption,
});
```

2. Убедитесь, что вы проверяете наличие и правильность всех параметров, передаваемых в `sendPhoto` или другие методы. Необходимо подтвердить, что `photoUrl` корректно указывает на существующий ресурс.

3. Проверьте, что ваши права доступа и настройки бота позволяют ему отправлять сообщения и вложения.

### Пример исправленного кода

```javascript
@On("callback_query") // Обработка нажатия на кнопку
async handleSupportRequest(ctx: MyContext) {
    if (ctx.callbackQuery.data === "support_request") {
        const userMessage = "Ваше сообщение с техподдержкой"; // сообщение от пользователя

        // Отправка текстового сообщения
        await ctx.telegram.sendMessage(this.supportChatId, "Сообщение от пользователя: " + userMessage);

        // Теперь отправляем вложение
        const photoUrl = "https://***orto.ru/images/Logo.png";
        await ctx.telegram.sendPhoto(this.supportChatId, photoUrl, { caption: "Все с доставкой" });
    }
}
```

Таким образом, вы сможете отправить текстовое сообщение и вложение последовательно, что должно устранить вашу проблему.
Для этого можно использовать метод forwardMessage 

Он пересылает любое сообщение с любыми вложениями, от текста с картинками до голосовых
Похожие вопросы