Typecho实现QQ邮箱识别生成头像地址

 typecho调用QQ头像,但是不修改任何核心文件。最近写主题,就顺便研究了一下,这个功能其实很早就想过,比如在会员中心新增QQ的字段而已,但是我发现这样会不可避免的修改typecho的内核,那就和网上给出的修改内核实现的QQ头像方案相同了,这是绝对不行的。所以我想到了另一种方案,那就是对用户的邮箱进行识别,提取出QQ号,但是对非QQ头像的,则显示Gravatar头像库头像。

走着

1.首先,我准备好了两个接口,一个是QQ头像的,一个是Gravatar国内源,它们的调用方式如下。

QQ头像: http://q1.qlogo.cn/g?b=qq&nk=QQ号&s=100
Gravatar头像: http://cdn.v2ex.com/gravatar/md5加密后的邮箱?s=100

 以上就是两个头像接口的信息,值得注意的是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的参数则是用户可以自己在模板里面控制的,所以这里省略。

2024年6月12日更新

 上面的调用方法忽略了一个问题,就是当别人使用英文QQ邮箱时,例如: aimiaomiao@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

2024年10月12日更新

 此方法实际使用貌似会影响效率,实测加载比较慢,于是就研究了下,得出第二种方法,获取HTTP请求所发送的标头的数组,不用读入整个文件不会影响效率。
通过QQ邮箱显示获取头像,不暴露QQ号

function Authorimg($email)
{
    $a='cdn.v2ex.com/gravatar';//gravatar头像源
    $b=str_replace('@qq.com','',$email);
    if(stristr($email,'@qq.com')&&is_numeric($b)&&strlen($b)<11&&strlen($b)>4){
        $nk = 'https://s.p.qq.com/pub/get_face?img_type=3&uin='.$b;
        $c = get_headers($nk, true);
        $d = $c['Location'];
        $q = json_encode($d);
        $k = explode("&k=",$q)[1];
        echo 'https://q.qlogo.cn/g?b=qq&k='.$k.'&s=100';
    }else{
        $email= md5($email);
        echo 'https://'.$a.'/'.$email.'?';
    }
}

使用方法:

<?php Authorimg($comments->mail); ?>

参考文章:https://www.ruletree.club/archives/1566/

打赏
评论区
头像