discord.py - Невозможно получить средний цвет аватара пользователя - PullRequest
1 голос
/ 30 мая 2020

Итак, у меня есть эта функция для возврата среднего цвета аватара пользователя:

import discord
from discord.ext import commands
import asyncio
from PIL import Image
import requests
from io import BytesIO

class Bot(commands.Bot):

    ...

    @staticmethod
    async def get_average_colour(image_url, default=0x696969):
        try:
            resp = requests.get(image_url)
            assert resp.ok
            img = Image.open(BytesIO(resp.content))
            img2 = img.resize((1, 1), Image.ANTIALIAS)
            colour = img2.getpixel((0, 0))
            res = "{:02x}{:02x}{:02x}".format(*colour)
            return int(res, 16)
        except:
            return default

    ...

Это работает, но проблема в том, что он использует requests, который блокирует . Поэтому я попытался использовать вместо этого aiohttp:

import discord
from discord.ext import commands
import asyncio
from PIL import Image
import aiohttp
from io import BytesIO

class Bot(commands.Bot):

    ...

    @staticmethod
    async def get_average_colour(image_url, default=0x696969):
        try:
            async with aiohttp.ClientSession() as session:
                async with session.get(image_url) as resp:
                    if resp.status != 200:
                        raise Exception
                    img = Image.open(BytesIO(await resp.read()))
            colour = img.resize((1, 1), Image.ANTIALIAS).getpixel((0, 0))
            return int("{:02x}{:02x}{:02x}".format(*colour), 16)
        except:
            return default

    ...

Когда я попытался найти средний цвет ссылки случайного изображения кошки , функция работает нормально, но когда я пытаюсь вызвать эту функцию с помощью пользователя avatar_url, функция всегда возвращает значение по умолчанию. Кто-нибудь знает, что не так с этой функцией?

Ответы [ 2 ]

0 голосов
/ 30 мая 2020

Хороший способ - преобразовать image_url в строку. Таким образом, он всегда останется строкой, а не объектом discord.Asset.

0 голосов
/ 30 мая 2020

Похоже, что вызов async with session.get(str(image_url)) as resp: вместо async with session.get(image_url) as resp: работает.

...