Как сделать команду в дискорд боте, которая принимает на вход файл

Как сделать команду которая принимает файл(изображение) сохраняет его в папке, или сохраняет его url? Подразумевается такое использование: >test (прикреплено изображение) и программа допустим сохраняет в переменную data url адрес этого изображения или сохраняет его в папке с программой в png или jpg файл


Ответы (1 шт):

Автор решения: denisnumb

У класса discord.Message

введите сюда описание изображения

есть атрибут attachments

введите сюда описание изображения

хранящий список прикрепленных к этому сообщению файлов в виде экземпляров класса discord.Attachment

введите сюда описание изображения

у которого, в свою очередь есть атрибуты:

  • content_type, хранящий в виде строки тип файла в формате Media type

  • filename — имя прикрепленного файла

  • url — ссылка на файл

и другие, про которые можно также почитать в документации.


Далее, из контекста ctx получаем объект сообщения ctx.message, а из него список его файлов ctx.message.attachments.

Фильтруем список по типу файлов, чтобы там остались только изображения и, если список не пустой, то сохраняем все файлы и отправляем сообщение.

import discord
from discord.ext import commands


bot = commands.Bot(command_prefix='>', intents=discord.Intents.all())

@bot.command(name='test')
async def test(ctx: commands.Context) -> None:
    images = [file for file in ctx.message.attachments if 'image' in file.content_type]

    if not images:
        return await ctx.reply('Прикрепите изображение(я)')

    for image in images:
        with open(image.filename, 'wb') as image_file:
            await image.save(image_file)

    await ctx.reply(f'Сохраненные изображения: ' + ', '.join(f'[{image.filename}](<{image.url}>)' for image in images))
    
    
bot.run('TOKEN')

Результат:

введите сюда описание изображения

введите сюда описание изображения


В документации есть вся информация. По возможности, старайтесь сначала самостоятельно изучать содержимое классов, с которыми вы можете работать, обрабатывая команды.

На всякий случай, вот руководство по работе с документацией

→ Ссылка