python, disnake - Как отправить картинку по url?

Рейтинг: 1Ответов: 2Опубликовано: 27.03.2023

Делаю Дискорд-бота с помощью библиотеки disnake. Не понимаю, как отправить изображение, имея только его URL, при этом не используя стиль Embed?

Также вылезает эта ошибка: disnake.ext.commands.errors.CommandInvokeError: Command raised an exception: TypeError: expected str, bytes or os.PathLike object, not list. Гуглил и не понял. Помогите исправить.

@bot.slash_command(name='pictures', description='Поиск картинок в Интернете.')
async def pictures(inter, request : str, count=3):
    parser = YandexImage()

    pictures = []

    for url in parser.search(request):
        cicles = 0
        pictures.append(url.url)
        cicles += 1
        if cicles == count:
            break

    await inter.send(f'Результат по вашему запросу: {request}', file=disnake.File([pictures]))

Если что библиотека YandexImage просто парсит картинки по HTTP-запросу из Яндекса и заносит их URL в список pictures.

Ответы

▲ 0Принят

Чтобы отправить изображение по URL, можно воспользоваться методом await inter.send(file=...) и передать ему объект типа io.BytesIO, полученный с помощью requests:

@bot.slash_command(name='pictures', description='Поиск картинок в Интернете.')
async def pictures(inter, request: str, count=3):
    parser = YandexImage()

    pictures = []
    cicles = 0

    for url in parser.search(request):
        pictures.append(url.url)
        cicles += 1
        if cicles == count:
            break

    for picture_url in pictures:
        response = requests.get(picture_url)
        image_bytes = io.BytesIO(response.content)
        await inter.send(file=disnake.File(image_bytes, filename='image.png')))
▲ 0

Если вы хотите использовать картинку в ембеде и не скачивать её, используйте эту функцию

embed.set_image(url="https://disnake.dev/assets/disnake-banner-thin.png")

Документация