前言

这篇文章诞生之前,特别感谢博友 小李同学的提醒

收到建议,我便开始搜寻加密评论区用户头像的方法

摸爬滚打总算是解决了,同时也把方法分享给其他有需要的朋友

寻找方法

谷歌了一下其他大佬的解决方法,规则之树大佬提供了两个方法

参考资料:https://www.ruletree.club/archives/1566/

1.第一种则是获取json数据进行分割得出k值再进行重组

function Authorimg($email)
{
    $a='cdn.v2ex.com/gravatar';//gravatar头像源
    $b=str_replace('@qq.com','',$email);//替换qq邮箱
    if(stristr($email,'@qq.com')&&is_numeric($b)&&strlen($b)<11&&strlen($b)>4){
        $nk = 'http://ptlogin2.qq.com/getface?&imgtype=1&uin='.$b;//qq头像api
        $q = file_get_contents($nk);//读入文件
        $q = json_encode($nk);//编码json
        $k = explode("&k=",$q)[1];//分割出k值
        echo 'https://q.qlogo.cn/g?b=qq&k='.$k.'&s=100';//重组
    }else{
        $email= md5($email);
        echo 'https://'.$a.'/'.$email.'?';
    }
}

2.第二种获取HTTP请求所发送的标头的数组,不用读入整个文件不会影响效率

  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.'?';
        }
    }

预装主题之后,确实可以实现,但是介于自己的Amigo朋友圈主题模版首页样式需要加载很多评论头像

使用这两个方法,加载首页的时间就很长了

一个头像需要花费一秒的时间,如果首页的头像较多,这个问题将会是致命的

可能加载一个首页就需要长达一分钟两分钟的时间将评论头像全部加载出来,对于博友的访问体验是大打折扣的

再寻他法

因为自己的Gravatar头像源一直使用的是,cravatar的源,于是去cravatar官网去碰碰运气

在官网的开发文档看到了这句话,于是灵感油然而生

Cravatar 完美兼容所有 Gravatar 头像 API 接口,同时如果你未在 Cravatar 设置头像,则会先尝试调用 Gravatar 上的头像数据,其后是 QQ 头像,最后会返回我们为你准备的一组默认头像

这句话简单讲述的是cravatar会首先查询你的邮箱,是否有注册Gravatar头像

如果没有就返回其QQ头像,如果也不是QQ邮箱则返回cravatar的默认头像

那么,反过来想,我们是否可以将QQ邮箱通过cravatar来处理,从而达到加密QQ用户头像呢?

经过亲自检验,是可以的,cravatar的头像链接显示格式是这样的

https://cravatar.cn/avatar/HASH

其中 HASH 部分是你的电子邮箱的哈希值,此电子邮箱必须在 Cravatar.cn 上注册并绑定头像

否则会尝试返回 Gravatar 头像和 QQ 头像,如果都不存在,则返回默认头像

那么我们只需要将取到的邮箱值,通过php加密一下,可恶,没有系统学习过php

不过还好,自己有过js基础,编程语言总是万变不离其宗,所以一番折腾还是写出来了

这里主要用到PHP strtolower() 函数和 md5()函数

大致思路

将获取的email的值,判断是否为QQ邮箱还是域名邮箱,如果是域名邮箱则直接加密然后返回值

如果是QQ邮箱,则通过strtolower() 函数进行转换为小写,再md5加密,然后返回头像

代码展示

因为是小白,可能写的有些问题

function Authorimg($email)
{
    $a='cravatar.cn/avatar';//gravatar头像源
    $b=str_replace('@qq.com','',$email);
    if(stristr($email,'@qq.com')&&is_numeric($b)&&strlen($b)<11&&strlen($b)>4){
        $address = strtolower( trim( $email ) );
        $hash    = md5( $address );
        $qqimgurl = 'https://cravatar.cn/avatar/' . $hash;
        return $qqimgurl;
    }else{
        $email= md5($email);
        $avatarimgurl = 'https://'.$a.'/'.$email.'?';
        return $avatarimgurl;
    }
}

这样只需要在前端引用一下就好了

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

这样QQ用户头像加密功能,就实现了

pigeon主题用户

如果你是pigeon主题用户,可以直接下载下面链接的feature.php文件

https://cloud.usj.cc/d/Onedrive/%E4%BB%A3%E7%A0%81/feature.php

然后进入你的主题文件,找到 /libs/feature.php文件直接覆盖替换即可

Twitter主题用户

如果你是Twitter用户,直接在主题目录的function.php的第47行的位置将 Yoniu:取Gravatar头像 部分的代码替换到如下代码

//Yoniu:取Gravatar头像
function getGravatar($email, $s = 40, $d = 'mm', $g = 'g') {
	if(preg_match('|^[1-9]\d{4,11}@qq\.com$|i',$email)){
		$address = strtolower( trim( $email ) );
        $hash    = md5( $address );
        $qqimgurl = 'https://cravatar.cn/avatar/' . $hash;
        return $qqimgurl;
	}else{
		$hash = md5($email);
		$option = Typecho_Widget::widget('Widget_Options');
		if($option->gravatarURL){
			$avatar = $option->gravatarURL."/$hash?s=&d=$d&r=$g";
		}else{
			$avatar = "//gravatar.com/avatar/$hash?s=&d=$d&r=$g";
		}
		return $avatar;
	}
}

这样就可以了