You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在discord.py中实现机器人以Embed形式发送响应?附通缉令生成命令代码疑惑求解

嘿,我来帮你搞定这两个问题!先从Embed响应的进阶用法说起,再给你优化那个通缉令命令的示例代码~

在discord.py中用Embed发送响应(进阶版)

既然你已经掌握了基础方法,咱直接来搞更实用的进阶写法,让你的机器人响应更美观:

@client.command()
async def fancy_embed(ctx):
    # 初始化Embed对象,设置标题、描述和主题色
    embed = discord.Embed(
        title="专属通知📢",
        description="这是一条用Embed发送的机器人响应,比纯文本好看多啦!",
        color=discord.Color.blue()  # 也可以用十六进制值,比如0x0099FF
    )

    # 添加可折叠的字段,inline=True表示多字段并排,False则独占一行
    embed.add_field(name="用户信息", value=f"发起者:{ctx.author.mention}\n服务器:{ctx.guild.name}", inline=False)
    embed.add_field(name="功能提示", value="输入`!help`查看更多命令", inline=True)
    embed.add_field(name="更新时间", value="2024年10月", inline=True)

    # 设置作者信息(显示在Embed顶部)
    embed.set_author(name=ctx.author.display_name, icon_url=ctx.author.avatar.url)
    # 设置缩略图(小图标)
    embed.set_thumbnail(url=ctx.guild.icon.url)
    # 设置主图(Embed底部的大图)
    embed.set_image_url("https://example.com/your-image.jpg")  # 替换成你的图片链接
    # 设置脚注(Embed最底部的文本)
    embed.set_footer(text="由你的专属机器人发送", icon_url=client.user.avatar.url)

    # 发送Embed
    await ctx.send(embed=embed)
优化后的通缉令生成命令示例

你原来的代码有几个小问题(比如本地文件容易被并发请求覆盖、API版本过时),我给你调整成更稳定且结合Embed的版本:

from io import BytesIO
from PIL import Image
import discord
from discord.ext import commands

@client.command(name="wanted")
async def generate_wanted(ctx, user: discord.Member = None):
    # 若未指定用户,默认使用命令发起者
    target_user = user or ctx.author

    try:
        # 打开通缉令模板图片(确保脚本目录下有wanted.jpg文件)
        wanted_template = Image.open("wanted.jpg")
        
        # 获取用户头像并调整尺寸(适配模板位置)
        avatar_buffer = BytesIO(await target_user.avatar.read(size=128))
        user_avatar = Image.open(avatar_buffer).resize((257, 257))
        
        # 将头像粘贴到模板的指定坐标(99,201是你原来的位置,可根据模板调整)
        wanted_template.paste(user_avatar, (99, 201))

        # 用内存缓冲区保存生成的图片,避免本地文件冲突
        output_buffer = BytesIO()
        wanted_template.save(output_buffer, format="JPEG")
        output_buffer.seek(0)  # 重置缓冲区指针到开头

        # 创建配套的Embed,让通缉令更有氛围感
        embed = discord.Embed(
            title=f"🔴通缉令 | {target_user.display_name}",
            description=f"{target_user.mention}已被列入全网通缉名单!",
            color=discord.Color.red()
        )
        # 将生成的图片作为附件嵌入到Embed中
        wanted_file = discord.File(output_buffer, filename="wanted_profile.jpg")
        embed.set_image(url="attachment://wanted_profile.jpg")

        # 发送带Embed的完整响应
        await ctx.send(embed=embed, file=wanted_file)

    except FileNotFoundError:
        await ctx.send("❌错误:找不到通缉令模板文件`wanted.jpg`!")
    except Exception as e:
        await ctx.send(f"⚠️生成通缉令时出错:{str(e)}")

优化点说明:

  • BytesIO内存缓冲区代替本地文件保存,解决多用户同时使用时的文件覆盖问题
  • 替换了discord.py v2.x版本已过时的avatar_url_as,改用avatar.read()获取头像数据
  • 添加了错误捕获,模板丢失或其他异常时会给用户明确提示
  • 结合Embed展示通缉令,比单纯发文件更有仪式感

内容的提问来源于stack exchange,提问作者IDK

火山引擎 最新活动