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

Discord机器人拦截特定用户链接/视频时出现400错误求助

问题解决:Discord机器人删除特定用户链接/视频时的50006错误

错误根源

  1. 重复注册on_message事件:代码里定义了两个@client.event装饰的on_message函数,discord.py只会执行最后一个注册的事件,导致第一个函数里的链接拦截逻辑完全没生效。
  2. 发送空消息触发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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:50:28