Существует два способа, которыми изображение может быть в сообщении.Это может быть вложение в это сообщение, где вы загружаете изображение со своего компьютера в Discord, или это может быть вставка, что происходит при вставке ссылки в Discord.
Пользователи реагируют на сообщения, а не на изображения.Всякий раз, когда пользователь реагирует на сообщение, о котором знает ваш бот, он вызывает событие on_reaction_add
.Мы можем поместить код в это событие, чтобы проверить наличие определенной реакции, а затем сохранить файлы.
@bot.event
async def on_reaction_add(reaction, user):
if reaction.emoji == '\N{WHITE HEAVY CHECK MARK}':
for embed in reaction.message.embeds:
if embed.url is not discord.Embed.Empty:
url = embed.url
name = url[url.rfind('/')+1:]
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
if resp.status == 200:
with open(f'imgs/{name}', 'wb+') as file:
file.write(await resp.read())
for attachment in reaction.message.attachments:
await attachment.save(f'imgs/{attachment.filename}')
Я написал это для более поздней ветки переписывания, версии 1.0.Если вы используете более старую асинхронную ветвь, 0.16, вам нужно будет изменить способ сохранения вложений.Я считаю, что вложения в более старых версиях хранились как словари, а не как объекты вложения.
Имейте в виду, что on_reaction_add
запускается только для сообщений, которые кэшировал ваш бот. Реакции на старые сообщения не будут вызывать событие.