Как взять уменьшенную картинку (url) из канала discord?

Когда в текстовый канал присылают картинку, её можно открыть в миниатюре, а можно нажать открыть оригинал. Если копировать ссылку уменьшенного варианта, то там в конце ссылки будет указан размер изображения, а если взять оригинал, то там без этой приставки.

Пример: Оригинал: https://cdn.discordapp.com/attachments/1021497810589339719/1024930675981287475/tLP5wpEUe6I.png

Миниатюра: https://media.discordapp.net/attachments/1021497810589339719/1024930675981287475/tLP5wpEUe6I.png?width=1084&height=676

Как вытащить просто url адрес из изображения я знаю: ctx.message.attachments[0].url , но берётся оригинал, а мне нужно именно уменьшенный вариант.

Суть вопроса: Как взять именно уменьшенный вариант картинки? Просто дописать к адресу нужный размер не вариант, потому что все картинки могут быть разного соотношения сторон и если указать для всех один размер, то будет коряво.

Подойдёт как вариант взять сразу уменьшенную версию, так и узнать размер оригинала, затем просто взять к примеру 30% от каждого числа сторон и добавить в итоговый url. Если есть несложный модуль для уменьшения изображения также по url, сгодится.

Для примера код команды, которая вытягивает просто url:

@bot.command()
@commands.has_any_role(tagger)
async def addart(ctx, *args):
    arguments = ' '.join(args)
    wrote_args = [arguments][0].split(', ')
    art_url = ctx.message.attachments[0].url
    in_tag = wrote_args
    cur.execute(f"""INSERT INTO images (URL, artist) VALUES ('{art_url}', '{in_tag[0].lower()}')""")
    cur.execute(f"""SELECT nA, artist FROM images ORDER BY nA DESC LIMIT 1""")
    out_tag = cur.fetchall()
    cur.execute(f"""INSERT INTO A_T (artID, tagID) VALUES ('{out_tag[0][0]}', '{out_tag[0][1]}')""")
    await ctx.send("Image added successfully!")
    adb.commit()

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

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

Понял, что вряд ли кто-то заморачиваться будет над помощью в таком, поэтому сделал очередной костыль:

    @bot.command()
    @commands.has_any_role(tagger)
    async def addart2(ctx, *args):
        arguments = ' '.join(args)
        wrote_args = [arguments][0].split(', ')
        art_url = ctx.message.attachments[0].url

        id_m = ctx.message.attachments[0].id
        id_ch = ctx.channel.id
        height = ctx.message.attachments[0].height
        width = ctx.message.attachments[0].width
        filename = ctx.message.attachments[0].filename

        mini_h = height
        mini_w = width

        if height >= 6000 and width >= 3500:
            mini_h = (height * 30)//100
            mini_w = (width * 30)//100

        elif height >= 4000 and width >= 6000:
            mini_h = (height * 30)//100
            mini_w = (width * 30)//100

        elif height >= 3500 and width >= 2000:
            mini_h = (height * 70)//100
            mini_w = (width * 70)//100

        mini = f'https://media.discordapp.net/attachments/{id_ch}/{id_m}/{filename}?width={mini_w}&height={mini_h}'

        in_tag = wrote_args
        cur.execute(f"""INSERT INTO size (hight, width, filename, url, mini, artist) VALUES ('{height}', '{width}', '{filename}', '{art_url}', '{mini}', '{in_tag[0].lower()}')""")
        await ctx.send("Image added successfully!")
        adb.commit()

Здесь после отправки сообщения с вложенным изображением, бот вытягивает высоту, ширину, имя файла, id канала и сообщения, раскидывая по переменным.

Все эти данные создают итоговую ссылку, в которую нужно будет вставить уже изменённые высоту и ширину.

Сделал условия, что если изображение большое, то есть параметры больше какого-либо порогового значения, которое можно назвать большим, то код берёт от этих значений 30% от числа, тем самым создаём изображение на 70% меньше разрешением. Таких проверок несколько, потому что бывают вертикальные или горизонтальные большие картинки. Для тех, что поменьше, берёт 70% от размера, чтобы слишком сильно не сжимать.

Для нормальных оставляем те же значения.

Всё отправляет в бд, но это уже не по этому вопросу.

→ Ссылка