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

如何让Python编写的Discord机器人接收Webhook发送的命令?

实现Webhook触发Discord机器人命令的方案

当然可以实现,Python主流Discord机器人库(如discord.py)默认会跳过Webhook发送的消息——因为内置命令检查逻辑会过滤非普通用户/常规机器人发送的内容。以下是两种可行的解决方法:

方法一:自定义命令检查器,允许Webhook消息触发命令

通过添加自定义检查器,让指定命令或全量命令接受Webhook来源的消息:

from discord.ext import commands

# 定义检查器:允许Webhook消息或普通用户消息触发命令
def allow_webhook():
    async def predicate(ctx):
        # 判断消息是否来自Webhook,或者是普通非机器人用户
        return ctx.message.webhook_id is not None or not ctx.author.bot
    return commands.check(predicate)

# 给单个命令应用检查器
@bot.command()
@allow_webhook()
async def test_webhook(ctx):
    await ctx.send("Webhook触发命令成功!")

# 或者全局应用检查器,让所有命令都接受Webhook消息
bot.add_check(allow_webhook())

方法二:监听on_message事件手动处理Webhook命令

如果需要更灵活的控制,可直接监听消息事件,手动识别Webhook消息并触发对应命令:

@bot.event
async def on_message(message):
    # 先处理默认命令流程(若已全局添加检查器可省略)
    await bot.process_commands(message)
    
    # 仅处理Webhook发送的消息
    if message.webhook_id is not None:
        # 假设你的命令前缀是"!"
        command_prefix = "!"
        if message.content.startswith(command_prefix):
            # 拆分命令名和参数
            cmd_content = message.content[len(command_prefix):].split()
            if not cmd_content:
                return
            cmd_name = cmd_content[0]
            cmd_args = cmd_content[1:]
            
            # 获取对应的命令对象
            target_cmd = bot.get_command(cmd_name)
            if target_cmd:
                # 手动调用命令回调函数
                await target_cmd.callback(bot, message, *cmd_args)

注意事项

  • 确保你的命令逻辑中没有依赖真实User对象的代码(你已提到未访问User对象,这点符合要求),Webhook消息的author是Webhook配置的名称,并非Discord用户实体。
  • 测试时直接通过Webhook发送带命令前缀的消息,即可验证是否触发命令,控制台会输出对应日志(若你的命令有日志输出逻辑)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 20:56:01