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

Go脚本无法通过WebSocket获取Mastodon个人状态更新的问题排查求助

Go脚本无法通过WebSocket获取Mastodon个人状态更新的问题排查求助

看起来你在通过Go的WebSocket客户端订阅Mastodon个人流时遇到了收不到自己新状态的问题,我来帮你梳理几个可能的问题点和对应的解决思路:

1. Authorization请求头格式错误(最可能的原因)

看你代码里的Authorization头拼接:

"Authorization": {" Bearer " + token},

这里Bearer前面多了一个空格!Mastodon的API对认证头格式要求很严格,多余的空格会导致认证不通过——服务器可能不会直接断开连接,但会拒绝推送你有权限查看的内容。

你需要把它改成:

"Authorization": {"Bearer " + token},

(去掉Bearer前面的空格)

2. 实例URL可能配置错误

你当前用的是streaming.mastodon.social作为实例地址,但大多数情况下,Mastodon的流API端点是挂载在账号所在的主实例域名下的。比如如果你的账号注册在mastodon.social,那正确的流URL应该是wss://mastodon.social/api/v1/streaming/user,而不是用streaming.mastodon.social这个子域名。

你可以先确认自己账号的所在实例,然后把instanceURL改成对应的主域名试试。

3. 验证访问Token的权限

确保你生成的Mastodon访问Token拥有read:statuses和read:accounts的权限——订阅个人用户流需要这些权限才能获取到自己的状态更新。如果生成Token的时候没勾选这些权限,需要重新生成一个带对应权限的Token。

4. 补充:添加连接异常的重连逻辑

你的当前代码在读取消息出错时直接log.Fatal退出,但Mastodon的流连接可能会因为网络波动、服务器维护等原因断开。可以考虑添加重连逻辑,比如用循环尝试重连,避免程序直接崩溃。

修正后的核心代码片段参考

func StreamPublicTimelineWebSocket(instanceURL string, token string) {
    // 修正实例URL,用主域名而非streaming子域名
    url := fmt.Sprintf("wss://%s/api/v1/streaming/user", instanceURL)
    log.Printf("streaming timeline web socket url: %s", url)

    dialer := websocket.DefaultDialer

    // 修正Authorization头的空格问题
    headers := map[string][]string{
        "User-Agent":    {"Mastodon Streamer Go"},
        "Authorization": {"Bearer " + token}, // 去掉Bearer前面的空格
    }

    conn, _, err := dialer.Dial(url, headers)
    if err != nil {
        log.Fatalf("Failed to connect to Mastodon streaming WebSocket: %v", err)
        os.Exit(1)
    }
    defer conn.Close()

    log.Printf("Successfully connected to stream at: %s", url)

    for {
        _, msg, err := conn.ReadMessage()
        if err != nil {
            log.Printf("Error reading WebSocket message: %v, attempting to reconnect...", err)
            // 这里可以添加重连逻辑,比如重新Dial
            conn, _, err = dialer.Dial(url, headers)
            if err != nil {
                log.Fatalf("Failed to reconnect: %v", err)
            }
            continue
        }
        log.Printf("Received message: %s", msg)
    }
}

func main() {
    fmt.Println("Creating stream to Mastodon")

    token := "nk_HZ6......b2lDiI"
    // 改为你账号所在的主实例域名,比如mastodon.social
    instanceURL := "mastodon.social"

    log.Println("Starting streaming from Mastodon...")
    StreamPublicTimelineWebSocket(instanceURL, token)
}

你可以先优先修正Authorization头的空格问题和实例URL,这两个是最可能导致收不到状态的原因,然后再验证Token权限,应该就能解决问题了。

备注:内容来源于stack exchange,提问作者Europa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 10:15:27