golang实现Discord聊天API交互插件库discordgo的使用

Golang实现Discord聊天API交互插件库discordgo的使用

DiscordGo简介

DiscordGo是一个Go语言包,提供了与Discord聊天客户端API的低级绑定。DiscordGo几乎完整支持所有Discord API端点、WebSocket接口和语音接口。

安装

假设您已经有一个可用的Go环境,如果没有,请先安装Go。

使用以下命令安装DiscordGo:

go get github.com/bwmarrin/discordgo

基本用法

导入包

import "github.com/bwmarrin/discordgo"

创建Discord客户端

// 创建一个新的Discord会话
// 将"authentication token"替换为您机器人的实际令牌
discord, err := discordgo.New("Bot " + "authentication token")
if err != nil {
    fmt.Println("创建会话时出错:", err)
    return
}

完整示例Demo

下面是一个简单的Discord机器人示例,它会响应"!ping"命令:

package main

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

	"github.com/bwmarrin/discordgo"
)

func main() {
	// 创建新的Discord会话
	dg, err := discordgo.New("Bot " + "YOUR_BOT_TOKEN_HERE")
	if err != nil {
		fmt.Println("创建会话时出错:", err)
		return
	}

	// 添加消息创建事件处理程序
	dg.AddHandler(messageCreate)

	// 打开WebSocket连接并开始监听
	err = dg.Open()
	if err != nil {
		fmt.Println("打开连接时出错:", err)
		return
	}

	// 等待程序终止
	fmt.Println("机器人已启动。按CTRL-C退出。")
	sc := make(chan os.Signal, 1)
	signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill)
	<-sc

	// 优雅地关闭连接
	dg.Close()
}

// 当创建新消息时调用此函数
func messageCreate(s *discordgo.Session, m *discordgo.MessageCreate) {
	// 忽略机器人自己发送的消息
	if m.Author.ID == s.State.User.ID {
		return
	}

	// 如果消息内容是"!ping",则回复"Pong!"
	if m.Content == "!ping" {
		s.ChannelMessageSend(m.ChannelID, "Pong!")
	}
}

高级功能

DiscordGo还支持许多高级功能,包括:

  1. 语音功能 - 通过dgVoice包提供额外的语音辅助函数
  2. 事件处理 - 可以处理各种Discord事件,如消息创建、成员加入等
  3. 频道管理 - 创建、修改和删除频道
  4. 角色管理 - 管理服务器角色和权限

故障排除

如果在使用过程中遇到问题,可以参考项目wiki中的故障排除部分。

贡献指南

欢迎贡献代码,但请遵循以下指南:

  1. 首先打开一个issue描述bug或增强功能以便讨论
  2. 尽量匹配当前的命名约定
  3. 这个包旨在成为Discord API的低级直接映射,因此请避免添加超出此范围的增强功能
  4. 创建针对master分支的Pull Request

特别感谢

感谢Chris Rhodes为DiscordGo设计的logo和众多PR。


更多关于golang实现Discord聊天API交互插件库discordgo的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实现Discord聊天API交互插件库discordgo的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用discordgo实现Discord聊天API交互

discordgo是一个功能完善的Go语言Discord API库,可以用于创建Discord机器人或与Discord API交互的应用程序。下面我将介绍如何使用discordgo实现基本的Discord聊天功能。

安装discordgo

首先需要安装discordgo库:

go get github.com/bwmarrin/discordgo

基本使用示例

1. 创建机器人并连接到Discord

package main

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

	"github.com/bwmarrin/discordgo"
)

func main() {
	// 使用机器人token创建新的Discord会话
	// 替换"YOUR_BOT_TOKEN"为你的实际机器人token
	dg, err := discordgo.New("Bot YOUR_BOT_TOKEN")
	if err != nil {
		fmt.Println("创建会话时出错:", err)
		return
	}

	// 添加消息创建事件处理器
	dg.AddHandler(messageCreate)

	// 打开WebSocket连接
	err = dg.Open()
	if err != nil {
		fmt.Println("打开连接时出错:", err)
		return
	}

	// 等待程序终止
	fmt.Println("机器人已启动,按CTRL+C退出")
	sc := make(chan os.Signal, 1)
	signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill)
	<-sc

	// 优雅地关闭连接
	dg.Close()
}

