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

Discord机器人sudo命令通过webhook模拟用户发消息偶发失效无报错

问题根因分析
  • 权限与上限限制:Discord单文本频道最多允许存在10个webhook,且机器人需要拥有「管理Webhook」频道权限才能创建webhook,两个条件任意一个不满足,create_webhook调用都会抛出异常。你当前代码没有做异常捕获,出错后会直接终止执行,不会输出任何日志。
  • 不合理的webhook删除逻辑:你当前代码执行完发送后会遍历删除频道内所有webhook,一方面会误删其他用户创建的正常webhook,另一方面额外的遍历查询逻辑也会增加触发接口限流的概率,完全没有必要。
  • 参数匹配问题:你定义的message参数只能接收单个无空格的字符串,如果用户发送的sudo消息带空格,会出现参数匹配失败,命令直接终止执行。
  • 版本兼容问题:如果你使用的是discord.py 2.0及以上版本,member.avatar_url已经被废弃,替换为member.avatar.url,调用旧属性会抛出异常导致代码终止。
修复后代码
import discord
from discord.ext import commands

@client.command()
async def sudo(ctx, member: discord.Member, *, message: str):
    # 先校验机器人权限
    if not ctx.channel.permissions_for(ctx.guild.me).manage_webhooks:
        await ctx.send("缺少管理Webhook权限", delete_after=3)
        return
    await ctx.message.delete()
    if not message.strip():
        return
    webhook = None
    try:
        webhook = await ctx.channel.create_webhook(name=member.name)
        # 兼容新旧版本discord.py的头像获取逻辑
        avatar_url = member.avatar.url if hasattr(member.avatar, 'url') else member.avatar_url
        await webhook.send(
            message,
            username=member.display_name,
            avatar_url=avatar_url
        )
    except Exception as e:
        # 打印错误方便排查,可根据需求改成写入日志
        print(f"sudo命令执行出错: {str(e)}")
    finally:
        # 仅删除本次创建的webhook,不影响频道内其他webhook
        if webhook is not None:
            await webhook.delete()
额外注意事项
  • 不要高频调用该命令,Discord的webhook创建、删除接口都有调用频率限制,触发限流后也会出现请求无响应的情况。
  • 如果需要定位具体报错,可以在except块中将错误信息发送到测试频道,快速定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:36:03