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

discord.py如何让机器人在服务器随机频道发送响应消息

实现方法

该需求可直接通过discord.py原生API实现,无需额外依赖,核心逻辑是从触发消息所属服务器的文本频道列表中,筛选出机器人拥有发送消息权限的频道,随机抽取一个作为回复目标。

首先导入Python标准库random用于随机选择逻辑,修改后的完整可运行代码如下:

import random
import asyncio

@client.event
async def on_message(message):
    if message.author == client.user:
        return

    # 过滤私信场景,避免私信场景下不存在服务器对象导致报错
    if not message.guild:
        return

    msg = message.content.lower()

    if msg == 'marco':
        await asyncio.sleep(5)
        # 收集当前服务器内所有机器人有权限发送消息的文本频道
        valid_channels = []
        for channel in message.guild.text_channels:
            permissions = channel.permissions_for(message.guild.me)
            if permissions.send_messages:
                valid_channels.append(channel)
        
        # 无可用频道时直接终止逻辑,避免抛出异常
        if not valid_channels:
            return
        
        # 随机选取目标频道发送回复
        target_channel = random.choice(valid_channels)
        await target_channel.send(f'{message.author.mention} POLO...')

关键逻辑说明

  • 私信场景拦截:如果用户在和机器人的私信对话中发送"marco",直接跳过逻辑,避免调用服务器属性时报错
  • 频道权限校验:只将机器人拥有发送消息权限的文本频道加入候选列表,避免随机到无权限频道时调用发送接口失败
  • 用户提及:回复内容中@触发指令的用户,避免用户无法识别是回应自己的指令,可根据需求自行删除message.author.mention部分
  • 异常兜底:如果当前服务器没有任何机器人可发言的频道,直接终止逻辑不会报错
  • 可选调整:如果不希望回复出现在用户触发指令的原频道,只需要在频道筛选条件中增加排除判断即可,修改对应代码段为:
for channel in message.guild.text_channels:
    permissions = channel.permissions_for(message.guild.me)
    if permissions.send_messages and channel.id != message.channel.id:
        valid_channels.append(channel)

如果你使用的是discord.py 2.0及以上版本,需要在开发者后台开启message_content特权意图,并在客户端初始化时配置对应意图参数,否则无法正常读取用户发送的消息内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:57:14