// 消息创建事件处理器
func messageCreate(s *discordgo.Session, m *discordgo.MessageCreate) {
	// 忽略机器人自己发送的消息
	if m.Author.ID == s.State.User.ID {
		return
	}

	// 如果消息内容是"!ping",回复"Pong!"
	if m.Content == "!ping" {
		s.ChannelMessageSend(m.ChannelID, "Pong!")
	}
}

2. 发送消息到指定频道

func sendMessage(s *discordgo.Session, channelID string, content string) {
	_, err := s.ChannelMessageSend(channelID, content)
	if err != nil {
		fmt.Println("发送消息时出错:", err)
	}
}

3. 获取频道消息历史

func getChannelMessages(s *discordgo.Session, channelID string, limit int) {
	messages, err := s.ChannelMessages(channelID, limit, "", "", "")
	if err != nil {
		fmt.Println("获取消息时出错:", err)
		return
	}

	for _, msg := range messages {
		fmt.Printf("[%s] %s: %s\n", msg.Timestamp, msg.Author.Username, msg.Content)
	}
}

4. 创建嵌入式消息(Embed)

func sendEmbed(s *discordgo.Session, channelID string) {
	embed := &discordgo.MessageEmbed{
		Title:       "示例嵌入式消息",
		Description: "这是一个使用discordgo发送的嵌入式消息示例",
		Color:       0x00ff00, // 绿色
		Fields: []*discordgo.MessageEmbedField{
			{
				Name:   "字段1",
				Value:  "值1",
				Inline: true,
			},
			{
				Name:   "字段2",
				Value:  "值2",
				Inline: true,
			},
		},
	}

	_, err := s.ChannelMessageSendEmbed(channelID, embed)
	if err != nil {
		fmt.Println("发送嵌入式消息时出错:", err)
	}
}

5. 处理交互(按钮、下拉菜单等)

func interactionCreate(s *discordgo.Session, i *discordgo.InteractionCreate) {
	switch i.Type {
	case discordgo.InteractionApplicationCommand:
		// 处理斜杠命令
		data := i.ApplicationCommandData()
		switch data.Name {
		case "test":
			err := s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
				Type: discordgo.InteractionResponseChannelMessageWithSource,
				Data: &discordgo.InteractionResponseData{
					Content: "测试命令已执行!",
				},
			})
			if err != nil {
				fmt.Println("响应交互时出错:", err)
			}
		}
	case discordgo.InteractionMessageComponent:
		// 处理组件交互(按钮点击等)
		data := i.MessageComponentData()
		switch data.CustomID {
		case "button_click":
			err := s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
				Type: discordgo.InteractionResponseUpdateMessage,
				Data: &discordgo.InteractionResponseData{
					Content: "按钮已被点击!",
				},
			})
			if err != nil {
				fmt.Println("响应按钮点击时出错:", err)
			}
		}
	}
}

高级功能

1. 注册斜杠命令

func registerCommands(s *discordgo.Session, guildID string) {
	commands := []*discordgo.ApplicationCommand{
		{
			Name:        "test",
			Description: "测试命令",
		},
	}

	for _, cmd := range commands {
		_, err := s.ApplicationCommandCreate(s.State.User.ID, guildID, cmd)
		if err != nil {
			fmt.Printf("无法创建命令'%s': %v\n", cmd.Name, err)
		}
	}
}

2. 处理反应(表情符号)

func messageReactionAdd(s *discordgo.Session, r *discordgo.MessageReactionAdd) {
	if r.Emoji.Name == "👍" {
		s.ChannelMessageSend(r.ChannelID, fmt.Sprintf("<@%s> 点赞了这条消息!", r.UserID))
	}
}

注意事项

  1. 获取机器人token需要在Discord开发者门户创建应用
  2. 需要为机器人添加适当的权限才能执行某些操作
  3. Discord API有速率限制,注意不要过于频繁地发送请求
  4. 生产环境中应该添加错误处理和日志记录
  5. 对于大型机器人,考虑使用分片(sharding)处理

discordgo提供了完整的Discord API覆盖,包括语音频道、Webhook、权限管理等高级功能。更多详细用法可以参考官方文档GitHub仓库

回到顶部