近来看到很多站点的评论都可以在用户输入 QQ 邮箱时自动获取其 QQ 头像来替代默认的 Gra­vatar头像,这样方便了很多没有时间自定义 Gra­vatar 头像的人,我觉得很有意义。
2020.3.19 修改了第一种方法的接口使调用的 QQ 头像地址不再暴露用户 QQ 号码,请诸位放心使用 QQ 快速评论。 使用新的无隐私接口(我自己给接口起的名 )需要服务器支持 curl 拓展,代码中使用了 curl 相关方法处理 API 接口的数据。

操作

修改 Type­cho 目录下 /var/Typecho 文件夹下 common.php 文件,932 行,关于获取 Gra­vatar 头像的代码:

public static function gravatarUrl($mail, $size, $rating, $default, $isSecure = false)
    {
        if (defined('__TYPECHO_GRAVATAR_PREFIX__')) {
            $url = __TYPECHO_GRAVATAR_PREFIX__;
        } else {
            $url = $isSecure ? 'https://secure.gravatar.com' : 'http://www.gravatar.com';
            $url .= '/avatar/';
        }
        if (!empty($mail)) {
            $url .= md5(strtolower(trim($mail)));
        }
        $url .= '?s=' . $size;
        $url .= '&r=' . $rating;
        $url .= '&d=' . $default;
        return $url;
    }

 

修改为:

public static function gravatarUrl($mail, $size, $rating, $default, $isSecure = false)
    {
            $reg = "/^\d{5,10}@[qQ][Qq]\.(com)$/";
            if (preg_match($reg, $mail)) {
                // $img    = explode("@", $mail);
                // $url = "//q2.qlogo.cn/headimg_dl?dst_uin={$img[0]}&spec=100";
                $object = explode("@", $mail)[0];
                $apiurl = "https://ptlogin2.qq.com/getface?appid=1006102&uin=" . $object . "&imgtype=3";
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $apiurl);
                curl_setopt($ch, CURLOPT_HEADER, 0);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_TIMEOUT, 10);
                $data = curl_exec($ch);
                curl_close($ch);
                $avatar = $data;
                $pattern2 = '/pt.setHeader\((.*)\)/is';
                preg_match($pattern2, $avatar, $result2);
                $url = json_decode($result2[1], true)["$object"];
            } else {
                if (defined('__TYPECHO_GRAVATAR_PREFIX__')) {
                    $url = __TYPECHO_GRAVATAR_PREFIX__;
                } else {
                    $url = $isSecure ? 'https://secure.gravatar.com' : 'http://www.gravatar.com';
                    $url .= '/avatar/';
                }
                if (!empty($mail)) {
                    $url .= md5(strtolower(trim($mail)));
                }
                $url .= '?s=' . $size;
                $url .= '&r=' . $rating;
                $url .= '&d=' . $default;
            }
            return $url;
    }

 

效果

  • 输入 QQ 邮箱,调用 QQ 头像
  • 输入普通邮箱,调用 Gravatar 头像

修改后,原版获取头像地址会暴露 QQ 号码的问题就解决。
效果可以看我评论的头像地址