You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
    }

}

代码存在的核心问题

  1. 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),直接把完整字符串作为第一个参数传入即可。

  2. 缺少错误日志输出
    代码遇到错误仅直接return,未打印任何错误信息,导致无法定位问题环节。比如用户查询失败时,你完全无法感知,程序直接退出。建议在每个错误分支添加日志:

    if resp.Error != nil {
        println("获取机器人用户失败:", resp.Error.Error())
        return
    }
    
  3. 用户有效性未校验
    即使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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:10:19