spzac主题免费版默认就支持获取QQ头像,而且很久之前“狗花”说这个头像获取泄露他Q了,我一直懒癌发作没有修正这个问题,前两天修好了,分享出来。
2023.06.05 修复接口修改导致的无法获取 QQ 头像
原理
原来的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/'); ?>
看看
看看
看看
这个咋加呀,没有效果
感谢老哥!
现在要用两个参数 一个是k还一个是kti 不然会报400错误
我没更新过,也能获取你的qq头像啊,不是还能用嘛