@plsHelp11

Pyrogram пересылает группу медиафайлов несколько раз?

При отправке сообщения из n-ого кол-ва медиафайлов, бот присылает n-ое кол-во сообщений (т.е. 2 медиафайла - 2 сообщения)
Отправляю в этот канал медиафайлы 2+ одним сообщением: 64035bd6b48e6633731324.png
Сюда приходит 2 одинаковых сообщения: 64035c064d93c629812004.png

import pyrogram
import config

channels = []
lm = []

with open('channels.txt','r') as f:
	for channel in f.read().split('\n'):
		channels.append(channel)

app = pyrogram.Client('my_account', config.api_id, config.api_hash)

@app.on_message()
def copy_to_my_channel(app, message):
	print(message)
	if str(message.chat.id) in channels:
		if message.media_group_id == None:
			app.copy_message(from_chat_id = message.chat.id, chat_id = config.my_channel, message_id = message.id)
		else:
			if message.media_group_id not in lm:
				app.copy_media_group(from_chat_id = message.chat.id, chat_id = config.my_channel, message_id = message.id)
				
				lm.append(message.media_group_id)
		print('Пост опубликован')

app.run()
  • Вопрос задан
  • 1128 просмотров
Пригласить эксперта
Ответы на вопрос 2
TemaSM
@TemaSM
Fullstack, DevOps, InfSec
Проблема заключается в том, что Pyrogram метод copy_media_group() отправляет каждый медиафайл как отдельное сообщение, что приводит к отправке нескольких сообщений вместо одного с группой медиафайлов.

Для исправления этой проблемы вам нужно использовать метод send_media_group() вместо copy_media_group(). Метод send_media_group() отправляет все медиафайлы в одном сообщении, что дает возможность отправлять группу медиафайлов как единое сообщение.

Ниже приведен исправленный код:
import pyrogram
import config

channels = []
lm = []

with open('channels.txt','r') as f:
  for channel in f.read().split('\n'):
    channels.append(channel)

app = pyrogram.Client('my_account', config.api_id, config.api_hash)

@app.on_message()
def copy_to_my_channel(app, message):
  print(message)
  if str(message.chat.id) in channels:
    if message.media_group_id is None:
      app.copy_message(from_chat_id=message.chat.id, chat_id=config.my_channel, message_id=message.message_id)
    else:
      if message.media_group_id not in lm:
        media_group = app.get_media_group(chat_id=message.chat.id, message_id=message.message_id)
        app.send_media_group(chat_id=config.my_channel, media=media_group)
        lm.append(message.media_group_id)
    print('Пост опубликован')

app.run()

В этом коде мы использовали метод get_media_group() для получения группы медиафайлов из оригинального сообщения, а затем отправили ее в новый канал, используя метод send_media_group().
Ответ написан
@SVBazuev
В Pyrogram надо обрабатывать поток сообщений.
Медиа группа не является контейнером в прямом смысле,
это скорее средство визуальной группировки.

import pyrogram
import config

channels = []
lm = []

with open('channels.txt','r') as f:
  for channel in f.read().split('\n'):
    channels.append(int(channel))

app = pyrogram.Client('my_account', config.api_id, config.api_hash)

@app.on_message(filters.chat(channels))
async def copy_to_my_channel(app, message):

  if message.media_group_id is None:
    app.copy_message(from_chat_id=message.chat.id,
                     chat_id=config.my_channel,
                     message_id=message.message_id
                     )
  else:
    media_group = await client.get_media_group(
        message.chat.id, message.id)

    output_line = (
      f"Это первое сообщение, id: {message.id}"
      if message.id == media_group[0].id
      else f"Следующее сообщение, id: {message.id}"
      if message.id != media_group[-1].id
      else f"Это последнее сообщение в медиа-группе, id: {message.id}"
      )
    print(output_line)

    # Обрабатывать сообщения в потоковом режиме
    if message.video:
      _media = await client.download_media(
      message.video.file_id, in_memory=True,
      file_name=message.video.file_name
      )

    elif message.audio:
      _media = await client.download_media(
        message.audio.file_id, in_memory=True
        )

    elif message.photo:
      _media = await client.download_media(
        message.photo.file_id, in_memory=True
        )

    elif message.document:
      _media = await client.download_media(
        message.document.file_id, in_memory=True,
        file_name=message.document.file_name
        )

    lm.append(_media)

    # Отправлять к себе в канал надо после обработки последнего сообщения
    if message.id == media_group[-1].id:
      await client.copy_media_group(
        chat_id=config.my_channel, message.chat.id, message.id
        )
      print('Пост опубликован')

app.run()


Успехов!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы