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

使用discordgo实现Discord机器人私发回复公共频道消息

实现Discord机器人公共频道消息触发私信回复

看起来你已经搞定了频道是否私密的检测逻辑,接下来咱们把功能补全,实现用户在公共频道发消息时机器人自动发私信回复的效果。我帮你调整并完善代码,一步步来:

第一步:完善消息处理函数

先把你现有的检测逻辑扩展成完整的消息处理逻辑,同时优化错误处理(避免小错误直接终止程序):

import (
    "fmt"
    "os"
    "os/signal"
    "syscall"

    "github.com/bwmarrin/discordgo"
)

func handleMessageCreate(s *discordgo.Session, m *discordgo.MessageCreate) {
    // 先忽略机器人自己发的消息,防止无限循环回复
    if m.Author.ID == s.State.User.ID {
        return
    }

    // 获取消息所在频道的信息:先从本地状态取,失败就调用API拉取
    channel, err := s.State.Channel(m.ChannelID)
    if err != nil {
        channel, err = s.Channel(m.ChannelID)
        if err != nil {
            fmt.Printf("获取频道信息失败: %v\n", err)
            return
        }
    }

    // 只对公共频道(非私密频道)的消息触发私信回复
    if !channel.IsPrivate {
        // 自定义你的私信回复内容
        privateReply := "你在公共频道发消息啦!这是我给你的专属私信回复 😊"
        
        // 给发送消息的用户发送私信:UserMessageSend会自动创建DM频道(如果没有的话)
        _, err := s.UserMessageSend(m.Author.ID, privateReply)
        if err != nil {
            fmt.Printf("给用户 %s 发送私信失败: %v\n", m.Author.Username, err)
            // 可选:如果私信发失败,在公共频道提示用户(比如用户关闭了私信权限)
            // s.ChannelMessageSend(m.ChannelID, "抱歉,我无法给你发送私信,请检查你的隐私设置哦!")
        }
    }
}

第二步:注册事件并启动机器人

接下来要把上面的处理函数注册到Discord会话的事件中,同时确保开启必要的机器人意图:

func main() {
    // 替换成你的机器人Token
    botToken := "你的机器人Token"
    dg, err := discordgo.New("Bot " + botToken)
    if err != nil {
        fmt.Printf("创建Discord会话失败: %v\n", err)
        return
    }

    // 注册消息创建事件的处理函数
    dg.AddHandler(handleMessageCreate)

    // 开启必要的意图:必须在Discord开发者门户里开启对应权限
    dg.Identify.Intents = discordgo.IntentsGuildMessages | discordgo.IntentsDirectMessages

    // 连接到Discord
    err = dg.Open()
    if err != nil {
        fmt.Printf("连接Discord失败: %v\n", err)
        return
    }

    fmt.Println("机器人已上线!按 Ctrl+C 退出...")
    // 等待退出信号
    stop := make(chan os.Signal, 1)
    signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
    <-stop

    // 关闭会话
    dg.Close()
}

关键注意事项

  • 开启机器人意图:一定要去Discord开发者门户的机器人设置里,开启「Message Content Intent」(消息内容意图)和「Server Members Intent」(服务器成员意图),否则机器人无法接收公共频道的消息。
  • 用户隐私设置:如果用户关闭了「允许来自服务器成员的私信」,机器人会发送失败,这时候可以通过注释里的代码在公共频道给用户提示。
  • 权限问题:确保机器人在目标服务器里有「发送消息」的基础权限(私信不需要服务器权限,但公共频道的消息监听需要对应权限)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:59:23