Mattermost Golang机器人发送私信无效果,代码排查求助
Mattermost机器人私信代码无效果问题排查
我想实现Mattermost机器人向用户发送私信,参考了相关方案,但代码运行后没有效果,执行go run *.go无报错但收不到消息。代码如下:
package main import ( "github.com/mattermost/mattermost-server/v5/model" ) func main() { client := model.NewAPIv4Client("https://server.name.here") client.SetToken("superdupertoken") bot, resp := client.GetUserByUsername("NameOf.BotSendingMessage", "here.bot.name") if resp.Error != nil { return } user, resp := client.GetUserByUsername("UsernameOf.UserToMessage", "here.my.user.name") if resp.Error != nil { return } channel, resp := client.CreateDirectChannel(bot.Id, user.Id) if resp.Error != nil { return } post := &model.Post{} post.ChannelId = channel.Id post.Message = "some message" if _, resp := client.CreatePost(post); resp.Error != nil { return } }
代码存在的核心问题
GetUserByUsername参数误用
这个API的第二个参数是用于缓存验证的etag,并非用户的域标识。你错误传入here.bot.name和here.my.user.name,导致API无法正确查询到目标用户。正确调用只需传入用户名,第二个参数传空字符串即可:bot, resp := client.GetUserByUsername("NameOf.BotSendingMessage", "")user, resp := client.GetUserByUsername("UsernameOf.UserToMessage", "")如果用户名是带域的格式(如
NameOf.BotSendingMessage@here.bot.name),直接把完整字符串作为第一个参数传入即可。缺少错误日志输出
代码遇到错误仅直接return,未打印任何错误信息,导致无法定位问题环节。比如用户查询失败时,你完全无法感知,程序直接退出。建议在每个错误分支添加日志:if resp.Error != nil { println("获取机器人用户失败:", resp.Error.Error()) return }用户有效性未校验
即使API未返回错误,也可能存在查询不到用户的情况(比如用户名写错),此时bot或user会是nil,后续用无效ID创建通道、发送消息都会静默失败。需要添加非空校验。
修正后的代码示例
package main import ( "fmt" "github.com/mattermost/mattermost-server/v5/model" ) func main() { client := model.NewAPIv4Client("https://server.name.here") client.SetToken("superdupertoken") // 获取机器人用户 bot, resp := client.GetUserByUsername("NameOf.BotSendingMessage", "") if resp.Error != nil { fmt.Printf("获取机器人用户失败: %v\n", resp.Error) return } if bot == nil { fmt.Println("未找到指定的机器人用户") return } // 获取目标用户 user, resp := client.GetUserByUsername("UsernameOf.UserToMessage", "") if resp.Error != nil { fmt.Printf("获取目标用户失败: %v\n", resp.Error) return } if user == nil { fmt.Println("未找到指定的目标用户") return } // 创建或获取私信通道 channel, resp := client.CreateDirectChannel(bot.Id, user.Id) if resp.Error != nil { fmt.Printf("创建私信通道失败: %v\n", resp.Error) return } // 构造消息并发送 post := &model.Post{ ChannelId: channel.Id, Message: "some message", } _, resp = client.CreatePost(post) if resp.Error != nil { fmt.Printf("发送消息失败: %v\n", resp.Error) return } fmt.Println("消息发送成功") }
额外排查建议
- 确认机器人的token拥有创建通道、发送消息的权限
- 核对服务器地址、用户名、token等配置信息是否正确
- 运行修正后的代码,通过控制台输出的日志定位具体问题
内容的提问来源于stack exchange,提问作者mocart
相关产品推荐
相关产品推荐

