如何让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
相关产品推荐
相关产品推荐

