Я хочу, чтобы бот дискорда вставлял случайное изображение с unsplash.com

avatar
Issa Al-Salmi
9 августа 2021 в 06:45
113
3
1

я осмотрелся и мне удалось получить этот код:

@bot.command()
async def image(ctx):
      embed=discord.Embed(title="Image", color=0x4797ff)
      embed.set_image(url='https://source.unsplash.com/random')       
      embed.set_footer(text="")
      await ctx.send(embed=embed)

команда работает но это всегда дает мне один и тот же образ , я не знаю почему.

Источник

Ответы (3)

avatar
Danya02
13 августа 2021 в 09:01
1

Это из-за кэширования Discord. Discord предполагает, что одна ссылка всегда будет вести к одному и тому же контенту, а в случае «случайных» ссылок Unsplash это не так. Тем не менее, после того как серверы Discord загрузили это изображение один раз, они некоторое время не загружают его повторно, а когда та же ссылка появляется во второй раз, они загружают изображение со своих собственных серверов.

И @FierySpectre, и @Issa Al-Salmi использовали в своем ответе одну и ту же идею: сначала запросите это изображение самостоятельно, выполните перенаправление, а затем отобразите изображение, на которое указывает перенаправление. Это работает, но вас может беспокоить тот факт, что вы загружаете образ без необходимости.

Этого можно избежать, установив параметр запроса со случайным значением — серверы игнорируют те параметры, которых они не ожидали, и Discord кэширует каждый из них отдельно. Вы можете использовать UUID для создания уникального значения.

import uuid

...

@bot.command()
async def image(ctx):
      embed=discord.Embed(title="Image", color=0x4797ff)
      embed.set_image(url='https://source.unsplash.com/random?id=' + str(uuid.uuid4()))
      await ctx.send(embed=embed)
avatar
Issa Al-Salmi
9 августа 2021 в 08:52
1

я исправил это и решил опубликовать здесь на случай, если у кого-то возникнет такая же проблема

import aiohttp
@bot.command()
async def image(ctx):  
      async with aiohttp.ClientSession() as s:
        async with s.get('https://source.unsplash.com/random') as r:
          await ctx.send(r.url)
FierySpectre
9 августа 2021 в 09:38
0

Ваше решение лучше моего, так как оно более асинхронно, а мое блокирует.

avatar
FierySpectre
9 августа 2021 в 08:15
0

Человек, задавший вопрос, тоже ответил на него, причём лучше. Вероятно, вам следует использовать его решение, а не мое.

Честно говоря, я понятия не имею, почему именно это происходит. Я подозреваю, что Discord загружает его один раз, а затем обнаруживает, что та же ссылка уже кэширована и не получает новое изображение. Я смог решить проблему, используя запросы на получение новой страницы каждый раз, таким образом, Discord не нужно каждый раз получать изображение (поскольку вы сами получаете прямую ссылку на изображение). Также все пользователи теперь видят одно и то же изображение.

код:

@bot.command()
async def image(ctx):
    embed = discord.Embed(title="Image", color=0x4797ff)
    img = requests.get('https://source.unsplash.com/random')
    embed.set_image(url=img.url)
    embed.set_footer(text="")
    await ctx.send(embed=embed)

конечно, вы также должны включить import request вверху вашей программы