typecho调用QQ头像,但是不修改任何核心文件。最近写主题,就顺便研究了一下,这个功能其实很早就想过,比如在会员中心新增QQ的字段而已,但是我发现这样会不可避免的修改typecho的内核,那就和网上给出的修改内核实现的QQ头像方案相同了,这是绝对不行的。所以我想到了另一种方案,那就是对用户的邮箱进行识别,提取出QQ号,但是对非QQ头像的,则显示Gravatar头像库头像。
开干
1.首先,我准备好了两个接口,一个是QQ头像的,一个是Gravatar国内源,它们的调用方式如下。
[greenbar]QQ头像 http://q1.qlogo.cn/g?b=qq&nk=QQ号&s=100
Gravatar头像 http://cdn.v2ex.com/gravatar/md5加密后的邮箱?s=100
[/greenbar]
以上就是两个头像接口的信息,值得注意的是Gravatar后面的s分辨率参数可以随意定义,而QQ不行,QQ只有几个有限的分辨率,比如100,200,640,其它的数字会报400错误,所以QQ的s参数更像是一种清晰度,宽高还是通过css定义比较好。
2.实现的主要方法,我在模板function.php里面定义,这等于完全舍弃系统的邮箱输出方法。
/** 对邮箱类型判定,并调用QQ头像的实现 */
function isqq($email){
if($email){
if(strpos($email,"@qq.com") !==false){
$email=str_replace('@qq.com','',$email);
echo "//q1.qlogo.cn/g?b=qq&nk=".$email."&";
}else{
$email= md5($email);
echo "//cdn.v2ex.com/gravatar/".$email."?";
}
}else{
echo "//cdn.v2ex.com/gravatar/null?";
}
}
上述代码就是通过isqq方法获取邮箱,并且判断是否为qq邮箱,是则截取qq的部分去和qq的接口组合,不是则md5加密该邮箱和gravatar头像库组合,而s的参数则是用户可以自己在模板里面控制的,所以这里省略。
2020年3月9日更新
上面的调用方法忽略了一个问题,就是当别人使用英文QQ邮箱时,例如:wert0814@qq.com
,就获取不到QQ号,而是一个字符串,这时候呢,就需要调用Gravatar头像了,如果还是没有Gravatar头像,那就使用默认头像。
更新后代码如下:
function isqq($email)
{
if ($email) {
if (strpos($email, "@qq.com") !== false) {
$email = str_replace('@qq.com', '', $email);
if(is_numeric($email)){
echo "//q1.qlogo.cn/g?b=qq&nk=" . $email . "&";
}else{
$mmail = $email.'@qq.com';
$email = md5($mmail);
echo "//cdn.v2ex.com/gravatar/" . $email . "?";
}
} else {
$email = md5($email);
echo "//cdn.v2ex.com/gravatar/" . $email . "?";
}
} else {
echo "//cdn.v2ex.com/gravatar/null?";
}
}
3.调用方式,也就是头像链接在不同模板中的调用方式。
文章列表及内容页作者头像
<?php isqq($this->author->mail); ?>s=100
评论列表用户头像
<?php isqq($comments->mail); ?>s=100
当前登录用户头像
<?php isqq($this->user->mail); ?>s=100
厉害了,完美解决
不错😌
厉害