Как отправить или переслать медиа-группу, состоящую из двух фото, с помощью библиотеки Aiogram в Telegram боте?

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

1. При отправке медиагруппы из file_id получается множество одинаковых фотографий. Как это исправить?

2. Когда я пытаюсь переслать сообщение с двумя фотографиями (отправленными мной), бот отправляет только первую фотографию и подпись о том, от кого оно было переслано. Как можно отправить обе фотографии и сохранить подпись?

3. Когда я пытаюсь скопировать сообщение, все равно копируется только первая фотография. Как это исправить?

Я пробовал использовать состояние для первого и второго фото, но полученный результат странный, и все равно выводятся одни и те же фотографии. Я уже попробовал многое, но ничего не получается. Буду благодарен за вашу помощь.
  • 22 сентября 2023 г. 19:57
Ответы на вопрос 1
Для отправки медиа-группы, состоящей из двух фото, вы можете использовать метод `send_media_group` из библиотеки Aiogram. Вот пример кода:

```python
from aiogram import Bot, Dispatcher
from aiogram.types import InputFile, MediaGroup

bot = Bot(token='your_token')
dp = Dispatcher(bot)

async def send_media_group():
    # Передайте file_id или путь к файлу в InputFile
    photo1 = InputFile('path_to_first_photo.jpg')
    photo2 = InputFile('path_to_second_photo.jpg')

    # Создайте список с объектами MediaGroup
    media_group = MediaGroup()
    media_group.attach_photo(photo1)
    media_group.attach_photo(photo2)

    # Отправьте медиа-группу
    await bot.send_media_group(chat_id='your_chat_id', media=media_group)

# Запустите функцию отправки медиа-группы
dp.run_until_disconnected(send_media_group)
```

Относительно отложенного постинга с использованием двух изображений, вы можете использовать функцию `schedule` из библиотеки `aiogram.contrib.fsm_storage.redis`. Вот пример кода:

```python
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.fsm_storage.redis import RedisStorage2
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.utils import executor
from datetime import datetime, timedelta

bot = Bot(token='your_token')
dp = Dispatcher(bot, storage=RedisStorage2())

class PostState(StatesGroup):
    photo1 = State()
    photo2 = State()

@dp.message_handler(commands=['start'])
async def start_handler(message: types.Message):
    await message.reply('Отправьте первое изображение:')
    await PostState.photo1.set()

@dp.message_handler(state=PostState.photo1, content_types=types.ContentTypes.PHOTO)
async def process_photo1(message: types.Message, state: FSMContext):
    # Вызываем эту функцию с задержкой 10 минут
    await scheduled_post(message, state, timedelta(minutes=10))

@dp.message_handler(state=PostState.photo2, content_types=types.ContentTypes.PHOTO)
async def process_photo2(message: types.Message, state: FSMContext):
    # Отправляем сообщение с двумя фотографиями
    await bot.send_media_group(chat_id='your_chat_id', media=[
        types.InputMediaPhoto(message.photo[0].file_id),
        types.InputMediaPhoto(message.photo[1].file_id)
    ])

    # Reset the state
    await state.finish()

async def scheduled_post(message: types.Message, state: FSMContext, delay: timedelta):
    now = datetime.now()
    scheduled_time = now + delay

    # Сохраняем информацию о событии в контексте состояния
    await state.update_data(
        chat_id=message.chat.id,
        photo1_file_id=message.photo[0].file_id,
        scheduled_time=scheduled_time
    )

    # Ожидаем задержку
    await asyncio.sleep(delay.total_seconds())

    data = await state.get_data()
    chat_id = data['chat_id']
    photo1_file_id = data['photo1_file_id']
    scheduled_time = data['scheduled_time']

    # Проверяем, прошло ли уже запланированное время
    if datetime.now() >= scheduled_time:
        # Отправляем сообщение с первым изображением
        await bot.send_photo(chat_id=chat_id, photo=photo1_file_id)
        # Запрашиваем второе изображение
        await message.reply('Отправьте второе изображение:')
        await PostState.photo2.set()

# Запускаем бота
executor.start_polling(dp, skip_updates=True)
```

В этом примере, при получении команды `/start`, бот будет запрашивать первое изображение у пользователя и вызывать функцию `scheduled_post` с задержкой в 10 минут. В этой функции мы сохраняем информацию о событии (chat_id, file_id первого изображения и время запланированной публикации) в состоянии и ожидаем задержку. По истечении задержки,
Похожие вопросы