Python开发Discord机器人时embed无法跨多服务器广播如何解决
问题原因
- 核心逻辑错误:你通过
wait_for拿到的broadcast是Message类对象,不是纯字符串,直接和"yes"做相等判断永远返回False,所以代码根本不会进入广播分支,只会执行else里的当前频道发送逻辑。 - 无效参数错误:discord.py的Embed构造方法没有
broadcast这个传入参数,属于冗余无效的传参。 - 缺失异常和权限校验:直接遍历所有服务器所有频道发送嵌入,一旦机器人在某一个频道没有「发送消息」「发送嵌入消息」的权限,就会抛出异常中断后续所有发送任务,也会导致部分服务器收不到消息。
- 色值格式错误:你填写的颜色值
0xfffff只有5位十六进制数,标准RGB十六进制颜色为6位,正确的白色色值应为0xffffff。
修正后的代码
import asyncio from discord.ext import commands @client.command() @commands.has_permissions(administrator=True) # 加管理员权限校验避免功能被滥用 async def make_embed(ctx): def check(message): return message.author == ctx.author and message.channel == ctx.channel await ctx.send('请输入标题') title = await client.wait_for('message', check=check) await ctx.send('请输入描述内容') desc = await client.wait_for('message', check=check) await ctx.send("是否要广播这条消息?请回复yes/no") broadcast_msg = await client.wait_for('message', check=check) # 构造embed,移除无效参数,修正色值 embed = discord.Embed(title=title.content, description=desc.content, color=0xffffff) # 取用户输入的内容做判断,转小写兼容大小写输入 if broadcast_msg.content.lower() == "yes": await ctx.send("正在开始广播...") for guild in client.guilds: for channel in guild.text_channels: try: # 先校验机器人拥有对应权限再发送 if channel.permissions_for(guild.me).send_messages and channel.permissions_for(guild.me).embed_links: await channel.send(embed=embed) await asyncio.sleep(0.5) # 服务器数量多的话加延迟避免触发限流 except Exception as e: # 单频道发送失败不中断整体任务,可按需打印日志排查问题 print(f"向服务器【{guild.name}】的频道【{channel.name}】发送失败:{str(e)}") continue await ctx.send("广播完成") else: await ctx.send(embed=embed)
内容的提问来源于stack exchange,提问作者coolcoderdude222
相关产品推荐
相关产品推荐

