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

个人用Discord Bot如何将指定消息发至预设频道,能否搭配使用ctx.send与channel.send

你的需求完全可以通过ctx.send和channel.send搭配实现,二者用途不冲突,只需要修正现有代码中获取频道时机错误的问题即可。

你目前把client.get_channel写在Bot实例化后、启动登录前的位置,此时Bot还未完成服务器、频道数据的缓存,获取到的channel会是None,运行时会触发报错。


正确实现代码

import discord
from discord.ext import commands

# 初始化Bot,注意根据你的需求开启对应网关意图
client = commands.Bot(command_prefix='!', intents=discord.Intents.all())
# 预先声明目标频道变量
target_channel = None

# Bot登录完成后再获取目标频道
@client.event
async def on_ready():
    global target_channel
    target_channel = client.get_channel(883389016819511296)
    print(f"Bot启动完成,目标频道已绑定:{target_channel.name if target_channel else '获取失败'}")

@client.command(name='say')
async def say(ctx, *, content):
    # 可选:给触发指令的用户发操作反馈,用ctx.send发到当前指令所在频道
    await ctx.send("内容已推送至目标频道")
    # 推送实际内容到你预设的固定频道
    if target_channel:
        await target_channel.send(content)
    else:
        await ctx.send("错误:目标频道获取失败,请检查频道ID、Bot权限是否正常")

用法说明

  • ctx.send作用是向触发指令的当前频道发送消息,适合用来给触发用户做操作提示、错误反馈,如果你不需要给触发者回显任何内容,可以直接删掉这段逻辑。
  • channel.send作用是向你指定的任意频道发送消息,完全可以满足你发送内容到固定预设频道的需求。
  • 如果需要限定只有你自己能触发这个指令,可以在命令逻辑开头加权限校验,避免其他人滥用:
@client.command(name='say')
async def say(ctx, *, content):
    # 替换为你的Discord用户ID
    if ctx.author.id != 1234567890:
        return
    # 后续逻辑不变

内容的提问来源于stack exchange,提问作者Ákos Molnár

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:54:05