Как загружать изображения с помощью aiohttp?

Итак, у меня есть дискорд-бот, с которым я играю, чтобы изучить Python. У меня есть команда, которая загружает изображения и редактирует/объединяет их, а затем отправляет отредактированное изображение в чат. Я использовал requests для этого раньше, но один из разработчиков библиотеки для discord.py сказал мне, что я должен использовать aiohttpвместо requests. Я не могу найти, как загружать изображения в aiohttp, я перепробовал кучу всего, но ничего не работает.

if message.content.startswith("!async"):
    import aiohttp
    import random
    import time
    import shutil
    start = time.time()
    notr = 0
    imagemake = Image.new("RGBA",(2048,2160))
    imgsave = "H:\Documents\PyCharmProjects\ChatBot\Images"
    imagesend = os.path.join(imgsave,"merged.png")
    imgmergedsend =os.path.join(imgsave,"merged2.png")
    with aiohttp.ClientSession() as session:
        async with session.get("http://schoolido.lu/api/cards/788/") as resp:
            data = await resp.json()
            cardsave = session.get(data["card_image"])
            with open((os.path.join(imgsave, "card.png")),"wb") as out_file:
                shutil.copyfileobj(cardsave, out_file)

это то, что у меня есть прямо сейчас, но это все еще не работает.

Итак, есть ли способ загрузить изображения?


person link2110    schedule 14.02.2016    source источник
comment
Вы пропустили await до session.get(data["card_image"]). Также cardsave является ответом, а не файлоподобным объектом. Вы должны вручную скопировать тело байтов из ответа в файл.   -  person Andrew Svetlov    schedule 15.02.2016


Ответы (2)


Вы блокируете цикл при записи файла. Вам нужно использовать aiofiles.

import aiohttp        
import aiofiles

async with aiohttp.ClientSession() as session:
    url = "http://host/file.img"
    async with session.get(url) as resp:
        if resp.status == 200:
            f = await aiofiles.open('/some/file.img', mode='wb')
            await f.write(await resp.read())
            await f.close()
person Alexey Panevin    schedule 08.08.2018

Итак, я понял это некоторое время назад:

if message.content.startswith("!async2"):
    import aiohttp
    with aiohttp.ClientSession() as session:
        async with session.get("http://schoolido.lu/api/cards/788/") as resp:
            data = await resp.json()
            card = data["card_image"]
            async with session.get(card) as resp2:
                test = await resp2.read()
                with open("cardtest2.png", "wb") as f:
                    f.write(test)

Я получил ответ, а не ответ изображения

person link2110    schedule 16.02.2016