QQ信息API实战:从号码校验到头像直链的分层接入设计

QQ信息API实战:从号码校验到头像直链的分层接入设计

适用场景:把 QQ 号变成可展示的用户信息

在很多社区、内部工具或客服后台里,用户会直接粘贴一串 QQ 号,比如88888888。运营同学需要看到这个号码对应的昵称、头像、邮箱和空间链接,以便快速识别身份。手动打开腾讯相关页面逐个查询效率很低,而且头像要适配列表、详情页、放大图等不同尺寸,切图维护复杂度也不小。

QQ 信息接口解决的就是这个需求:输入一个 5-11 位纯数字 QQ 号,返回昵称、QQ 邮箱、QQ 空间链接,以及四个固定尺寸的头像直链 URL。前端拿到data.avatars对象后,直接用s40做列表缩略图、s100做评论头像、s140做详情页主图、s640做原图预览,不需要自己裁剪和存储。

接口能力边界

在接入前先明确该接口能做什么、不能做什么,避免后续返工。

能力说明
查询内容昵称、QQ 邮箱、QQ 空间链接、四个尺寸头像直链
号码校验严格 5-11 位纯数字,防上游字符串截断引起号码错位
结果判定返回is_found字段区分是否查询到用户
编码处理上游输出 GBK 含中文昵称时自动转 UTF-8
流量限制QPS 10 / s,超出后需要排队或退避

接口不支持传入非纯数字参数,也不支持批量查询。如果需要处理多个 QQ 号,需要调用方自行做循环和并发控制。

请求参数与鉴权

Query 参数

参数类型必填说明
qqstring5-11 位 QQ 号码,纯数字

请求地址为:

https://v1.apizero.cn/api/qq?qq=88888888

Header 参数

参数类型必填说明
AuthorizationstringAPI Key 鉴权头,格式Bearer sk_live_xxx;匿名调用时可省略

文档提供的 curl 示例中使用的是X-API-Key头,两种方式请以最终文档页为准。开发环境下先用匿名方式调试,上线前再把 Key 注入到环境变量中。

可复制的 curl 示例

最简单的一次请求如下:

curl -sS \ -X GET \ -H "X-API-Key: $APIZERO_API_KEY" \ "https://v1.apizero.cn/api/qq?qq=10001"

如果使用 Authorization 头,等价写法为:

curl -sS \ -X GET \ -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxx" \ "https://v1.apizero.cn/api/qq?qq=10001"

响应是 JSON 数组结构,第一个元素包含业务状态和内容。为了便于在 shell 里快速看结果,可以接jq

curl -sS \ -X GET \ -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxx" \ "https://v1.apizero.cn/api/qq?qq=10001" | jq '.[0].example.data'

返回字段详解

以文档中的成功响应为例:

[ { "content_type": "application/json", "description": "成功", "example": { "code": 0, "data": { "avatars": { "s100": "https://q1.qlogo.cn/g?b=qq&nk=88888888&s=100", "s140": "https://q1.qlogo.cn/g?b=qq&nk=88888888&s=140", "s40": "https://q1.qlogo.cn/g?b=qq&nk=88888888&s=40", "s640": "https://q1.qlogo.cn/g?b=qq&nk=88888888&s=640" }, "is_found": true, "mail": "88888888@qq.com", "name": "腾讯客服", "qq": "88888888", "qzone": "https://user.qzone.qq.com/88888888" }, "msg": "成功", "request_id": "abc123def456" }, "status": "200" } ]

核心字段说明如下:

字段类型含义
codenumber业务状态码,0 表示成功
msgstring状态描述
request_idstring请求唯一标识,可用于日志追踪
data.qqstring回显的 QQ 号
data.namestring查询到的昵称,可能为 null
data.mailstring对应 QQ 邮箱
data.qzonestringQQ 空间链接
data.is_foundboolean是否成功查询到用户
data.avatarsobject四个尺寸的头像直链 URL

注意is_found才是判断查询是否成功的关键。当号码未准备或未开放展示时,namemail等字段可能缺失,但接口仍可能返回 HTTP 200,所以业务代码里不能只检查code

常见错误与排查思路

1. QQ 号位数不对

接口要求 5-11 位纯数字。如果用户输入1234123456789012,建议在调用前置校验并直接提示,避免把无效请求发到上游。

2. 返回结果中is_found为 false

一种情况是号码确实不存在,另一种情况是安全增强机制生效:上游返回的 QQ key 与请求不一致时,接口会视为未查询到。此时应优先检查请求参数是否被 URL 编码或中间层改写。

3. 昵称乱码

腾讯历史接口在部分场景下输出 GBK 编码,接口已做自动转 UTF-8 兜底。若发现个别昵称仍异常,先确认返回的content_type是否被网关改写,再检查自己是否对响应做了二次解码。

4. 鉴权失败

检查 Header 名称和值格式。Bearer后必须有一个空格,Key 不能包含换行符。匿名调用有限额,超出后需要配置 API Key。

5. 频率超限

QPS 为 10 / s,批量场景下建议把并发数压到 5 以下,并加入指数退避重试,避免瞬间打满。

工程化注意事项

这一节重点说接入生产系统时的几个细节问题。

前置参数校验

虽然接口本身做了严格校验,但提前在应用层拦截无效输入可以减少无谓的网络开销。推荐用正则:

fn is_valid_qq(s: &str) -> bool { let len = s.len(); len >= 5 && len <= 11 && s.chars().all(|c| c.is_ascii_digit()) }

对于 Rust/Go/Node 不同后端,重点是判断长度后逐字节确认纯数字,避免01234这类带前导零的字符串被整型转换吞掉。

头像 URL 直接透传还是二次存储

avatars返回的是腾讯 CDN 直链,可以直接放到<img src>里。建议前端做错误兜底:

<img src="" >qq=10001 request_id=abc123def456 code=0 is_found=true cost_ms=42

这样可以快速定位是业务侧参数问题、上游超时还是鉴权失效。

错误响应兼容

上游可能出现两种响应形态:正常是portraitCallBack(...),异常是_Callback({error:...})。接口已经自动识别并归一化,调用方无需处理。但如果通过全链路压测观察异常率,建议关注status字段为 200 但code非 0 的响应,这类不会触发 HTTP 层告警。

参考文档

  • 接口文档:https://apizero.cn/aidocs/qq
  • 原始 Markdown:https://apizero.cn/aidocs/qq/raw.md