You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用discord.py发送图片求助:绘图完成后无法发送图片

Discord机器人发送生成图片的解决方案

原代码存在的问题

  • 嵌套了不必要的send函数,直接在on_message事件里处理发送逻辑即可
  • 旧版的client.send_message已被弃用,新版Discord.py推荐使用更直接的频道发送方法
  • PIL生成的Image对象不能直接传给discord.File,需要先转成字节流或保存为本地文件
  • 导入了无用的模块(msilib.schema.File、tkinter.font),会干扰代码逻辑

修正后的完整代码

from PIL import Image, ImageDraw, ImageFont
import discord
from io import BytesIO

@client.event
async def on_message(message):
    # 跳过机器人自身消息,避免触发循环
    if message.author == client.user:
        return

    username = str(message.author).split('#')[0]
    user_message = str(message.content)
    channel = str(message.channel.name)
    print(f'{username}: {user_message}({channel})')

    if username == "ChrisMightShootYou":
        # 用原始字符串避免路径转义问题
        font = ImageFont.truetype(font=r'D:\DOWNLOAD\DiscordBot\FuturaBookFont.ttf', size=84)
        image = Image.open(r'D:\DOWNLOAD\DiscordBot\erdemoji.png')
        draw = ImageDraw.Draw(im=image)
        draw.text(xy=(340, 50), text=user_message, font=font, fill='white', anchor='mm', stroke_width=4, stroke_fill='black')
        
        # 将图片转为字节流,无需保存到本地
        img_bytes = BytesIO()
        image.save(img_bytes, format='PNG')
        img_bytes.seek(0)  # 重置字节流指针到开头

        # 直接发送到当前消息所在频道
        await message.channel.send(file=discord.File(img_bytes, filename='custom_image.png'))

关键修改说明

  1. 移除无用导入:删掉了msilib.schema.File和tkinter.font,添加BytesIO用于处理图片字节流
  2. 避免消息循环:增加判断跳过机器人自己发送的消息
  3. 路径处理优化:用原始字符串定义文件路径,防止反斜杠转义出错
  4. 图片流处理:通过BytesIO将PIL生成的图片转为字节流,无需生成本地临时文件,更高效
  5. 发送逻辑简化:使用message.channel.send()直接发送到当前频道,无需手动获取频道ID

备选方案(保存本地文件发送)

如果不想用字节流,也可以先保存图片到本地再发送:

# 替换字节流相关代码
image.save('temp_custom_image.png')
await message.channel.send(file=discord.File('temp_custom_image.png'))

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:54:16