
umqid 是 steam web chat api 中用于消息去重和会话追踪的唯一消息标识符,需通过调用 isteamwebuserpresenceoauth/logon/v0001 接口在登录响应中提取,而非本地生成。
umqid 是 steam web chat api 中用于消息去重和会话追踪的唯一消息标识符,需通过调用 isteamwebuserpresenceoauth/logon/v0001 接口在登录响应中提取,而非本地生成。
在使用 Go 模拟 Steam 网页端聊天(如向 ISteamWebUserPresenceOAuth/Message/v0001 发送 saytext 消息)时,umqid 是一个关键但易被误解的参数。它并非随机 UUID 或时间戳哈希,也不是客户端自行构造的值,而是 Steam 服务端在用户完成 OAuth 登录流程后,在 Logon 接口响应中主动下发的、具有会话上下文意义的 64 位整数字符串(如 "6271781725479270872"),用于确保消息幂等性与服务端路由一致性。
✅ 正确获取方式:调用 Logon 接口并解析响应
Steam 官方未公开文档化该字段,但逆向分析(如 geothermal 项目)证实:umqid 首次出现在 /ISteamWebUserPresenceOAuth/Logon/v0001/ 的成功响应体中,且后续所有聊天请求(包括 Message/v0001)必须复用该值(同一会话内保持不变)。
以下为 Go 中安全获取 umqid 的最小可行示例:
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"time"
)
type LogonResponse struct {
Response struct {
UMQID string `json:"umqid"`
// 其他字段(如 sessionid, steamid)可按需补充
} `json:"response"`
}
func getUMQID(accessToken string) (string, error) {
baseURL := "https://api.steampowered.com/ISteamWebUserPresenceOAuth/Logon/v0001/"
params := url.Values{}
params.Set("access_token", accessToken)
params.Set("format", "json")
resp, err := http.PostForm(baseURL, params)
if err != nil {
return "", fmt.Errorf("HTTP request failed: %w", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return "", fmt.Errorf("Logon API returned status %d", resp.StatusCode)
}
var logon LogonResponse
if err := json.NewDecoder(resp.Body).Decode(&logon); err != nil {
return "", fmt.Errorf("failed to decode Logon response: %w", err)
}
if logon.Response.UMQID == "" {
return "", fmt.Errorf("UMQID not found in Logon response")
}
return logon.Response.UMQID, nil
}
// 使用示例
func main() {
accessToken := "87e689c612b38f535a4d2b645b3aa3a7" // 替换为有效 OAuth token
umqid, err := getUMQID(accessToken)
if err != nil {
panic(err)
}
fmt.Printf("UMQID acquired: %s\n", umqid) // 输出:6271781725479270872
}⚠️ 注意事项
- 时效性:umqid 与 access_token 绑定,且存在有效期(通常数小时)。若 access_token 过期或刷新,必须重新调用 Logon/v0001 获取新 umqid。
- 不可复用跨会话:不同登录请求返回的 umqid 互不兼容;重复使用旧值将导致 400 Bad Request 或静默丢弃消息。
- 无缓存策略:Steam 不提供独立的 GET /umqid 接口,也不支持通过 WebSocket 或其他端点推导——唯一合法来源就是 Logon/v0001 响应体。
- 错误处理建议:生产环境应捕获 401 Unauthorized(token 失效)、429 Too Many Requests(限频)并实现退避重试。
✅ 总结
umqid 是 Steam Web Chat 协议中一个“服务端颁发、客户端透传”的会话令牌,其本质是服务端内部消息队列的序列号映射。开发者无需理解其生成算法,只需确保:
① 在发起任何聊天请求前,先完成一次成功的 Logon/v0001 调用;
② 提取并持久化响应中的 umqid 字段;
③ 在后续 Message/v0001 请求中严格复用该值。
此举不仅满足接口要求,更是保障消息可靠投递与服务端状态同步的基础前提。


















