导航菜单
登录 注册

spzac主题免费版默认就支持获取QQ头像,而且很久之前“狗花”说这个头像获取泄露他Q了,我一直懒癌发作没有修正这个问题,前两天修好了,分享出来。

原理

原来的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=后面的可以忽略})

通过substr获取k值就行

代码

把下面的代码放到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里就可以调用了。

/**
 * 获取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);
    
    // 非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;
    if (empty($matches['1']['0'])) {
        return $url;
    } else {
        $qqNum = $matches['1']['0'];
        
        // 创建目录 存放到主题目录/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(sprintf('https://q%d.qlogo.cn/headimg_dl?dst_uin=%s&spec=100',  rand(1, 4), $qqNum));
            if (strlen($content)) {
                @file_put_contents($filePath, $content);
            }
            if (!file_exists($filePath)) {
                return str_replace($gravatarOptions->prefix, 'https://cravatar.cn/avatar/', $url);
            }
        }
        
        $url = Helper::options()->themeUrl . '/cache/avatar/' . $fileName;
    }
    return $url;
}

调用方式

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

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

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

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

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

<?php echo gravatarUrl(邮箱地址, 'prefix=https://gravatar.loli.net/avatar/'); ?>
Typecho 华为云存储插件 ObsUpload
上一篇
Lanstar:三栏简约模板
下一篇
广告

精选留言

已有 32 条评论

  1. 梦仙
    广东省

    测试一下回复可见smile

  2. dyt5AAUI
    浙江省

    测试一下回复可见

  3. eking
    北京市

    测试一下

  4. afa
    吉林省

    看看看

  5. 对对对
    河北省

    的点点滴滴多多多多多多多

  6. Jethro
    福建省

    感谢分享!

  7. dj360729
    广东省

    测试一下回复可见

  8. Q
    山东省

    吆西,有是一个不错的代码

  9. cake
    山西省

    ye测试

  10. bocai
    陕西省

    小白想问具体放在functions.php的哪个位置