В разработке приложений взаимодействующих с telegram bot api часто возникает необходимость отправки нескольких файлов одновременно. (Я использую этот механизм для отладки иногда)
Telegram API предоставляет для этого специальный метод sendMediaGroup
, который позволяет отправлять до 10 файлов в одном сообщении. В этой статье разберемся, как использовать этот метод с помощью различных инструментов.
Преимущества использования sendMediaGroup#
- Все файлы группируются в одно сообщение
- Уменьшается количество запросов к API
- Возможность добавления подписей к каждому файлу
- Поддержка различных типов медиа (фото, документы, видео)
Подготовка тестовых файлов#
Для демонстрации работы метода создадим два тестовых файла:
echo "Test content 1" > test1.txt
echo "Test content 2" > test2.txt
Отправка через cURL#
Самый простой способ протестировать API – использовать cURL. Вот полный пример команды:
curl -X POST https://api.telegram.org/bot<ТВОЙ_TOKEN>/sendMediaGroup \
-F chat_id="ТВОЙ_CHAT_ID" \
-F "media=[{\"type\":\"document\",\"media\":\"attach://doc1\",\"caption\":\"Test files 1\",\"parse_mode\":\"HTML\"},{\"type\":\"document\",\"media\":\"attach://doc2\",\"caption\":\"Test files 2\"}]" \
-F doc1=@"test1.txt" \
-F doc2=@"test2.txt"
Разберем параметры запроса:
-X POST
- указывает метод запроса-F
- добавляет form-data полеmedia
- JSON-массив с описанием медиафайловattach://doc1
- указывает на привязку к form-data полю doc1
Реализация на Dart#
Для тех, кто разрабатывает на Dart/Flutter, вот пример реализации той же функциональности:
import 'package:http/http.dart' as http;
import 'package:http_parser/http_parser.dart';
Future<void> sendMediaGroup() async {
final token = 'ТВОЙ_TOKEN';
final chatId = 'ТВОЙ_CHAT_ID';
final url = Uri.parse('https://api.telegram.org/bot$token/sendMediaGroup');
final request = http.MultipartRequest('POST', url)
..fields['chat_id'] = chatId
..fields['media'] = '''
[
{"type": "document", "media": "attach://doc1", "caption": "Test files 1"},
{"type": "document", "media": "attach://doc2", "caption": "Test files 2"}
]
'''
..files.add(await http.MultipartFile.fromPath('doc1', 'test1.txt'))
..files.add(await http.MultipartFile.fromPath('doc2', 'test2.txt'));
final response = await request.send();
print(await response.stream.bytesToString());
}
Важные замечания#
- Максимальное количество файлов в одной группе - 10
- Все файлы должны быть одного типа (например, все документы или все фотографии)
- Размер каждого файла не должен превышать лимиты Telegram
- Поддерживаются следующие типы медиа: photo, video, audio, document
Заключение#
Метод sendMediaGroup
- мощный инструмент для отправки нескольких файлов в одном сообщении. Он особенно полезен при разработке ботов, где требуется отправка связанных файлов или создание альбомов медиа-контента.
Спасибо что читаете! 👾