原理

原来的QQ头像获取链接是

https://s.p.qq.com/pub/get_face?img_type=3&uin=扣扣号

最近发现可以通过这个链接来获取QQ头像

https://q1.qlogo.cn/g?b=qq&k=k值&s=100

k值怎么获取呢?

http://ptlogin2.qq.com/getface?&imgtype=1&uin=扣扣号

你会发现格式

Header({"扣扣号":"https://thirdqq.qlogo.cn/g?b=sdk&k=k值&s=后面的可以忽略})

代码

把下面的代码放到functions.php就可以根据QQ号获取不带QQ号的头像链接。

function getQQAvatar($qqNum) {
    $str = @file_get_contents("http://ptlogin2.qq.com/getface?&imgtype=1&uin=$qqNum");
    $start = strpos($str, '&k=') + 3;
    $end = strpos($str, '&s=');
    $k = substr($str, $start , $end - $start);
    return 'https://q1.qlogo.cn/g?b=qq&k='.$k.'&s=100';
}

速度改进

然而这两台天我发现获取这个K值非常慢,整体拖慢网页速度,所以决定把头像缓存开起来。

思路

把头像文件存成md5(qq号).jpg
每次请求头像时先判断文件存在不
如果不存在,下载下来。
如果存在,判断是否超过一定时间了(30天),如果是刷新缓存。
这样的话只有吃螃蟹的人会影响浏览体验(PS:可以在别人写QQ邮箱的时候就ajax请求缓存起来,这样就完全没有割裂感)。

完整代码

这里直接给出完整代码吧,把下面的代码放到functions.php里就可以调用了。

/**
 * 根据QQ号获取头像链接
 *
 * @param mixed $qqNum
 * @date 2020-06-08
 */
function getQQAvatar($qqNum) {
    $str = @file_get_contents("http://ptlogin2.qq.com/getface?&imgtype=1&uin=$qqNum");
    $start = strpos($str, '&k=') + 3;
    $end = strpos($str, '&s=');
    $k = substr($str, $start , $end - $start);
    return 'https://q1.qlogo.cn/g?b=qq&k='.$k.'&s=100';
}
/**
 * 获取gravatar头像地址
 *
 * @param String $mail 邮箱地址
 * @param mixed $gravatarOptions 配置
 * @return String
 * @date 2020-09-02
 */
function gravatarUrl($mail = null, $gravatarOptions = null)
{
    $gravatarOptions = Typecho_Config::factory($gravatarOptions);
    $gravatarOptions->setDefault(array(
        'prefix' => 'https://cdn.v2ex.com/gravatar/',
        'size' => '32',
        'rating' => Helper::options()->commentsAvatarRating, // 头像分级
        'default' => 'mp', // Gravatar没有头像时的默认头像
    ), false);
    
    $url = '';
    
    preg_match_all('/((\d)*)@qq.com/', $mail, $matches);
    if (empty($matches['1']['0'])) {
        // 非QQ邮箱
        if (!empty($gravatarOptions->prefix)) {
            $url = $gravatarOptions->prefix;
        } else if (defined('__TYPECHO_GRAVATAR_PREFIX__')) {
            $url = __TYPECHO_GRAVATAR_PREFIX__;
        }
        if (!empty($mail)) {
            $url .= md5(strtolower(trim($mail)));
        }
        $url .= '?s=' . $gravatarOptions->size;
        $url .= '&r=' . $gravatarOptions->rating;
        $url .= '&d=' . $gravatarOptions->default;
    } else {
        $qqNum = $matches['1']['0'];
        
        $qqAvatar = getQQAvatar($qqNum);
        
        // 创建目录 存放到主题目录/cache/avatar下
        $directory = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'cache' . DIRECTORY_SEPARATOR . 'avatar';
        if (!file_exists($directory)) {
            mkdir($directory, '0755', true);
        }
        
        // 拼接文件名和路径
        $fileName = md5($qqNum) . ".jpg";
        $filePath = $directory . DIRECTORY_SEPARATOR . $fileName;
        
        // 文件不存在或者超过30天都要下载
        $updateFlag = false;
        if (!file_exists($filePath)) {
            $updateFlag = true;
        } elseif (((filectime($filePath) - Helper::options()->gmtTime) / 3600 / 24) > 30) {
            $updateFlag = true;
        }

        if ($updateFlag) {
            // 下载头像
            $content = file_get_contents($qqAvatar);
            if (strlen($content)) {
                @file_put_contents($filePath, $content);
            }
            if (!file_exists($filePath)) {
                // 如果下载失败(网络异常,没有权限写),直接返回链接
                return $qqAvatar;
            }
        }
        
        $url = Helper::options()->themeUrl . '/cache/avatar/' . $fileName;
    }
    return $url;
}

调用方式

把下面的代码放到需要调用的地方

<?php gravatarUrl(邮箱地址); ?>

如果需要修改头像大小(QQ头像不支持)

<?php gravatarUrl(邮箱地址, 'size=64'); ?>

如果需要更换 Gravatar CDN 地址(别忘了/结尾)

<?php gravatarUrl(邮箱地址, 'prefix=https://gravatar.loli.net/avatar/'); ?>
本篇来自 Ryan,如有侵权请告知,本站将及时予与删除并致以最深的歉意~~
暂无评论
欢迎您,新朋友,感谢参与互动~

选择表情
  • 一起走过的日子 - 刘德华
  • 情书 - 张学友
  • 后会无期 - G.E.M.邓紫棋
  • 清白之年 (Live) - 朴树
  • My Love (Radio Edit) - Westlife