У меня есть этот код
file_name = f'photo_{update.message.message_id}_{photo.file_unique_id}.jpg'
full_download_url = f"https://api.telegram.org/file/bot{BOT_TOKEN}/{download_url}"
logger.info(f'Downloading photo from URL: {full_download_url}')
response = requests.get(full_download_url)
response.raise_for_status()
with open(file_name, 'wb') as f:
f.write(response.content)
Этот код находит URL-адрес телеграммы
Telegram отправляет изображения в нескольких сообщениях или обновлениях в одном и том же контексте. Мне трудно заставить эту часть работать, когда она загружает изображения. В настоящее время этот код загружает одно и то же изображение 4 раза вместо проверки фактического количества изображений в обновлении. Таким образом, даже если я отправлю 2 изображения, он все равно просто загружает первое изображение и перебирает его, переименовывая и сохраняя его 4 раза. Не могли бы вы подсказать, как решить эту проблему?
async def download_photo(update: Update, context: ContextTypes.DEFAULT_TYPE):
photos = update.message.photo
media_paths = []
for photo in photos:
file_id = photo.file_id
logger.info(f'Processing photo with file_id: {file_id}')
try:
file_info = await context.bot.get_file(file_id)
download_url = file_info.file_path # Use the file_path directly
# Create a unique filename for each photo
file_name = f'photo_{update.message.message_id}_{photo.file_unique_id}.jpg'
# Log the full download URL
full_download_url = f"https://api.telegram.org/file/bot{BOT_TOKEN}/{download_url}"
logger.info(f'Downloading photo from URL: {full_download_url}')
# Download the photo using the full download URL
response = requests.get(full_download_url)
response.raise_for_status()
with open(file_name, 'wb') as f:
f.write(response.content)
media_paths.append(file_name)
logger.info(f'Downloaded photo successfully with file_id: {file_id}')
except Exception as e:
logger.error(f'Error downloading photo with file_id {file_id}: {e}')
logger.info(f'All downloaded media paths: {media_paths}')
Несколько фотографий в одном сообщении на самом деле представляют собой несколько сообщений, сгруппированных вместе с уникальным media_group_id
. Каждое обновление сообщения, которое вы получаете, содержит только одну фотографию. Поле photos
в обновлении message
представляет собой массив объектов PhotoSize
(см. документацию Message). Telegram отправляет в этом массиве одно и то же изображение нескольких размеров, отсортированное от меньшего к большему.
Чтобы загрузить все фотографии в сообщении, вам необходимо обработать все обновления сообщения и для каждого загрузить последнее изображение в массиве (самое высокое разрешение).
Вот как вы можете изменить свой цикл с помощью условия:
async def download_photo(update: Update, context: ContextTypes.DEFAULT_TYPE):
photo = update.message.photo
media_paths = []
if photo:
file_id = photo[-1].file_id
... # proceed with the rest of your logic
И внедрите эту логику в своего бота, чтобы он обрабатывал все соответствующие message
обновления.