
umqid 是 steam web chat api 中用于消息去重和会话追踪的唯一消息队列标识符,需通过调用 isteamwebuserpresenceoauth/logon/v0001 接口在登录响应中提取,而非本地生成。
umqid 是 steam web chat api 中用于消息去重和会话追踪的唯一消息队列标识符,需通过调用 isteamwebuserpresenceoauth/logon/v0001 接口在登录响应中提取,而非本地生成。
在使用 Go 语言向 Steam 聊天接口(如 https://api.steampowered.com/ISteamWebUserPresenceOAuth/Message/v0001/)发送 saytext 类型消息时,umqid 参数常被误认为需手动构造或随机生成。实际上,UMQID(Unique Message Queue ID)是 Steam 服务端在用户登录会话建立时分配的、具有时序性与唯一性的 64 位整数(通常以字符串形式返回),它用于保障消息投递的幂等性与客户端-服务端状态同步。
✅ 正确获取方式:调用 Logon 接口
Steam 官方并未公开 UMQID 的生成算法,但其实际来源非常明确:所有合法的 Steam Web Chat 会话都必须先完成 OAuth 登录流程,而 UMQID 就包含在 ISteamWebUserPresenceOAuth/Logon/v0001 的成功响应中。
参考开源实现(如 geothermal)可知,典型流程如下:
-
使用有效的 access_token 向以下地址发起 POST 请求:
POST https://api.steampowered.com/ISteamWebUserPresenceOAuth/Logon/v0001/
-
请求体(URL-encoded)需包含:
- access_token(已获取的 OAuth token)
- format=json
-
成功响应示例(精简):
{ "response": { "umqid": "6271781725479270872", "client_id": "webchat", "server_time": 1717234567, "persona_state": 3, "steamid": "76561198208696745" } }
✅ 关键点:response.umqid 字段即为后续所有 Message/v0001 请求所需的 umqid 值。
? Go 实现示例(关键片段)
type LogonResponse struct {
Response struct {
UMQID string `json:"umqid"`
} `json:"response"`
}
func getUMQID(accessToken string) (string, error) {
data := url.Values{}
data.Set("access_token", accessToken)
data.Set("format", "json")
resp, err := http.PostForm(
"https://api.steampowered.com/ISteamWebUserPresenceOAuth/Logon/v0001/",
data,
)
if err != nil {
return "", err
}
defer resp.Body.Close()
var lr LogonResponse
if err := json.NewDecoder(resp.Body).Decode(&lr); err != nil {
return "", fmt.Errorf("failed to decode logon response: %w", err)
}
if lr.Response.UMQID == "" {
return "", fmt.Errorf("UMQID not found in logon response")
}
return lr.Response.UMQID, nil
}⚠️ 注意事项
- UMQID 具有时效性与会话绑定性:每次 Logon 调用会返回新的 umqid;若长期未发消息或会话过期(通常数小时),再次发送前需重新调用 Logon 刷新。
- 不可复用或硬编码:即使同一账号,不同登录请求返回的 umqid 必然不同;硬编码将导致 400 Bad Request 或 401 Unauthorized。
- 依赖完整 OAuth 流程:确保 access_token 已通过 Steam OpenID Connect 或 Mobile App Auth 正确获取,且具备 chat:write 权限(通常 read_profile + chat scope 即可)。
- 避免高频调用 Logon:该接口非幂等设计,频繁调用可能触发风控;建议缓存 umqid 并在发送失败(如 invalid_umqid 错误)时再刷新。
✅ 总结
UMQID 不是客户端生成的随机数,而是 Steam 服务端颁发的会话级消息序列凭证。正确路径只有一条:先完成 OAuth 登录(Logon),从中提取 umqid,再将其用于后续所有聊天消息请求。跳过 Logon 步骤、逆向分析前端 JS 或尝试模拟生成,均不可靠且易失效。遵循官方隐式协议,才能稳定接入 Steam Web Chat 生态。


















