如何使用discordgo获取频道列表并向私有服务器文本频道发消息
如何用discordgo向私有Discord服务器的所有文本频道群发消息
嘿,你已经成功创建并连接上Discord会话了,剩下的步骤其实很清晰,我给你一步步拆解:
1. 先拿到目标服务器的频道列表
首先你得确定要操作的私有服务器(也就是Discord里的Guild),你可以开启Discord的开发者模式,右键服务器名称复制它的ID。然后用GuildChannels方法获取这个服务器下的所有频道:
// 把这里替换成你的私有服务器ID guildID := "你的服务器ID" channels, err := dg.GuildChannels(guildID) if err != nil { fmt.Println("获取频道列表失败:", err) return }
如果你的机器人加入了多个服务器,想批量处理所有服务器的频道,可以先获取所有Guild再遍历:
guilds, err := dg.UserGuilds(0, "", "") if err != nil { fmt.Println("获取服务器列表失败:", err) return } // 逐个处理每个服务器 for _, guild := range guilds { channels, err := dg.GuildChannels(guild.ID) if err != nil { fmt.Printf("获取服务器「%s」的频道失败: %v\n", guild.Name, err) continue } // 后面的频道筛选和消息发送逻辑可以放在这里 }
2. 筛选出仅文本频道
Discord的频道有好几种类型,我们只需要文本频道,对应的类型是discordgo.ChannelTypeGuildText,遍历频道列表把它们挑出来:
var textChannels []*discordgo.Channel for _, ch := range channels { if ch.Type == discordgo.ChannelTypeGuildText { textChannels = append(textChannels, ch) fmt.Printf("找到文本频道: %s (ID: %s)\n", ch.Name, ch.ID) } }
3. 给每个文本频道发消息
用ChannelMessageSend方法就能给指定频道发消息了,遍历筛选好的文本频道逐个发送即可:
messageContent := "这是一条来自机器人的全局通知!" for _, ch := range textChannels { _, err := dg.ChannelMessageSend(ch.ID, messageContent) if err != nil { fmt.Printf("向频道「%s」发送消息失败: %v\n", ch.Name, err) continue } fmt.Printf("成功发送消息到频道: %s\n", ch.Name) }
完整的示例代码
把上面的步骤整合起来,完整的可运行代码大概是这样:
package main import ( "fmt" "github.com/bwmarrin/discordgo" ) // 替换成你的机器人Token var Token = "你的机器人Token" func main() { dg, err := discordgo.New("Bot " + Token) if err != nil { fmt.Println("创建Discord会话失败:", err) return } // 打开WebSocket连接 err = dg.Open() if err != nil { fmt.Println("打开连接失败:", err) return } defer dg.Close() // 程序结束时自动关闭连接 // 替换成你的私有服务器ID targetGuildID := "你的服务器ID" channels, err := dg.GuildChannels(targetGuildID) if err != nil { fmt.Println("获取频道列表失败:", err) return } // 筛选文本频道 var textChannels []*discordgo.Channel for _, ch := range channels { if ch.Type == discordgo.ChannelTypeGuildText { textChannels = append(textChannels, ch) } } // 群发消息 notificationMsg := "大家好!这是机器人发来的全局通知😎" for _, ch := range textChannels { _, err := dg.ChannelMessageSend(ch.ID, notificationMsg) if err != nil { fmt.Printf("频道「%s」发送失败: %v\n", ch.Name, err) continue } fmt.Printf("已发送到频道: %s\n", ch.Name) } fmt.Println("所有消息发送任务完成!") }
⚠️ 注意:一定要确保你的机器人在目标服务器里拥有发送消息的权限,不然会出现权限不足的错误哦。
内容的提问来源于stack exchange,提问作者user9614249




