MENU

接口 - 获取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= 后,都是指定头像尺寸大小,可选值:040100160640,值为 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 日开始逐步灰度

基于此原因本文部分内容随时失效,仅保证发文时可用。

返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码