Typecho 获取|下载|保存远程文件|图片、评论显示 QQ 头像方法教程

小助手读文章 00:00 / 00:00

以评论头像为例,魔改版主题优先获取 QQ 头像,但是直接通过链接显示头像,虽然可以提升加载速度,但会泄露评论者的 QQ,故需采取将头像下载到本地,然后以本地资源显示,主要代码如下:

/**
 * 头像:先QQ、再 gravatar、最后是默认的
 *
 */
function avatar( $email) {
    $switchav = Helper::options()->qqavatar;
    if ( empty( Helper::options()->cacheTime ) ) {
        $ct = 2592000;
    } else {
        $ct = Helper::options()->cacheTime;
    }
    
    $size = '32'; //大小
    $emaill = strtolower(trim($email));
    $hash = md5($emaill);
    $ext = '.jpg';
    $filename = $hash.$ext;
    $save_dir = Typecho_Widget::widget('Widget_Options')->themeUrl.'/img/avatarcache/';
    $base_dir = parse_url($save_dir,PHP_URL_PATH);
  
    if (file_exists($_SERVER['DOCUMENT_ROOT'].'/'.$base_dir.$filename) &&  (time() - filemtime($_SERVER['DOCUMENT_ROOT'].'/'.$base_dir.$filename)) < $ct){
         $save_dir_x=parse_url($save_dir,PHP_URL_PATH);  //取相对路径
         return  $save_dir_x.$filename;
     }else  if($switchav ='1' && strpos($emaill, '@qq.com') !== false){
         $qmail = explode("@",$emaill);
         $qqhao = $qmail[0];
         $qqimg  = 'http://q.qlogo.cn/headimg_dl?dst_uin='.$qqhao.'&spec=100';
         $imgurl = get_remote_file($filename,$qqimg,$save_dir);
         if ($imgurl){
          $imgurl = parse_url($imgurl,PHP_URL_PATH);
          sleep(2);
          return  $imgurl;
         }
         else {
            $imgurl = get_avatar($filename,$hash,$size,$save_dir);
            sleep(2);
            return parse_url($imgurl,PHP_URL_PATH);
         }
     } else{
            $imgurl = get_avatar($filename,$hash,$size,$save_dir); 
            sleep(2);
              return parse_url($imgurl,PHP_URL_PATH);
      }
}

/**
* Avatar 头像
* 
*/
function get_avatar($filename,$hash,$size,$save_dir){
    $default = Helper::options()->defaultavatar;
    $realurl = Helper::options()->siteUrl;
    $default = fullurl($default,$realurl);
  
    $host = 'http://secure.gravatar.com/avatar/';  //CDN 目录
    $rating = Helper::options()->commentsAvatarRating;
    $avatarurl = $host . $hash . '?s=' . $size . '&r=' . $rating . '&d';
    $avatartest = $host . $hash .'?d=404';
  
   $test = get_headers($avatartest);
   if ($test[0] == 'HTTP/1.1 200 OK') { 
     $imgurl = get_remote_file($filename,$avatarurl,$save_dir);
     return $imgurl;
   } else { 
     $base_dir = parse_url($save_dir,PHP_URL_PATH);
     $cacheimg = $_SERVER['DOCUMENT_ROOT'].'/'.$base_dir.$filename;
     copy($default,$cacheimg); //避免开一次页面就重新执行一次;
     if (true) {
       return $cacheimg; 
     } else{
       return 'copy failed'; 
     }
   } 
}

/**
* 下载远程文件
* 
*/
function get_remote_file($filename,$url,$save_dir){
     $ch=curl_init();  
     $timeout=3;  

     if(trim($save_dir)=='' || trim($filename)=='' || trim($url)==''){  
        return false;  
     } else {
       
     $base_dir = parse_url($save_dir,PHP_URL_PATH);
     set_time_limit (10);  
     $file = fopen($url, "rb"); 
     if ($file) {   
       $newf = fopen ($_SERVER['DOCUMENT_ROOT'].'/'.$base_dir.$filename, "wb");
       if ($newf) {
         while (!feof($file)) {  fwrite($newf, fread($file, 1024 * 8), 1024 * 8);  }  
       }
     }  
     if ($file) {  fclose($file); }  
     if ($newf) {  fclose($newf); }  
       
     if (true){   return $save_dir.$filename; } else{   return false; }   
     }
}

代码比较粗糙,但目的基本实现了,有更好方法的可以交流交流。


ArmxMod for Typecho
个性化、自适应、功能强大的响应式主题

推广

 继续浏览关于 下载教程typecho图片 的文章

 本文最后更新于 2018/09/17 09:57:38,可能因经年累月而与现状有所差异

 引用转载请注明:VirCloud's Blog > 建站 > Typecho 获取|下载|保存远程文件|图片、评论显示 QQ 头像方法教程

精选评论

  1. 怪狗

    保存不了远程图片哦。

    1. 欧文斯

      学方法,不能直接套用,要用需要根据你网站实际配置来修改

  2. 适合新手的靠谱**工具
    适合新手的靠谱**工具 回复

    感谢分享,支持一下。

  3. 今天不聊天

    不错!今天主题更新.......