@Bubble_in_space

Как отправить embed типа object в дискорд используя webhook?

import discord
embed_obj = discord.Embed(title="<i>Заголовок</i>", colour=2216909, url= "<i>ссылка</i>")
embed_obj.set_image(url="<i>ссылка на фото</i>")
embed_obj.set_thumbnail(url="<i>ссылка на фото</i>")
embed_obj.set_footer(text="<i>Текст</i>", icon_url="<i>ссылка на фото</i>")
embed_obj.set_author(name= "<i>Текст</i>", url= "<i>ссылка</i>", icon_url= "<i>ссылка на фото</i>")
embed_obj.add_field(name="<i>Текст</i>", value="")
Disc.post(embed = embed_obj)

spoiler
{ВЕСЬ ТЕКСТ И ССЫЛКИ УБРАЛ ДЛЯ ВОПРОСА}

Сам embed cобирается без ошибок и принтом выводится как обьект:
discord.embeds.Embed object at 0x7f48da700280
При попытке отправки вылетает ошибка:
TypeError: post() got an unexpected keyword argument 'embed'
Если отправлять через embeds нужно преобразовывать в json, но и это у меня не вышло
Если создавать embed чисто json и отправлять его, то код работает, но такой вариант не подходит так как json должен гененрироваться в зависимости от запроса и способ embed_obj.set... подходит лучше всего
===
Подскажите, пожалуйста, как отправить готовый object embed или как преобразовать этот object в вид нормального json
  • Вопрос задан
  • 1910 просмотров
Решения вопроса 1
По названию функции .post, рискну предположить что Disc - экземпляр объекта типа aiohttp.ClientSession. Он не знает что такое дискорд.

Несколько вариантов развития событий решения:
1. Вы продолжаете использовать сессию для подключения и отправки запросов вручную. В таком случае вам необходимо самостоятельно передавать json endpoint'у вебхука. Получить dict для передачи в аргумент json функции post можно через Embed.to_dict().
import discord
import aiohttp

session = aiohttp.ClientSession()

# Discord поддерживает только markdown для форматирования. html-теги (<i> и прочие) будут отображаться напрямую
embed_obj = discord.Embed(
    title="*Заголовок*", colour=0x21D3CD, url="https://example.com"
)  # Цвет в HEX более читаемый
embed_obj.set_image(url="https://via.placeholder.com/140x100")
embed_obj.set_thumbnail(url="https://via.placeholder.com/140x100")
embed_obj.set_footer(text="*Текст*", icon_url="https://via.placeholder.com/140x100")
embed_obj.set_author(
    name="*Текст*",
    url="https://example.com",
    icon_url="https://via.placeholder.com/140x100",
)
embed_obj.add_field(
    name="*Текст*", value="\N{Zero Width Space}"
)  # Значение поля не может быть пустым, такой embed дискорд отклонит. Используем визуально пустой символ для этого.
await session.post(
    "https://discord.com/api/webhooks/%WEBHOOK_ID%/%WEBHOOK_TOKEN",
    json={"embeds": [embed_obj.to_dict()]},
)


2. Использовать поддержку вебхуков из discord.py: https://discordpy.readthedocs.io/en/v1.4.1/api.htm....
import aiohttp
import discord

session = aiohttp.ClientSession()
webhook = discord.Webhook.from_url(
    "https://discord.com/api/webhooks/%WEBHOOK_ID%/%WEBHOOK_TOKEN",
    adapter=discord.AsyncWebhookAdapter(session),
)
embed_obj = ...
await webhook.send(embed=embed_obj)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы