Задать вопрос

Pyrogram bot: как отправить фото по айди?

Сразу к делу. Это функция, считывающая сообщения чата и если там есть фото - пересылает в другой:
(обработка сообщений возможно не доработана ещё, но проблема не в этом)
async def get_last_messages(target):    #получаем юзернейм чата в функцию
    async for message in app.get_chat_history(target, limit=5, offset_id=-1):    #ищем с конца, например 5 сообщений
        print(message.text)    #для себя
        print()
        if message.chat.photo:    #если есть фото
            print(message.chat.photo) #для себя, чтобы видеть поля
            sphoto = message.chat.photo.big_file_id    #присваеваем id в переменную
            await app.send_photo(cfg.CHAT_ID, f"{sphoto}")    #пытаемся отправить


Ошибка в консоли:

File "C:\Users\Entire\AppData\Local\Programs\Python\Python310\lib\site-packages\pyrogram\utils.py", line 57, in get_input_media_from_file_id
raise ValueError(f"Expected {expected_file_type.name}, got {file_type.name} file id instead")
ValueError: Expected PHOTO, got CHAT_PHOTO file id instead


Цитата из официальной документации Pyrogram:
photo (str | BinaryIO) – Photo to send. Pass a file_id as string to send a photo that exists on the Telegram servers, pass an HTTP URL as a string for Telegram to get a photo from the Internet, pass a file path as string to upload a new photo that exists on your local machine, or pass a binary file-like object with its attribute “.name” set for in-memory uploads.

https://docs.pyrogram.org/api/methods/send_photo

Что посоветуете делать? Как с этим бороться? Оба чата открыты.
  • Вопрос задан
  • 1318 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 1
EntireMusic
@EntireMusic Автор вопроса
(:
Всем большое спасибо за подсказки, особенно User . Проблема была как раз в фильтре. Нужно было искать photo и photo.file_id.
Универсальный вариант - скачивать и отправлять фото, т.к. пересылка не будет работать из закрытых чатов. Вот такую функцию по-быстрому сообразил для загрузки фото.
async def dl_last_photo(target):    #передаём в функцию ID или Username чата
    async for msg in app.get_chat_history(target, limit = 50, offset_id = -1):    #ищем в истории с конца, обрабатываем 50 сообщений
        if msg.photo:    #если есть фото
            print(msg.photo.file_id)    #в консоль выводим ID - не обязательно
            await app.download_media(msg.photo) #скачиваем фото из сообщения в стандартный каталог (папка_бота/downloads)


По аналогии можно фильтровать и другие типы файлов. Так же можно менять папку, куда скачивается файл. И если вы уверены, что чат открыт и разрешена пересылка - можно и сразу переслать фото по ID куда нужно.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Полагаю, в лоб никак. В документации Telegram сказано, что big_file_idможно использовать только для download.
В общем, видимо, вам придется их куда-то скачивать (в память?) и затем отдавать в другой чат.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы