How to get the message content/embed from the message id?

Question:

I want to know how to get a message content (specifically the embeds) from the message id? Just like you can get the member using a member id

Asked By: Jackie

||

Answers:

on_raw_reaction_add() example:

@bot.event
async def on_raw_reaction_add(payload):
    channel = bot.get_channel(payload.channel_id)
    msg = await channel.fetch_message(payload.message_id)
    embed = msg.embeds[0]
    # do something you want to

Command example:

@bot.command()
async def getmsg(ctx, channel: discord.TextChannel, msgID: int):
    msg = await channel.fetch_message(msgID)
    await ctx.send(msg.embeds[0].description)

In the command I’m passing in channel and msgID, so a sample command execution would like !getmsg #general 112233445566778899 – the channel must be in the same server that you’re executing the command in!

Then I’m getting the message object using the fetch_message() coroutine, which allows me to get a list of embeds in said message. I then choose the first, and only, embed by choosing position index 0.

After that, the bot then sends the description (or whatever attribute you’d like) of the embed.


References:

Answered By: Diggy.
@bot.event 
async def on_raw_reaction_add(ctx):
    if (ctx.user_id != bot_id):
        channel = bot.get_channel(ctx.channel_id)
        msg = await channel.fetch_message(ctx.message_id)
        msg_embed = msg.embeds[0]
    
        if (...):

When I use this, terminal always send me that, but I don’t understand where is the problem

Ignoring exception in on_raw_reaction_add
Traceback (most recent call last):
  File "...client.py", line 343, in _run_event
    await coro(*args, **kwargs)
  File "...main.py", line 124, in on_raw_reaction_add
    msg_embed = msg.embeds[0]
IndexError: list index out of range
Answered By: Dlmr