Discord机器人拦截特定用户链接/视频时出现400错误求助
问题解决:Discord机器人删除特定用户链接/视频时的50006错误
错误根源
- 重复注册
on_message事件:代码里定义了两个@client.event装饰的on_message函数,discord.py只会执行最后一个注册的事件,导致第一个函数里的链接拦截逻辑完全没生效。 - 发送空消息触发50006:
send_message函数中,若responses.get_response(user_message)返回空字符串,调用message.channel.send(response)就会触发「Cannot send an empty message」错误。
修正步骤与代码
1. 合并on_message事件
把两个on_message的逻辑合并到同一个函数里,确保拦截代码能被执行。
2. 增加空响应判断
在send_message里先检查响应是否为空,避免发送空消息。
3. 补充视频拦截逻辑
通过message.attachments检查是否有视频附件,实现视频拦截。
以下是修正后的完整代码:
import discord import responses async def send_message(message, user_message, is_private): try: response = responses.get_response(user_message) # 新增:判断响应是否为空,为空则发送默认提示或跳过 if not response: response = "我暂时无法回复这个内容哦~" await message.author.send(response) if is_private else await message.channel.send(response) except Exception as e: print(e) def run_discord_bot(): TOKEN = '你的机器人Token' intents = discord.Intents.default() intents.messages = True intents.message_content = True client = discord.Client(intents=intents) @client.event async def on_ready(): print(f'{client.user} 已启动运行!') @client.event async def on_message(message): # 忽略机器人自身发送的消息 if message.author == client.user: return # 替换成你要拦截的目标用户ID(整数类型,不要加引号) TARGET_USER_ID = 123456789012345678 # 检查是否是目标用户发送的链接或视频 is_target_user = message.author.id == TARGET_USER_ID has_link = message.content.startswith("https") has_video = any(attachment.content_type.startswith('video/') for attachment in message.attachments) if is_target_user and (has_link or has_video): await message.delete() # 可选:发送提示消息告知用户 # await message.channel.send(f"{message.author.mention} 你发送的链接/视频已被拦截删除!") return # 拦截后直接返回,不处理后续逻辑 # 原有的消息处理逻辑 username = message.author.name user_message = message.content channel = message.channel.name print(f'{username} 说: "{user_message}" ({channel})') if user_message.startswith('?'): user_message = user_message[1:] await send_message(message, user_message, is_private=True) else: await send_message(message, user_message, is_private=False) client.run(TOKEN)
额外注意事项
- 确保机器人拥有管理消息的权限,否则无法执行
message.delete()操作。 - 目标用户ID必须是整数类型,不要写成字符串或带前导零的无效数字。
- 如果不需要默认提示消息,也可以直接跳过空响应的发送:
if response: await message.author.send(response) if is_private else await message.channel.send(response)
内容的提问来源于stack exchange,提问作者warlordgrog
相关产品推荐
相关产品推荐

