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

