You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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

火山引擎 最新活动