接口 - 获取 QQ 头像图片地址(附加密)
最近冲浪的时候发现老接口无法正确拿到 k 值,因此有了此文章。
参数说明
参数 | 描述 |
---|---|
{$uin} | QQ 号 |
{$k} | 替代 QQ 号标识 |
{$kti} | 不知道啥玩意儿 |
{$size} | 头像尺寸 |
{$size_type} | 头像尺寸格式 |
{$timestamp} | 时间戳 |
{$uin}
用户的 QQ 号或者 QQ 群号,5-10 位的数字
if (preg_match('/\b([\d]{5,10})\b/', $key, $matches)) {
$uin = $matches[1];
$key = 'type-uin';
}
{$k} 和 {$kit}
{$k} 相当于是 QQ 号的另一种标识,通过 QQ 号拿到 {$k} 就可以拿到没有 QQ 号的用户头像链接。
以前的获取方式是通过下面的链接,但是目前已经失效了:
http://ptlogin2.qq.com/getface?&imgtype=1&uin={$uin}
目前测试发现可以通过下面的链接重定向至没有 QQ 号的用户头像链接,该链接中就包含需要的 {$k} 和 {$kit} 信息:
https://s.p.qq.com/pub/get_face?img_type={$size_type}&uin={$uin}
下面是一个示例:
function avatarQQKey($uin) {
if (preg_match('/^\d{5,10}$/', $uin) === 1) {
$headers = get_headers("https://s.p.qq.com/pub/get_face?img_type=3&uin={$uin}", 1);
if (isset($headers['Location'])) {
if (is_array($headers['Location'])) {
$Location = end($headers['Location']);
} else {
$Location = $headers['Location'];
}
$parsedUrl = parse_url($Location);
if (isset($parsedUrl['query'])) {
parse_str($parsedUrl['query'], $query);
if (!isset($query['k']) || !empty($query['k'])) {
$data = [];
$data = array(
'k' => $query['k'],
'kti'=> isset($query['kti']) ? $query['kti'] : null
);
}
}
}
}
if (!isset($data) || empty($data)) {
$data = false;
}
return $data;
}
{$size}
位于官方接口中 &spec=
或 &spec=
后,都是指定头像尺寸大小,可选值:0
、40
、100
、160
、640
,值为 0
时可能是头像的实际大小,一般情况会比 640
更大。部分接口头像尺寸。也可以填写 350
,但多数情况下会失败。下面是一个处理头像大小的示例:
function avatarSizeQQ($size= 100) {
if ($size <= 40) {
$size = 40;
} elseif ($size <= 100) {
$size = 100;
} elseif ($size <= 160 || $size < 350) {
$size = 160;
} elseif ($size = 350) {
$size = 350;
} elseif ($size <= 640) {
$size = 640;
} else {
$size = 0;
}
return $size;
}
{$size_type}
获取到的头像尺寸大小,可选值:0/1/2/3/4/5,大致对应 {$size} 的 0/40/40-41*/100/140*-160/640,权重比 {$size} 的要低。
{$timestamp}
当前的 UNIX 时间戳:
$timestamp = time();
用户显式头像
$Url = "https://s.p.qq.com/pub/get_face?img_type={$size_type}&uin={$uin}&s={$size}&t={$timestamp}";
// q[i].qlogo.cn [i] = NULL/1/2/3/4
$Url = "https://q.qlogo.cn/g?b=qq&nk={$uin}&s={$size}&t={$timestamp}";
// q[i].qlogo.cn [i] = NULL/1/2/3/4
$Url = "https://q.qlogo.cn/headimg_dl?dst_uin={$uin}&s={$size}&t={$timestamp}";
$Url = "https://q.qlogo.cn/headimg_dl?dst_uin={$uin}&s={$size_type}&t={$timestamp}";
$Url = "https://q.qlogo.cn/headimg_dl?dst_uin={$uin}&img_type={$size_type}&t={$timestamp}";
// qlogo[i].store.qq.com [i] = NULL/1/2/3/4
$Url = "https://qlogo.store.qq.com/qzone/{$uin}/{$uin}/{$size}?{$timestamp}";
用户隐式头像
// 注意:该方式随时会被废弃
$Url = "https://thirdqq.qlogo.cn/g?b=oidb&k={$k}&s={$size}&t={$timestamp}";
$Url = "https://thirdqq.qlogo.cn/g?b=sdk&k={$k}&kti={$kti}&s={$size}&t={$timestamp}";
QQ 群显式头像
$Url = "http://p.qlogo.cn/gh/{$uin}/{$uin}/{$size}/?t={$timestamp}";
后记
【QQ互联】头像系统架构优化调整通知 将对第三方获取 QQ 头像接口进行调整,获取隐式头像链接需要用户授权,并固定为授权时的图片;历史头像被删除后链接即失效,返回默认企鹅图;用户更新头像时将产生新的链接,获取需要重新授权。
调整时间:预计从 2023 年 11 月 14 日开始逐步灰度
基于此原因本文部分内容随时失效,仅保证发文时可用。