个人用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
相关产品推荐
相关产品推荐

