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

如何使用Discord.py向指定频道发消息及实现频道消息自动反应

嘿,我帮你捋捋这个问题哈!你的代码里有几个小细节没处理对,咱们一步步来解决指定频道加反应和发消息的需求~

先说说你现有代码的问题

先看你贴的这段代码:

if message.content.startswith('@'):
currevents = get_channel(273977792159416321)
if message.channel is currevents:
await client.add_reaction(message, ":nocheck:432565697349025803")

这里有三个关键问题:

  1. get_channel调用错误:Discord.py里这个方法是绑定在客户端实例(client或bot)上的,不能直接裸用,得写成client.get_channel()才行。
  2. 频道判断逻辑不稳:用is比较频道对象可能踩坑——即使是同一个频道,不同时机获取的对象引用可能不一样,不如直接比较频道ID来得可靠。
  3. 表情格式不对:添加自定义表情时,得用<:表情名:表情ID>的格式,而不是:表情名:表情ID,不然机器人识别不了。

解决方案1:给指定频道的消息加反应

修正后的代码示例(假设你用的是client实例,用Bot类的话换成bot就行):

@client.event
async def on_message(message):
    # 先跳过机器人自己发的消息,避免触发循环
    if message.author == client.user:
        return

    # 只处理内容以@开头的消息
    if message.content.startswith('@'):
        # 定义目标频道ID(整数类型,别加引号)
        target_channel_id = 273977792159416321
        
        # 直接比较频道ID,简单高效还靠谱
        if message.channel.id == target_channel_id:
            # 用正确的自定义表情格式添加反应
            await message.add_reaction("<:nocheck:432565697349025803>")
            # 如果是系统默认表情,直接打表情符号就行,比如await message.add_reaction("✅")

    # 要是你用了命令系统,别忘了加这行,不然命令会失效
    await client.process_commands(message)

如果你非要用get_channel来获取频道对象再判断,也可以这么写:

currevents = client.get_channel(target_channel_id)
# 比较ID或者直接比较对象都可以,比较ID更稳妥
if message.channel.id == currevents.id:
    await message.add_reaction("<:nocheck:432565697349025803>")

解决方案2:向指定频道发送消息

有两种常用的实现方式,看你场景选:

方式1:直接通过频道ID获取频道对象发送

这个方法通用性最强,不管是在事件里还是定时任务里都能用:

# 可以把这个封装成函数,方便调用
async def send_to_target_channel():
    target_channel_id = 273977792159416321
    # 获取频道对象
    channel = client.get_channel(target_channel_id)
    
    # 先判断频道是否存在(避免ID错了或者机器人没权限访问)
    if channel:
        await channel.send("这是发送到指定频道的测试消息!")
    else:
        print("找不到目标频道!请检查ID是否正确,或者机器人有没有该频道的访问权限")

方式2:在on_message事件里触发发送(比如收到指令后发消息)

比如用户发!send就给指定频道发消息:

@client.event
async def on_message(message):
    if message.content == "!send":
        target_channel_id = 273977792159416321
        channel = client.get_channel(target_channel_id)
        if channel:
            await channel.send("收到指令,发送消息到指定频道~")
        else:
            await message.channel.send("抱歉,找不到目标频道😥")
    
    await client.process_commands(message)

几个要注意的点

  • 确保机器人在目标频道有查看频道和发送消息/添加反应的权限,不然会抛出权限错误。
  • 频道ID必须是整数,别写成字符串(比如"273977792159416321"就不行)。
  • 自定义表情的话,机器人必须加入了表情所在的服务器,不然没法用这个表情。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:11:01