Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как сделать чтобы телеграмм бот на aiogram отправлял полученное сообщение(текст, фотки, видео, файлы) вместе

ВАНSh0tnik Знаток (425), на голосовании 6 часов назад
Я отправил текст и 2 фото, и мне пришло одним сообщением текст и 2 фото
Помогите пж, не могу найти нужную информацию
Дополнен 1 месяц назад
Код для Aiogram 3.x
Голосование за лучший ответ
FeniksD Мастер (1675) 1 месяц назад
from aiogram import Bot, Dispatcher, executor, types
from aiogram.types import InputMediaPhoto, InputMediaVideo, InputMediaDocument, ContentType
import asyncio

# Замените на свой токен
API_TOKEN = 'YOUR_BOT_TOKEN'

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

# Хранилище для временного накопления сообщений
user_data = {}

async def send_collected_media(chat_id):
data = user_data.get(chat_id)
if not data:
return

text = data.get("text")
media = data.get("media", [])

if text:
if media:
media[0].caption = text
else:
await bot.send_message(chat_id=chat_id, text=text)

if media:
await bot.send_media_group(chat_id=chat_id, media=media)

# Очистка хранилища после отправки
user_data[chat_id] = {}

async def add_to_group(message: types.Message, media_type, media):
chat_id = message.chat.id
if chat_id not in user_data:
user_data[chat_id] = {}

if "timer" in user_data[chat_id]:
user_data[chat_id]["timer"].cancel()

if media_type == "text":
user_data[chat_id]["text"] = message.text
else:
if "media" not in user_data[chat_id]:
user_data[chat_id]["media"] = []
user_data[chat_id]["media"].append(media)

# Установка таймера на отправку через 1 секунду
user_data[chat_id]["timer"] = asyncio.create_task(asyncio.sleep(1))
user_data[chat_id]["timer"].add_done_callback(lambda _: asyncio.create_task(send_collected_media(chat_id)))

@dp.message_handler(content_types=[ContentType.TEXT])
async def handle_text(message: types.Message):
await add_to_group(message, "text", None)


@dp.message_handler(content_types=[ContentType.PHOTO])
async def handle_photo(message: types.Message):
photo = message.photo[-1]
media = InputMediaPhoto(media=photo.file_id)
await add_to_group(message, "photo", media)

@dp.message_handler(content_types=[ ContentType.VIDEO ])
async def handle_video(message: types.Message):
video = message.video
media = InputMediaVideo(media=video.file_id)
await add_to_group(message, "video", media)

@dp.message_handler(content_types=[ContentType.DOCUMENT])
async def handle_document(message: types.Message):
document = message.document
media = InputMediaDocument(media=document.file_id)
await add_to_group(message, "document", media)

if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)

Как это работает:

  • Когда пользователь отправляет сообщения, они накапливаются в user_data.
  • После каждого сообщения запускается таймер на 1 секунду.
  • Если в течение этой секунды приходит новое сообщение, таймер сбрасывается.
  • Если новых сообщений нет, через 1 секунду срабатывает таймер и вызывается функция send_collected_media, которая отправляет все накопленные сообщения.
Похожие вопросы