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

Discord Py如何发送实时Python输出 实现文生图bot进度同步推送

实现方案

方案1:拦截控制台输出自动同步(适合不想改动原有生成逻辑的场景)

你可以直接接管程序的标准输出流,把所有原本打印到控制台的内容自动同步到Discord频道,操作步骤如下:

  • 先创建Discord机器人,拿到Bot Token,给机器人开放对应频道的「发送消息」「编辑消息」权限
  • 用对应编程语言的Discord SDK(Python用discord.py、JS用discord.js)初始化机器人,提前获取目标发送频道的ID
  • 重写程序的stdout/stderr方法,每次调用打印方法时,除了原本输出到控制台,同时调用Discord的消息发送/编辑接口同步内容

Python示例代码:

import sys
import discord

client = discord.Client(intents=discord.Intents.default())
CHANNEL_ID = 替换为你的频道ID
progress_msg = None

class DiscordOutput:
    def __init__(self, original_stdout):
        self.original_stdout = original_stdout
    
    def write(self, text):
        # 保留原有控制台输出
        self.original_stdout.write(text)
        # 同步到Discord
        global progress_msg
        if client.is_ready() and text.strip():
            if progress_msg is None:
                # 首次输出创建新消息
                progress_msg = await client.get_channel(CHANNEL_ID).send(f"生成进度:\n{text}")
            else:
                # 后续输出编辑原有消息,避免刷屏
                await progress_msg.edit(content=f"生成进度:\n{progress_msg.content}\n{text}")
    
    def flush(self):
        self.original_stdout.flush()

# 替换全局标准输出
sys.stdout = DiscordOutput(sys.stdout)

注意:不要每次输出都发送新消息,尽量用编辑同一条消息的方式更新进度,避免刷爆频道


方案2:主动上报进度(更灵活,适合自定义展示格式的场景)

不用修改全局输出规则,直接在生成迭代逻辑里插入上报代码,自由度更高,还可以用Discord嵌入式卡片做更直观的展示:

  • 同样先初始化Discord机器人,获取目标频道权限
  • 生成任务启动时,先往Discord发送一条初始进度消息,保存该消息的ID
  • 每完成一轮迭代,计算好当前进度、剩余时长、生成速度等参数,调用编辑消息接口更新内容

Python示例代码:

# 生成任务启动时创建初始进度卡片
embed = discord.Embed(title="AI画图生成中", color=0x00ff00)
embed.add_field(name="当前迭代", value="0/50", inline=True)
embed.add_field(name="生成速度", value="0it/s", inline=True)
embed.add_field(name="剩余时长", value="计算中", inline=True)
progress_msg = await channel.send(embed=embed)

# 每轮迭代结束后调用更新
def update_progress(current_iter, total_iter, speed):
    remaining = (total_iter - current_iter) / speed
    new_embed = discord.Embed(title="AI画图生成中", color=0x00ff00)
    new_embed.add_field(name="当前迭代", value=f"{current_iter}/{total_iter}", inline=True)
    new_embed.add_field(name="生成速度", value=f"{speed:.2f}it/s", inline=True)
    new_embed.add_field(name="剩余时长", value=f"{remaining:.1f}s", inline=True)
    await progress_msg.edit(embed=new_embed)

注意事项

  • 调用Discord接口的间隔不要低于1秒,否则会触发限流导致机器人被临时禁言
  • 多任务同时生成时,可以给每个任务单独创建一条进度消息,用任务ID区分
  • 生成完成后可以直接编辑同一条进度消息,附上最终生成的图片,不需要额外发送新消息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:27:06